| |
a.状态机的定义可以用parameter定义,但是不推荐使用`define宏定义的方式,因为'define宏定义在编译时自动替换整个设计中所定义的宏,而parameter仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。
b.设计时序always模块时一定要使用"=>"非阻塞赋值方式。采用非阻塞赋值方式消除了很多竞争冒险的隐患。
引申讨论一个问题:在使用非阻塞赋值的时候,很多设计者采用"intra-assignment timing delay"(在非阻塞赋值前人为加入一个很小单位的延时)。
如下例:
always
if (rst)
state <= #1 IDLE;
else
state <= #1 nextstate;
关于这种写法的阐释有下面几点:
I.首先,这种描述是行为级描述方式,仅仅在仿真时起作用,在综合时会自动被综合器忽略。也就是通常所说的延时描述是不可综合的。
II.这种描述的好处之一是:它简单模拟了赋值过程寄存器内部的clock-to-output的延时,在做行为级功能仿真的时候,也可以发现一些由于寄存器固有延迟造成的时序和功能问题。
III.避免了由RTL级代码向门级描述转变过程中的一些潜在错误。
models from an RTL model.这种方式很好的避免了由RTL级代码向门级代码转换的过程中的hold时间带来的问题。
IV.使用这种用法必须明确,综合是延时是被忽略的,所有同步时序的赋值仍然是按照非阻塞方式进行的