Verilog,使用enum而不关心

时间:2016-06-23 03:55:18

标签: enums typedef system-verilog

是否可以使用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?

2 个答案:

答案 0 :(得分:0)

我已经编辑了这个问题的标签,因为你问的是 System-Verilog ,而不是Verilog。我们所谓的Verilog现在是System-Verilog标准IEEE-1800的一个子集。

在System-Verilog中,枚举类型具有基础基类型。默认情况下,此类型为int,这是一种2状态类型(每个位只能采用值01)。如果您愿意,可以指定其他基本类型。枚举类型的每个成员由基类型的不同值表示。

您已指定4状态,32位基本类型:reg [31:0] *。这4个州是01Z(或?)和X。因此,枚举类型的每个成员都由4状态值表示,即01Z(或?)和{{1}的某种组合}}。但是,当您使用"%b"显示值时格式说明符,这是你得到的:你得到基础的4状态值(使用X s,而不是Z s)。

http://www.edaplayground.com/x/3khr

?声明中,casezZ表示不在乎。因此,如果您愿意,可以在?语句中使用具有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不同,在casezcase ... insideX(或Z)的测试表达式中?在这种情况下)并不像一个不关心(但在分支表达中,当然)。

*在System-Verilog中更常见的是指定op_mnemonic,它是相同的,但logic [31:0]通常在System-Verilog中使用,而不是logic

答案 1 :(得分:0)

如果您希望在波形中显示枚举变量的标签,则需要设置基数以显示它。大多数工具默认以二进制显示。 SystemVerilog有许多运营商可以对待''作为一个不小心(casez就是其中之一)所以'?'允许作为数字文字的一部分代替“'”。然而,那'?'立即转换为' z'而且你永远不会看到'?'打印出来。

如果您正在尝试为枚举值分配值并让它解码指令并选择匹配的标签,则无法正常工作。您需要循环枚举值并使用通配符等于运算符==?来查找匹配项。

但是如果你只是为了在波形中得到一个标签,Modelsim / Questa有一个radix define命令可以为你解码指令。