EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
大神写的关于FSM(有限状态机)的 test bench 写法的一点总结 ' [# P1 O3 ?) N" G ]* J. O
3 N6 T4 K* H, S3 }% D在写FSM的test bench时,会想要检查FSM的state,我知道的方法有下面几个:
' f& G1 ^6 ]* I/ T5 q4 A1. 把state定义在UUT module的output port里。这样做的缺点很明显,这个port是完全多余的(通常来说),浪费有限的硬件资源。
; X1 ]. q- B+ @3 {4 e9 _2 H2. 用诸如$display()的语句,在console里面显示出来。这样做的话结果不是显示在waveform里面,不直观。% R* x- q' G' g+ R+ k! N9 C7 o
3. 在test bench里面定义reg型变量,用作state的indicator,然后在waveform窗口,把这个变量的radix改成ASCII(改成ASCII是因为通常我们都会把state变量的数值重新定义成文字,使state符合自然语言,更加直观。应为要保存ASCII型的值,所以这个reg型变量需要比较大的width,一个ASCII字符8bit)。这是这篇文章要推荐的办法。
. E" k, J* `& ?: M/ w具体做法是在test bench里,先定义reg型变量做state indicator。1 q; @. a) Q5 e" K$ O9 l4 o( K# j
// declare 2 reg type variable for state indicator
. c% s' L/ Y5 u$ breg [31:0]current_state, next_state;
}0 q1 a; Q; I- D' D, C这里用32bit的width是因为本例的state最长是4个字母。
, w7 B8 @% U/ T$ S& _接着,把state的数值定义成自然语言的单词。
2 G6 q4 \, P& Y+ W$ U3 C& p// state definition4 Y) s0 K9 c% h" H% x1 G! E/ h
parameter Zero = 0, P = 1, A = 2, B = 3, C = 4;3 |3 a) G$ W9 J7 `
然后,用always语句抓UUT的state为敏感变量,用case语句给前面定义的state indicator赋值。这里取UUT的state时,使用了类似于C++里调用class的变量的方式,即"instance_name.variable_name”。
3 z8 a/ S2 p2 l$ q3 T! L* ?8 Halways @(ex1_4_2_tb.cur_state or ex1_4_2_tb.next_state): }( e% L5 ` i
begin1 [/ O1 P& u; H G
case (ex1_4_2_tb.cur_state)
+ V5 {, m. T* [+ t4 ~ Zero : current_state = "Zero";5 M E y4 y0 t) n0 i
P : current_state = "P";
! S" r6 u. D! I1 B& ~6 ]! W A : current_state = "A";
1 ? L9 ~. ~" t B : current_state = "B";
+ F7 E* @1 C5 ]4 f6 N6 K9 @# f C : current_state = "C";
5 `; X$ h) X9 x+ r+ t( t endcase& L* J/ H. Z6 o
case (ex1_4_2_tb.next_state)
( g- H q v* S. ~& R Zero : next_state = "Zero";. D" b7 d. Q7 p8 |5 D5 ]1 o( t
P : next_state = "P";% ~4 E$ Z/ e( s/ p. j3 y# U/ Z
A : next_state = "A";
4 r9 S2 r- Y- g8 u6 z J4 L& W" T B : next_state = "B";
% r9 \. Q2 o( ^0 x C : next_state = "C";
, B) r, J }+ y1 j endcase
; w6 r J& h" m" Q9 W0 h( n( Y end% ?& w+ e8 p# V
最后,在modelsim的waveform窗口里,把前面定义的reg型state indicator的radix改成ASCII。这样,就可以在waveform窗口里面看到state了。
# p( Z# l) {/ n# E
" ~" Y- ^1 S' I: A. p7 c |