时延的常用用法:
- #delay Q = A + B;
延时N单位时间后,计算A+B的值并立即赋值给Q
- Q = #delay A + B;
立即计算A+B的值,并且保持N个单位后赋值给Q
两种写法的区别是A+B的计算时间是不同的。比如在t时刻语句执行,则第一种写法中Q在(t+delay)时刻得到此时的A+B的值,第二种写法中Q在(t+delay)时刻得到t时刻的A+B的值。
代码规范:
- 参数化设计
如设计时钟周期为1ns,复位周期为5个时钟周期↓↓↓
……
parameter CLK_PERIOD = 1;
parameter RST_MUL_TIME = 5;
parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;
……
always begin
# CLK_PERIOD/2 clk <= ~clk;
end
initial begin
clk <= 0;
rst_n <= 0;
# RST_TIME rst_n <= ~rst_n;
end
……
如此:在更改时钟周期的时候,只需要更改参数的值。
- 规范化信号命名
①信号名一律小写,参数用大写。
②对于低电平有效的信号结尾要用‘_n’标记,如‘rst_n’。
③端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后方便很多。
④一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个entity。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔离。这样做可以让综合器综合出更优的结果。
⑤尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。
⑥在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的,比如配置寄存器就是这种类型。
⑦一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也是极有好处的。
⑧除非是低功耗设计,不然不要用门控时钟–这会增加设计的不稳定性,在要用到门控时钟的地方,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。
最好的解决门控时钟的办法是使用或门(上升沿触发),如果门控触发器是下降沿触发,则应该使用与门。
⑨禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性。
Updating……