3

我使用parameter关键字来定义一个状态,即RESET= 5'b00000。如果我想用来$display打印状态名称而不是二进制表示,或者在我的模拟波形查看器中显示状态名称,我该怎么做?尝试将其打印为字符串(如您所料)是行不通的,所以我想知道这是否可以完成。

4

3 回答 3

3

我不知道一种自动$display命名parameter. 但是,如果您不介意复制代码,您可以创建一个task(or function) 来实现您的目标:

    task show_name_state;
        case (state)
            5'b00000: $display("RESET");
            5'b00001: $display("WAIT");
        endcase
    endtask

    $display(state); show_name_state();

我知道至少有一个(昂贵的)Verilog 调试器能够识别参数并在其波形查看器中自动显示它们的名称:Verdi(以前的 Debussy)nWave 工具可以做到这一点。

于 2010-02-20T23:54:47.770 回答
2

如果您的目标只是在模拟期间显示状态的名称,我通常会做类似的事情

`ifdef SIMULATION
reg [127:0] __state__;
case (state)
  STATE_1 : __state__ = "STATE_1";
  STATE_2 : __state__ = "STATE_2";
  default : __state__ = "error";
endcase
`endif


其中 state 是具有相关参数的状态寄存器。

于 2010-03-03T05:37:19.500 回答
1

可以有多个具有相同值的参数,因此通常不能从数值转到具有该值的参数名称。参数就像 C #defines;尽管您可以使用它们来定义一组状态,但变量和您用来表示可能状态的参数列表之间没有正式的关联。因为没有更好的选择,以前以这种方式(错误)使用参数是很常见的,但后来 SystemVerilog 引入了enum一种没有参数方法问题的类型。您没有提及您正在使用什么工具,但假设您的工具支持 SystemVerilog 枚举类型,那么这将是状态值的更好选择。

于 2010-02-20T17:10:19.117 回答