分类:
2011-08-03 13:55:24
2008-05-13 20:01:17| 分类: 学习笔记 | 标签: |字号大中小
昨天让王师兄帮我检查代码的时候才知道原来在modelsim波形中可以用参数名显示状态机,这样就给调试带来很大的方便,不用去代码中查找状态值是哪个状态,不过由于师兄用的是VHDL,modlesim对VHDL好像自动有这个功能,但我用verilog好像不行。如果对verilog也支持就好了。
就是说,在verilog编写有限状态机的时候,状态的定义是以参数形式表示的,当用modelsim仿真时候,在wave波形中则以数字形式显示状态,这样显示不是很直观,如果可以在modelsim仿真中,状态的定义直接以“文本”形式的参数显示出来,调试起来就会方便很多。
今天在网上查找了相关的资料,果然有这样的介绍。下边简单说一下(以下内容是整合我看过的帖子)。
// ===========================
假如一个状态机有如下的编码:
parameter WAIT_INPUT1 = 2'b00, // 状态机参数定义,表示4个状态
DELAY1 = 2'b01,
DELAY2 = 2'b10,
WAIT_INPUT2 = 2'b11;
reg [1:0] current_state;
缺省情况下,状态机current_state在ModelSim的wave窗口中以二进制编码的形式显示。如果想让其显示定义的参数,例如WAIT_INPUT1等,我们需要利用Modlesim给我们提供的virtual type命令来实现。
1. 用virtual type命令定义一个新的枚举类型(FSM_TYPE);
virtual type {
{2'b00 WAIT_INPUT1}
{2'b01 DELAY1}
{2'b10 DELAY2}
{2'b11 WAIT_INPUT2}
} FSM_TYPE;
关于virtual type的格式,暂时还不能确定是不是非要一行一个参数,但我在modelsim 6.2b中将上述定义输入到一行中,是不行的,只能一行一个参数,由于modelsim中将回车作为输入结束标识,如果换行的话就用shift+回车(不知道是不是这样)。
2. 然后我们将需要显示的信号(current_state)进行类型转换,转换成一个新的信号(CState);
virtual function {(FSM_TYPE)/current_state} CState;
注:上述语句只能加入当前仿真模块的状态机,如果说想要看底层模块的状态,则只需要将(FSM_TYPE)后边替换为/UUT/模块实例名/current_state
3. 最后我们将新的信号加入到wave窗口中。
add wave -hex -color pink current_state_new;
当然也可以直接在在相应的模块中找到刚替换的CState,鼠标添加,但命令添加有一个好处,就是可以控制添加进去波形的颜色。
// ===========================
(全文完)