各種好用的 SystemVerilog 語法 (04) - typedef (enum)

Share on:

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

上一回提及了 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 定義有所變動,也無須修改程式碼。(另外,語法上沒有規定變數命名一定要兩個底線,純屬個人偏好。)