本节不去讨论同步复位与异步复位以及异步复位的reset_release,这些问题可参考:
芯片设计进阶之路——Reset深入理解——cy413026
本文主要回答一下几个问题。
0.0 clk不能同时达到所有同步寄存器
需要确定后端是不可能让所有的同步寄存器同时获得时钟的?
如果确定了,那么如果先解复位,再开时钟就可能,同一个clk domain和reset domain的寄存器有的有时钟,有的没有时钟,可能会出现有的正确采样了有的没有正确采样,所以需要等到时钟稳定并传输到所有寄存器clk端?
和后端的同事交流了一下,在做clk tree的时候会对同一个clock做balance。clock balance的目的就是要让同一个clk上升沿几乎同时到达所有该clk下的FF。它们之间的差距就是clk skew,这个skew是很小的【远小于一个时钟周期】,也就是说不会出现距离clk common path近的FF先收到clk,远的FF会晚一个时钟周期以上收到clk。
后端同事说clk会先走到该clk下寄存器的中心区域,尽量把clk的common path做长,然后在散开。但是这样就一定能够保证从common path分开之后近端和远端的clk skew很小吗?会不会出现近端的FF在clk path上加的buff比远端的buff多?这个问题留待后续讨论。
0.为什么异步复位多见低电平
实际上异步复位用低电平是一个历史问题,非复位状态时,为高电平,早期使用TTL的电路时,保持高电平比低电平节省功耗。现在都是CMOS电路不存在这个区别了。
但是随着工艺的提升,工作电压的降低,考虑到噪声的影响,大家又偏向于低电平复位。
1.片外的reset信号特别是按键reset怎么防止错误抖动的影响?
常见的处理方法包括两种:
- 使用斯密特触发器做IO输入,斯密特触发器有一定的防抖动功能
- 使用de-bounce电路
de-bounce电路原理就是检测到IO输入的信号翻转之后 在多次间隔一定时间检测信号值稳定才会输出这个变化
2.常见soc设计为何要有subCrg,这些时钟复位不在top上做
应该从两个方面来考虑,一个是逻辑设计和软件使用方面;另一个方面从reset网络的物理实现上考虑
对于逻辑设计和软件来讲有几个方面:
- gating的时钟太多了,在系统级gating就需要把所有的clk拉过去,有些clk甚至是子系统内部的时钟-----总结起来就是功耗和布线问题
- 在做reset的时候 一般会加上软件复位,系统级不方便加这么多软复位,软件也难控制,需要软件知道所有子系统甚至子IP的软件复位时序
对于物理实现来说:
- 把所有系统clk集中放在一个模块 就会有问题,时钟间相互干扰,timing都有问题
- soc这么大的系统来说复位放在一个地方走线到各个寄存器也有问题【但本人并不能说明物理实现上的详细影响】【其实就是balance问题】
上面的回答偏向于subsys和topblock层级,在soc层级上可以换个问法,为什么clk越晚分叉越好?
PLL输出同一clk 给不同的subsys使用,处于功耗考虑,要求能够根据各subsys的