是否可以使用enum而不关心?我尝试了以下
typedef enum reg [31:0] {
BLTZ = 32'b000001_?????_00000_????????????????,
BGEZ = 32'b000001_?????_00001_????????????????,
BEQ = 32'b000100_?????_?????_????????????????,
BNE = 32'b000101_?????_?????_????????????????,
.
.
.
然后使用doulos.com给出的语法,我尝试了以下内容,看看我是否能得到一个" ADD"要在波形查看器上显示的指令
op_mne_e op_mnemonic;
assign op_mnemonic = op_mne_e'(32'b000000_?????_?????_?????_?????_10000);
但我看到的是
000000zzzzzzzzzzzzzzzzzzzz10000
是否有可能为枚举类似于casez?
答案 0 :(得分:0)
我已经编辑了这个问题的标签,因为你问的是 System-Verilog ,而不是Verilog。我们所谓的Verilog现在是System-Verilog标准IEEE-1800的一个子集。
在System-Verilog中,枚举类型具有基础基类型。默认情况下,此类型为int
,这是一种2状态类型(每个位只能采用值0
或1
)。如果您愿意,可以指定其他基本类型。枚举类型的每个成员由基类型的不同值表示。
您已指定4状态,32位基本类型:reg [31:0]
*。这4个州是0
,1
,Z
(或?
)和X
。因此,枚举类型的每个成员都由4状态值表示,即0
,1
,Z
(或?
)和{{1}的某种组合}}。但是,当您使用"%b"显示值时格式说明符,这是你得到的:你得到基础的4状态值(使用X
s,而不是Z
s)。
http://www.edaplayground.com/x/3khr
在?
声明中,casez
或Z
表示不在乎。因此,如果您愿意,可以在?
语句中使用具有4状态基类型的enum
:
casez
但是,正如我们在这里说System-Verilog,为什么不使用 casez (op_mnemonic)
BLTZ : $display("BLTZ");
BGEZ : $display("BGEZ");
BEQ : $display("BEQ");
BNE : $display("BNE");
endcase
?
case ... inside
http://www.edaplayground.com/x/4g3J
case (op_mnemonic) inside
BLTZ : $display("BLTZ");
BGEZ : $display("BGEZ");
BEQ : $display("BEQ");
BNE : $display("BNE");
endcase
通常被认为比旧case ... inside
更安全,因为它展示了非对称通配符匹配。换句话说,与casez
不同,在casez
和case ... inside
或X
(或Z
)的测试表达式中?
在这种情况下)并不像一个不关心(但在分支表达中,当然)。
*在System-Verilog中更常见的是指定op_mnemonic
,它是相同的,但logic [31:0]
通常在System-Verilog中使用,而不是logic
。
答案 1 :(得分:0)
如果您希望在波形中显示枚举变量的标签,则需要设置基数以显示它。大多数工具默认以二进制显示。 SystemVerilog有许多运营商可以对待''作为一个不小心(casez
就是其中之一)所以'?'允许作为数字文字的一部分代替“'”。然而,那'?'立即转换为' z'而且你永远不会看到'?'打印出来。
如果您正在尝试为枚举值分配值并让它解码指令并选择匹配的标签,则无法正常工作。您需要循环枚举值并使用通配符等于运算符==?
来查找匹配项。
但是如果你只是为了在波形中得到一个标签,Modelsim / Questa有一个radix define
命令可以为你解码指令。