代码规范(二)
上次代码规范主要介绍了模块格式,信号命名,注释,表头等内容,今天主要介绍一些时钟复位的相关内容;
一、时钟部分
1. 时钟生成和门控放在某个特定模块crm中统一管理。
如果时钟在某个模块的内部产生,则spyglass会报W401的warning,提示时钟信号不是当前模块的输入信号。
2. 块中使用不止一个时钟,会导致不可综合
虽然很多综合工具支持多时钟的综合,但是并非好的代码习惯;除非你确认综合工具支持多时钟输入的综合,否则依然建议只有单时钟输入,将原来的代码块拆分;
module mod(in1, in2, clk1, clk2, out1);
input in1, in2;
input clk1, clk2;
output out1;
reg out1;
always@(posedge clk1 or posedge clk2)
out1 = in1 ^ in2;
endmodule
3. 在同一个always中,不可以存在多个时钟
从器件上来说,cell只有一个时钟驱动,因此多个时钟出现在同一个always中,理论上是 不可综合的设计。
4. 除非特别设计,否则在模块中同时使用时钟的上升沿和下降沿
二、 复位部分
1. 使用异步复位同步释放
(1)同步复位和异步复位的概念
同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:
always @ (posedge clk) begin
if (!Rst_n)
...
end
异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:
always @ (posedge clk,negedge Rst_n) begin
if (!Rst_n)
...
end
(2)各自的优缺点:
同步复位的优点大概有3条:
- 有利于仿真器的仿真。
- 可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。
- 因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
同步复位的缺点主要有以下几条:
- 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。
- 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
异步复位的优点有:
- 大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
- 设计相对简单。
- 异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
异步复位的缺点有:
- 在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
- 复位信号容易受到毛刺的影响。
综上,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就两全其美了。(后续会有文章介绍同步复位异步释放的相关内容)
2. 复位信号不能接静态信号0/1;
这种情况spyglass的check item中也有体现,如果接0/1,那么必须要确认确实符合design意图。
3. 在同一个设计单元中,复位信号或者置位信号不可同时使用其正负极;
一般出现在两个不同IP,一个需要positive reset,一个需要negative reset,但顶层统一输入negative reset给两个IP时就会报错;
还有一种情况就是design就是这么设计的(基本不会这么做);
4. 在同一个always中,不可以存在多个异步复位或者置位
不符合器件的原理,始终要明白寄存器只有一个复位输入端;
5. 异步复位/置位信号不是module的input信号
和时钟一样,所有的时钟复位信号不应该在模块内部自己产生,需要由统一的crn管理时钟复位。这样有利于综合和dft的设计。
6. 复位/置位在同步和异步电路中同时使用
基本不会有这种使用场景,对DFT测试capture和scan是不利的,务必出现这样的设计。