Board logo

标题: 一些关于Verilog写FSM的注意事项[转帖] [打印本页]

作者: csj    时间: 2005-12-31 10:47     标题: 一些关于Verilog写FSM的注意事项[转帖]

在网上看到这样一个帖子,觉得不错!

 

一些关于Verilog写FSM的注意事项:

a.状态机的定义可以用parameter定义,但是不推荐使用`define宏定义的方式,因为'define宏定义在编译时自动替换整个设计中所定义的宏,而parameter仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。


作者: csj    时间: 2005-12-31 10:48

b.设计时序always模块时一定要使用"=>"非阻塞赋值方式。采用非阻塞赋值方式消除了很多竞争冒险的隐患。
引申讨论一个问题:在使用非阻塞赋值的时候,很多设计者采用"intra-assignment timing delay"(在非阻塞赋值前人为加入一个很小单位的延时)。如下例:
     always @(posedge clk or posedge rst)
if (rst)
state <= #1 IDLE;
else
state <= #1 nextstate;
关于这种写法的阐释有下面几点:
I.首先,这种描述是行为级描述方式,仅仅在仿真时起作用,在综合时会自动被综合器忽略。也就是通常所说的延时描述是不可综合的。
II.这种描述的好处之一是:它简单模拟了赋值过程寄存器内部的clock-to-output的延时,在做行为级功能仿真的时候,也可以发现一些由于寄存器固有延迟造成的时序和功能问题。
III.避免了由RTL级代码向门级描述转变过程中的一些潜在错误。
models from an RTL model.这种方式很好的避免了由RTL级代码向门级代码转换的过程中的hold时间带来的问题。
IV.使用这种用法必须明确,综合是延时是被忽略的,所有同步时序的赋值仍然是按照非阻塞方式进行的。
/*****************************************************************/
如果有篇幅可以讨论一下:Verilog的一个基本概念问题。
有时间的朋友可以仿一仿,看看到底有什么区别!
always @(posedge clk or posedge rst)
if (rst)
state <= #1 IDLE;
else
state <= #1 next;
always @(posedge clk or posedge rst)
if (rst)
     #1state <=  IDLE;
else
     #1state <=  next;
   /*****************************************************************/

[此贴子已经被作者于2005-12-31 10:48:11编辑过]






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0