各種好用的 SystemVerilog 語法 (04) - typedef (enum)
上一回提及了 SystemVerilog 可以透過 typedef 提供了數個更好的語法讓我們可以寫 code 更整潔,本文進一步用 enum
語法提昇 SystemVerilog 可讀性。
繼續使用 MIPS instruction 當作例子,上一回提到 typedef
可以省下大量骯髒的 code。
1parameter MIPS_OPCODE_BIT = 6;
2typedef logic [MIPS_OPCODE_BIT-1:0] MipsOpcodeType;
3always_comb begin
4 op_is_beq = opcode == MipsOpcodeType'(4);
5end
然而在這個例子中,像是 opcode 這種東西,他其實是有好記憶的名稱 (mnemonic name) 的,像是 addi, andi, beq…,這種情形下,用 enum
會是個更好的選擇。
1parameter MIPS_OPCODE_BIT = 6;
2typedef enum logic [MIPS_OPCODE_BIT-1:0] {
3 MipsOpcodeType__beq = 4,
4 MipsOpcodeType__addi = 8,
5 MipsOpcodeType__andi = 12
6} MipsOpcodeType;
7
8always_comb begin
9 op_is_beq = opcode == MipsOpcodeType__beq;
10 op_is_beq = opcode == MipsOpcodeType'(4); // this still works
11end
這樣使用者就不需要記憶 beq 對應到的 opcode value 是 4
了,如果未來 opcode 定義有所變動,也無須修改程式碼。(另外,語法上沒有規定變數命名一定要兩個底線,純屬個人偏好。)
系列文連結
-
各種好用的 SystemVerilog 語法 (01) - logic
-
各種好用的 SystemVerilog 語法 (02) - always
-
各種好用的 SystemVerilog 語法 (03) - typedef (integer types)
-
各種好用的 SystemVerilog 語法 (04) - typedef (enum)
-
各種好用的 SystemVerilog 語法 (05) - typedef (struct)
-
各種好用的 SystemVerilog 語法 (06) - typedef (union)
-
各種好用的 SystemVerilog 語法 (07) - local variable
- 各種好用的 SystemVerilog 語法 (01) - logic
- 各種好用的 SystemVerilog 語法 (02) - always
- 各種好用的 SystemVerilog 語法 (03) - typedef (integer types)
- 各種好用的 SystemVerilog 語法 (04) - typedef (enum)
- 各種好用的 SystemVerilog 語法 (05) - typedef (struct)
- 各種好用的 SystemVerilog 語法 (06) - typedef (union)
- 各種好用的 SystemVerilog 語法 (07) - local variable