当前位置 博文首页 > zhoujianjayj的博客:Verilog代码规范(二)-- 时钟复位
上次代码规范主要介绍了模块格式,信号命名,注释,表头等内容,今天主要介绍一些时钟复位的相关内容;
如果时钟在某个模块的内部产生,则spyglass会报W401的warning,提示时钟信号不是当前模块的输入信号。
?
虽然很多综合工具支持多时钟的综合,但是并非好的代码习惯;除非你确认综合工具支持多时钟输入的综合,否则依然建议只有单时钟输入,将原来的代码块拆分;
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
?
从器件上来说,cell只有一个时钟驱动,因此多个时钟出现在同一个always中,理论上是 不可综合的设计。
?
(1)同步复位和异步复位的概念
同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:
always @ (posedge clk) begin
if (!Rst_n)
...
end
异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:
always @ (posedge clk,negedge Rst_n) begin
if (!Rst_n)
...
end
(2)各自的优缺点:
同步复位的优点大概有3条:
同步复位的缺点主要有以下几条:
异步复位的优点有:
异步复位的缺点有:
综上,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就两全其美了。(后续会有文章介绍同步复位异步释放的相关内容)
?
这种情况spyglass的check item中也有体现,如果接0/1,那么必须要确认确实符合design意图。
?
一般出现在两个不同IP,一个需要positive reset,一个需要negative reset,但顶层统一输入negative reset给两个IP时就会报错;
还有一种情况就是design就是这么设计的(基本不会这么做);
?
不符合器件的原理,始终要明白寄存器只有一个复位输入端;
?
和时钟一样,所有的时钟复位信号不应该在模块内部自己产生,需要由统一的crn管理时钟复位。这样有利于综合和dft的设计。
?
基本不会有这种使用场景,对DFT测试capture和scan是不利的,务必出现这样的设计。
?
cs