1、异步复位同步释放也会导致亚稳态
如在如下两种情况下,异步复位同步释放可能会在异步复位的时候产生亚稳态,并且会造成比较严重的影响。
情况1:同时钟域,前级reg有异步复位,后继reg没有复位信号
情况2:同时钟域,前后级reg均有异步复位,但仅仅前级reg复位,后级不复位。
异步复位rst_n有效时刻可能会发生在data_in的setup时间范围内,导致前级寄存器输出不稳定状态,而后级reg采用时未恢复到不稳定状态,导致亚稳态传递。
2、异步复位亚稳态的危害
情况1:同时钟域,前级reg有异步复位,后继reg没有复位信号
情况2:同时钟域,前后级reg均有异步复位,但仅仅前级reg复位,后级不复位
这两种情况都会导致亚稳态传递,可能会发生以下情况:
1)下游通路震荡:下流通路有反馈电路,反馈的是本来不会发生的数据,导致震荡
2)状态机卡死:状态机在某一个状态,本来是有正确条件可以跳转的,结果此时有亚稳态,导致条件不成立,卡死在某一个状态。
3、如何避免异步复位亚稳态
避免复位亚稳态发生就是避免在reg输入数据跳变的时候复位,可采用的方法是:
在复位时之前就保证上游模块出口数据处于某一个稳定状态。
如下所示:在always@(posedge clk or rst_n)代码里面添加clear信号,在复位之前,使得clear有效,将数据置为无效状态。
always @ (posedge soc_clk or negedge soc_rst_n) begin
if(!soc_rst_n)begin
data_out <= 1024'b0;
data_vld <= 1'b0 ;
end
else if(cfg_rst_n_clear)
begin
data_out <= 1024'b0;
data_vld <= 1'b0 ;
end
else begin
data_out <= data_out_w;
data_vld <= data_vld_w ;
end
使用步骤如下:
- 在复位之前,将cfg_rst_clear置为1
- 开始异步复位
- 将将cfg_rst_clear置为0
- 异步复位释放