各種好用的 SystemVerilog 語法 (03) - typedef (integer types)

Share on:

本文內容採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.

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