|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
让Verilog仿真状态机时可以显示状态名
4 X' U; A* m3 ZSituation: 我们平时使用Verilog进行状态机编码时,通常使用parameter对状态名进行定义,这样写Case语句的时候就不会对这一串10摸不着头脑。可是通常这样做的话,在Modelsim里看到的还是一串10,使排错非常困难,特别是在用OneHot编码的时候,就看到一串0中间的一个1 #_# 简直要疯掉。0 k$ o7 Y- i4 Y: _( Z
Question: 我们可不可以像VHDL一样,在仿真的时候看到状态名字,而不仅仅是状态编码呢?2 q+ ?3 k. D, Z3 J
答案当然是可以的拉,事在人为嘛!
0 ^; L7 q* `" K6 USolution1:
0 H& Y/ C* ^* ~+ R) E" w9 K2 k$ I另外定义一个reg: state_name,长度根据状态名称长度而改变(状态名称字符数x8);/ I2 U, T) A5 _4 X9 d# r0 \
在每个状态执行的语句中加入state_name <= "IDLE"; 类似的一句语句;
, ^- c& k5 L4 L0 ~& Q# c+ g/ P9 R仿真时添加state_name进行观察,使用ASCII Radix。
* k4 b/ x, n/ r! A( v- `( L5 ISolution2:
) o* Y& C) L7 c/ H使用如下语句:
( h" t2 G1 o9 d A& j' G5 N6 \`ifdef SIMULATION * J0 _- ^- c1 E1 C
parameter S_idle = "idle "; ; n0 G; `/ e4 C
parameter S_decode = "decode";
# s) I( l4 l. ^4 [: h6 P parameter S_start = "start ";
0 f# ^2 L8 u3 R F4 }, H4 p parameter S_wait = "wait ";
# k" Q( y4 G3 N! Z. H. Y: g1 Z parameter state_wid_msb = 47; . g& a: _( c% ~
`else
* r9 Q+ u4 [/ o( l parameter S_idle = 4'b0001; 6 S3 V- j2 X( b# M, x# r6 D- K
parameter S_decode = 4'b0010; 8 A& o$ I! _; k* U* O
parameter S_start = 4'b0100;
9 @7 c' O, j0 p1 U- t parameter S_wait = 4'b1000;
$ y( t- T1 D) I2 [6 N" r: }) |7 M parameter state_wid_msb = 3;
1 N8 q1 P$ x2 A/ A3 t3 C9 O`endif G) S) I5 x# i3 l/ I0 i
reg [state_wid_msb:0] state; g" [, F' I' l& Z
只要在仿真的时候`define SIMULATION就可以了。一样用ASCII Radix查看。( D' e. T( p" {% V
, {/ v5 v2 n% c! X; R# i0 \ |
|