芯片原厂必学课程 - 第三篇章 - IC 理论篇
03-02 同步复位以及异步复位
新芯设计:专注,积累,探索,挑战
引言
本文主要是提供了 ASIC 设计中关于复位技术相关的概念和设计,承接上一篇文章中的时钟技术
NOTES:本文来自《芯片原厂必学课程 - 第三篇章 - IC 理论篇》技术专栏
🌏 一、同步复位 SYNC
同步复位:只有时钟上升沿精确检测到复位有效电平的时候,才会执行复位操作,如下
always @(posedge clk) begin
if(!rst_n)
b <= 1'b0;
else
b <= a;
end
✅ 优点
- 便于仿真工具的仿真
- 百分百的同步时序电路设计,便于时序分析
- 由于只在时钟有效电平到来时才有效,因此能够滤除高于 CLOCK CYCLE 的复位毛刺
✅ 缺点
- 复位信号的有效时长要求不小于 CLOCK CYCLE,才能够保证真正被系统识别,从而完成复位任务
- 由于大多数的逻辑器件的 CELL LIB 内的 DFF 都只有异步复位 SR 端口,若是直接采用同步复位的话,综合器就会在寄存器的数据输入端口上插入一些组合逻辑,最终导致了逻辑资源和门延时的增加
🌏 二、异步复位 ASYNC
异步复位:无论时钟上升沿是否到来,只要复位有效沿到来,立即执行复位操作,如下
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
b <= 1'b0;
else
b <= a;
end
✅ 优点
- 由于大多数的逻辑器件的 CELL LIB 内的 DFF 都只有异步复位 SR 端口,若是直接采用异步复位的话,就不需要额外的组合逻辑,从而节省资源
- 设计相对简单
- 不管时钟是否出现,电路都能够在任何的情况下复位成功,因此异步复位信号具有识别方便的特点
✅ 缺点
- 最大的问题在于它属于异步逻辑,关键的问题出现在复位释放的时候,而不是复位有效的时候,因此,若是复位释放接近于时钟有效沿的话,DFF 的输出就极有可能进入亚稳态,对应的 clk 检测到的 rst_n 的状态就会是一个亚稳态,即是 0 是 1 是不确定的,最终导致了复位的失败
- 可能因为噪声或者毛刺造成虚假复位信号(比如以前的游戏机玩到一半突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此,判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题)
- 静态时序分析比较困难
- 对于 DFT 设计,如果复位信号不是直接来自于 I/O 引脚,在 DFT 扫描和测试时,复位信号必须被禁止,导致了额外的同步电路的消耗
🌏 三、异步复位,同步释放
推荐异步复位、同步释放的方式,并且复位信号为低电平有效
异步复位、同步释放指的是复位信号的到来与撤除都和 clki 无关,不过复位信号的撤除是在下一个 clki 到来之后才执行的,也就是复位信号 riscv_rstn_sync 由高到低时实现异步复位,这样的目的是防止复位信号的撤除时可能产生的亚稳态
// 异步复位同步释放的标准电路设计
always @(posedge clki or negedge rsti_n) begin
if(!rsti_n)
sync_rstn_r <= 2'b0;
else
sync_rstn_r <= {sync_rstn_r[0], 1'b1};
end
assign riscv_rstn_sync = sync_rstn_r[1];
assign riscv_rstn = scan_mode ? test_rstn : riscv_rstn_sync;
对于同步释放,这个是关键的操作,即当复位信号 riscv_rstn_sync 撤除时(由低到高),由于双缓冲电路(双寄存器)的作用,riscv_rstn_sync 不会随着 rsti_n 的撤除而撤除。假设 rsti_n 撤除时发生在 clk 上升沿,如果不加此电路则可能发生亚稳态事件
但是,加上此电路之后,假设第一级 D 触发器 clk 上升沿时 rsti_n 正好撤除,第一个 DFF 此时是出于亚稳态的,假设此时识别到高电平;若是识别到低电平,则增加一个 DELAY,则 DFF1 输出高电平,此时第二级触发器也会更新输出,但是输出值为前一级触发器 clk 来之前时的 Q1 输出状态,显然,Q1 之前为低电平,所以第二级触发器输出保持复位低电平,直到下一个 clk 来之后,才随着变为高电平,即同步释放