首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一些关于Verilog写FSM的注意事项[转帖]

一些关于Verilog写FSM的注意事项[转帖]

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

 

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

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

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编辑过]

返回列表