系列文章目录
第一章: 同步释放原则
文章目录
前言
在SOC系统中,rst_gen是专门为系统各个模块产生复位逻辑,用于接DFF的复位端口。为了保证系统复位正常,rst_gen模块设计有严格的要求,一般会跟clk_gen匹配产生,好的rst_gen设计不但可以保证系统复位的鲁棒性,还有利于中后端recovery/removal的timing收敛。
提示:以下是本篇文章正文内容,下面案例可供参考
一、rst_gen是什么?
这里说的rst_gen是指一个专门管理系统复位的模块设计。该模块为系统中其他所有模块提供复位源。
二、什么是同步释放
1. DFF的时钟复位端口
代码如下(示例):
reg example_name;
always@(posedge clk or negedge rst_n)
beign
if(!rst_n)
example_name <= 1'b0;
else
example_name <= others;
end
如上例子定义一个寄存器 example_name,该寄存器的CK端为clk,复位端为rst_n。
2. recovery and removal检查
在实际电路中,timing约束会对clk和rst_n的timing进行约束检查。跟检查CK与D端数据一样,当timing不满足需求时,D触发器输出Q端的状态会出现亚稳态,一旦该亚稳态级联到后续的组合逻辑中,会导致电路出现不可控的状态。因此,对于D触发器来说,不但要满足CK到D端的检查,也要满足clk与rst_n的时序。
3. 同步释放
所谓同步释放,即rst_n要经过clk进行同步后输出,这样就保证了rst_n与clk处于同一个domain,中后端才会对齐进行时序检查,而对于clk与rst_n未做同步释放的,中后端认为异步关系,对于异步关系,中后端是没有办法进行约束的,即当作false path处理,对于这种中后端未做约束的情况,一旦不满足recovery/removal,就会出现timing问题,导致逻辑紊乱。
而进行同步释放的复位,中断会对timing进行约束和检查,保证了后续电路能够正常工作。
async_2ff u_async_2ff_rst(.clk_source(clk),.rst_n_source(por_n),.sig_in(1'b1),.sig_out(rst_n));
上述同步释放过程,por_n可以是任意一个异步复位源,但是D端接固定电平,这样即即使clk与por_n存在recovery/removal违例,但是是属于异步复位,复位优先级最高,此时因为D端(其他端也不变的情况,SE,SI等,仅仅是por_n变化)不变,Q端也会hold在固定电平上。当por_n撤销时,rst_n会在clk的上升沿输出,即保证了rst_n属于clk domain中。这样rst_n接到其他DFF的clk端时,就属于被clk domain cover住了。
总结
例如:以上就是今天要讲的内容,本文介绍了异步复位的同步释放相关的背景及意义,对于系统中的不同clk对应的复位,一定要在相应的clk下做同步释放,这样中后端才能对齐进行timing约束,保证了时序的约束在可控范围内,否则就有可能出现亚稳态,导致电路出现异常。