EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
大神写的关于FSM(有限状态机)的 test bench 写法的一点总结
6 K5 }1 J, }# ^: Z, l6 z* D$ |2 e5 Z. U: Z/ ^4 s4 G% J
在写FSM的test bench时,会想要检查FSM的state,我知道的方法有下面几个:5 _$ W5 f# i" E- }
1. 把state定义在UUT module的output port里。这样做的缺点很明显,这个port是完全多余的(通常来说),浪费有限的硬件资源。, I; D# V0 ~& c8 E' i% ^/ S1 S
2. 用诸如$display()的语句,在console里面显示出来。这样做的话结果不是显示在waveform里面,不直观。9 m& t; P0 B- y! k6 e# o1 [7 Q: Y$ e/ ^
3. 在test bench里面定义reg型变量,用作state的indicator,然后在waveform窗口,把这个变量的radix改成ASCII(改成ASCII是因为通常我们都会把state变量的数值重新定义成文字,使state符合自然语言,更加直观。应为要保存ASCII型的值,所以这个reg型变量需要比较大的width,一个ASCII字符8bit)。这是这篇文章要推荐的办法。, g/ D4 Q: P% i) J; N
具体做法是在test bench里,先定义reg型变量做state indicator。
& Z- R. A3 i+ g* ?9 T// declare 2 reg type variable for state indicator
5 l5 r2 T1 |9 O* p ?: J& ~1 I+ Hreg [31:0]current_state, next_state;
" M$ [: J, |5 |- O0 o/ e7 `5 \这里用32bit的width是因为本例的state最长是4个字母。
0 M% @; c7 n4 Z5 R8 j, t0 |接着,把state的数值定义成自然语言的单词。4 L3 U! p& \4 ` t7 K) y4 r
// state definition
& `: A: x; c5 y- Zparameter Zero = 0, P = 1, A = 2, B = 3, C = 4;
/ R+ F# A+ a3 S( H0 ~: E8 m然后,用always语句抓UUT的state为敏感变量,用case语句给前面定义的state indicator赋值。这里取UUT的state时,使用了类似于C++里调用class的变量的方式,即"instance_name.variable_name”。
. W6 o6 X7 @: H; P# l% Malways @(ex1_4_2_tb.cur_state or ex1_4_2_tb.next_state)6 h0 L2 T$ ?8 R% ?( T6 h8 L
begin
W2 ^3 @. V. H. i case (ex1_4_2_tb.cur_state)( O+ y9 J6 W& f
Zero : current_state = "Zero";' A! }3 ` a B4 m: l4 r
P : current_state = "P";- E5 F |2 Z( Q t
A : current_state = "A";
. N3 |; E& |! ?$ V; ]/ m5 D- F B : current_state = "B";# t2 m! f: X3 R. e! [( {
C : current_state = "C";
4 p1 g m! J# Y: G! W+ d8 A: _ endcase/ M9 c$ u/ e" P1 w
case (ex1_4_2_tb.next_state)( ]! t$ T7 X: s5 Q0 K; A6 ~# s
Zero : next_state = "Zero";3 K* ^) F/ N4 h6 y2 x; ?* @7 f' B0 m
P : next_state = "P";
3 \0 h9 {: E; n+ Z/ F% m: D A : next_state = "A";
" z7 Q4 Q2 o! S; Y+ H% ^ B : next_state = "B";8 U* ^ {% g8 Y( G+ `
C : next_state = "C";
+ w1 }. r, J" e: ? E8 p. G; m) a7 b endcase n3 z/ U( Y, Q, z+ S
end
& \; [5 Y# Z3 J* ?+ h0 s$ y* V* f# y最后,在modelsim的waveform窗口里,把前面定义的reg型state indicator的radix改成ASCII。这样,就可以在waveform窗口里面看到state了。% g# n; R, S; V$ z. ]
2 Z. X4 m& p+ B s
|