各種好用的 SystemVerilog 語法 (03) - typedef (integer types)
Verilog 中我們的整數幾乎都是任意長度的,而 SystemVerilog 提供了數個更好的語法讓我們可以寫 code 更整潔。
我這邊使用 MIPS instruction 當作例子,如下圖,我們往往會需要 5, 6, 16, 26-bit… 種種不同寬度的整數。
在 verilog 中,我們會定義不同 bit 數量來參數化。
1parameter MIPS_INSTR_BIT = 32;
2parameter MIPS_OPCODE_BIT = 6;
3parameter MIPS_ADDR_BIT = 26;
以下這是一個教科書上很常見的展開 instruction 的方法:
1input logic [MIPS_INSTR_BIT-1:0] instr;
2logic [MIPS_OPCODE_BIT-1:0] opcode;
3logic [MIPS_ADDR_BIT-1:0] addr;
4assign {opcode, addr} = instr;
然而,到處出現的 MIPS_OPCODE_BIT
之類的字眼實在是很妨礙閱讀,我們可以經由 typedef
增加美觀性。
1typedef logic [MIPS_INSTR_BIT -1:0] MipsInstrType;
2typedef logic [MIPS_OPCODE_BIT-1:0] MipsOpcodeType;
3typedef logic [MIPS_ADDR_BIT -1:0] MipsAddrType;
以下這樣是不是美觀多了呢:
1input MipsInstrType instr;
2MipsOpcodeType opcode;
3MipsAddrType addr;
4assign {opcode, addr} = instr;
另外 typedef
還有一個很大的好處,就是可以允許 casting 的語法,因為 linting tool 往往要求 operator 兩邊的 bit 數量一樣,用 typedef
的 type 可以把整數整潔的 cast 到想要的 bit。
1always_comb begin
2 op_is_beq = opcode == 4; // warning
3 op_is_beq = opcode == MipsOpcodeType'(4); // good
4end
系列文連結
-
各種好用的 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