找回密码
 注册
关于网站域名变更的通知
查看: 579|回复: 1
打印 上一主题 下一主题

大神写的关于FSM(有限状态机)的 test bench 写法的一点总结

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-10 07:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
大神写的关于FSM(有限状态机)的 test bench 写法的一点总结

7 l: U/ p0 S: u8 l6 M$ ^+ D  s% R/ C
" C1 `% M5 T2 d3 Z( v在写FSM的test bench时,会想要检查FSM的state,我知道的方法有下面几个:9 t. [/ E  H8 F& W$ `  R
1. 把state定义在UUT module的output port里。这样做的缺点很明显,这个port是完全多余的(通常来说),浪费有限的硬件资源。9 @& y6 r/ j- B+ k: f' Y3 E
2. 用诸如$display()的语句,在console里面显示出来。这样做的话结果不是显示在waveform里面,不直观。# R2 m/ Z& I0 E& l) B  t- U
3. 在test bench里面定义reg型变量,用作state的indicator,然后在waveform窗口,把这个变量的radix改成ASCII(改成ASCII是因为通常我们都会把state变量的数值重新定义成文字,使state符合自然语言,更加直观。应为要保存ASCII型的值,所以这个reg型变量需要比较大的width,一个ASCII字符8bit)。这是这篇文章要推荐的办法。
! Q, H, @+ p+ a; E  C: `9 h具体做法是在test bench里,先定义reg型变量做state indicator。
5 V. u/ F% B; i# o0 x) C" }" ~// declare 2 reg type variable for state indicator
5 m2 U0 W& F% H" v7 ireg        [31:0]current_state, next_state;/ k  d' I' j8 m9 q! `, `# @
这里用32bit的width是因为本例的state最长是4个字母。$ G) `! y% U7 e+ f
接着,把state的数值定义成自然语言的单词。
# _8 u$ n, }# ]" S// state definition! N) x' Z% H2 W3 {
parameter    Zero = 0, P = 1, A = 2, B = 3, C = 4;
8 l% P# v/ t. z: d8 R, G' A然后,用always语句抓UUT的state为敏感变量,用case语句给前面定义的state indicator赋值。这里取UUT的state时,使用了类似于C++里调用class的变量的方式,即"instance_name.variable_name”。
1 i2 V$ U$ m! r8 Palways @(ex1_4_2_tb.cur_state or ex1_4_2_tb.next_state)- m6 ]& D! R: M2 C6 Y
    begin  p3 j9 ~. n( h5 u; |( h8 F
        case (ex1_4_2_tb.cur_state)1 E1 U, g& K6 R7 U( p/ r0 ^3 q
            Zero    : current_state = "Zero";
0 t( P& r" Y/ G- `  x5 A4 `% @            P        : current_state = "P";
: y  r: k( X& x, I; U1 ~7 P            A        : current_state = "A";5 r  k. W8 E7 _* x3 k7 D
            B        : current_state = "B";
+ E( @: y5 R- M; w: {" R            C        : current_state = "C";+ Q) r8 b% n2 d% M
        endcase
7 M) F0 G" D% b" l! P% q) M3 g        case (ex1_4_2_tb.next_state); a9 b3 v+ F. J8 M& b
            Zero    : next_state = "Zero";
! d/ T% L+ s4 r+ Q            P        : next_state = "P";
" M9 j9 |, \4 Y$ o5 }4 U0 i0 g: s            A        : next_state = "A";
6 b* }$ H( B& q! p. C            B        : next_state = "B";4 s$ U9 C* N. }5 E  q
            C        : next_state = "C";
4 o" \8 c/ _" Y3 q4 ]7 }6 v        endcase
7 w, s/ j$ Y) S, T  m9 u6 \    end2 [$ j1 n. V5 D# x+ j- z
最后,在modelsim的waveform窗口里,把前面定义的reg型state indicator的radix改成ASCII。这样,就可以在waveform窗口里面看到state了。
  y) Q/ ~; x8 o4 B! d. E2 ^2 q+ l
! W/ a2 q- i. p) c3 x" l3 }! ~3 o

该用户从未签到

2#
发表于 2019-5-14 17:59 | 只看该作者
总结的非常棒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-2 12:01 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表