shawge

在modesim中显示状态机变量参数名的两种方法及比较

0
阅读(2799)

在modesim中显示状态机变量参数名的两种方法及比较


对于VHDL,modelsim是直接支持的,对于verilog我们则需要动些小脑筯。我在网上搜罗了一下,主要包括以下两种方法:
1.通过modelsim的virtual type命令来实现。
2.通过条件编译指令来实现。

通过modelsim的virtual type命令实现状态名显示的具体操作

  1. 用virtual type命令定义一个新的枚举类型(FSM_TYPE);
    在sim.do(或者你自己的.do脚本)中添加以下代码(以下代码都可以直接在modsim的Transcrip窗口中作为命令输入,如果你不嫌麻烦的话,当然我不建议你这么做 :-):
# 使用ModelSim的virtual type命令定义一个新的枚举类型(FSM_TYPE)
# 注意:状态变量之间需要一个空格,注意4'b0001不能像verilog里面一样写成4'b00_01
virtual type {{4'b0001 STATE1} {4'b00010 STATE2} {4'b0100 STATE3} {4'b1000 STATE4}} FSM_TYPE

注意:状态变量之间需要一个空格,注意4’b0001不能像verilog里面一样写成4’b00_01
2. 然后我们将需要显示的信号state_cur、state_next分别进行类型转换,转换成两个新的信号state_curNew、state_nextNew。在sim.do(或者你自己的.do脚本)中添加以下代码:

# 将需要显示的信号(/testbench/fsm/state_cur,注意信号在wave窗口中的完整名字)进行类型转换,
#转换成一个新的信号state_curNew
virtual function {(FSM_TYPE)/testbench/fsm/state_cur} state_curNew
#同样处理state_next信号
virtual function {(FSM_TYPE)/testbench/fsm/state_next} state_nextNew
  1. 最后我们将新sate_curNew、state_nextNew的信号加入到wave窗口中。
#将新信号加入wave窗口
add wave testbench/fsm/sate_curNew
add wave testbench/fsm/sate_nextNew

或者直接在modsim的Transcrip窗口中输入以上命令。
缺点
1. 在波形窗口中将会同时出现原来以数字显示的状态机变量和以参数名显示新的状态机变量,如下图

(图中的state1即为curr_state转化后的新信号,state2即为next_state转化后的新信号)
当然也可以在脚本中加入命令删除原来的状态变量波形。
2. 操作麻烦,当把以上脚本代码应用到新项目中时要修改的地方比较多(如果让你从Transcrip窗口一条条输入命令,那会蛋疼得生不如死)显得很多不通用也不便于维护,所以我更愿意使用和推荐下面这种方法。

通过条件编译指令实现状态名显示的具体操作

添加条件编译指令,即存在`SIM定义时将每一个状态定义为字符串,这里需要注意stateCur、stateNxt在定义为字符串时需要给予足够的长充,否则波形显示时字符串将会不完整。

`ifdef SIM
    localparam STATE1   =   "STATE1";
    localparam STATE2   =   "STATE2";
    localparam STATE3   =   "STATE3";
    localparam STATE4   =   "STATE4";
    localparam STATE5   =   "STATE5";
    localparam STATE6   =   "STATE6";
    localparam STATE7   =   "STATE7";
    localparam STATE8   =   "STATE8";
    localparam STATE9   =   "STATE9";
    localparam STATE10  =   "STATE10";

    reg [255:0] stateCur;
    reg [255:0] stateNxt;
`else
    localparam STATE1   =   10'b00_0000_0001;
    localparam STATE2   =   10'b00_0000_0010;
    localparam STATE3   =   10'b00_0000_0100;
    localparam STATE4   =   10'b00_0000_1000;
    localparam STATE5   =   10'b00_0001_0000;
    localparam STATE6   =   10'b00_0010_0000;
    localparam STATE7   =   10'b00_0100_0000;
    localparam STATE8   =   10'b00_1000_0000;
    localparam STATE9   =   10'b01_0010_0000;
    localparam STATE10  =   10'b10_0010_0000;

    reg [9:0] stateCur;
    reg [9:0] stateNxt;
`endif

在testbench中加入以下定义:

`define SIM

在modelsim中以ASCII Radix方式查看stateCur、stateNxt信号,当然也可以直接在.do脚本中添加代码,以实现sateCur、stateNxt以ASCII显示。

优点: 1. 操作方便,直接在代码中书写便于维护。2. 在modelsim波形窗口中不会显示多余波形。