2010-02-20 210 views
2

我正在使用参数关键字来定义状态,即RESET = 5'b00000。如果我想使用$ display打印状态名称而不是二进制表示,或者在我的模拟波形查看器中显示状态名称,我该怎么做?它不工作,试图打印出一个字符串(如你所期望的),所以我想知道这是否可以完成。使用Verilog参数关键字

回答

3

我不知道一种方法来自动$display一个parameter的名称。但是,如果你不介意重复你的代码,你可以创建一个task(或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工具可以执行此操作。

+0

您当然可以用参数RESET替换case语句中的5'b00000。 – George 2010-10-29 13:21:43

1

可以有多个参数具有相同的值,因此您通常无法从数值转换为具有该值的参数的名称。参数类似于C #define s;虽然可以使用它们来定义一组状态,但变量和用于表示可能状态的参数列表之间没有正式关联。因为没有更好的选择,所以它通常以这种方式使用(错误)参数,但是SystemVerilog引入了一个enum类型,它没有参数方法的问题。您没有提及您使用的是什么工具,但假设您的工具支持SystemVerilog枚举类型,那么这对于状态值来说是更好的选择。

2

如果你的目标仅仅是显示的状态的模拟过程中的名字,我通常会做这样的事情

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


如果状态是有问题的参数状态寄存器。