关于门控时钟综合
1.
always @(posedge clk)
begin
if(enable)
out<= in;
else
out <= out;
2.
assign ckg = enable?clk:0;
always @(posedge ckg)
.....
我用第一种形式的可以综合成latch based门控的,用第二种怎么就综合不出来呢,还是与门形式的
有没有高手能指点一下啊
你是FPGA的rtl设计吗?如果是推荐使用dcm或PLL来实现门控时钟
里面有一个buff叫做enable buff
你只需要产生一个enable信号就可以了,pll 或dcm会产生一个门控时钟输出
不是fpga,是asic方面的
请教第二种描述的综合方法
asic的话直接 用latch,到库单元中找一个大小合适的latch,直接例化一个就行了
第一种是门控的默认风格,这种可以直接在dc中生成门控,默认的门控时钟风格就是base latch
第二种是rtl直接映射到门级的,根据你的逻辑就是与门的时钟输出,如果想增加latch,就在例化一个latch即可
你的第2种写法,本身就是一个AND
latch是需要定义成reg的吧
要使用门控的书写格式。
小编确信第一种描述方式能综合出latch来?我认为综合出的应该是mux+D触发器
第一种是mux+d flip-flop了, clock gating cell是integrated latch based cell,每个工艺库都有特定的cell,直接例化就行了,后端的时候再特殊处理一下。
第二钟时钟方式不正确
在ASIC设计中,门控时钟最好用cell来做,免得DC综合得很乱。
i prefer the first case...
第二种是门控时钟没错,但是这样的写法是会产生毛刺的。
建议采用以下的写法,不会有毛刺。
always @(negedge clk or posedge rst)
if(rst) en_r <= 0;
else en_r <= #1 enable;
wire clk_gate = en_r & clk;
门控时钟可以由工具用standard cel综合生成,也可以直接调用库里的icg cell。
一般情况下库里都有icg cell,它是基于latch的实现方法。
第一種由於電路必須將out的值保留
所以會出現latch
第二種由於您指定了clk在enable為0時,有default值為0
因此不會出現latch
man一下clock_gating_style这个变量,估计会对你有所帮助。
我用的就是这种方法:
always @(negedge clk or posedge rst)
if(rst) en_r <= 0;
else en_r <= #1 enable;
wire clk_gate = en_r & clk;
