本文基于VC_SpyGlass_CDC_UserGuide整理了3种常见的cdc(Clock Domain Crossing)错误。需要注意的是:
- 本文描述的跨时钟错误在特定场景下,有些是允许的,甚至有些是正常设计。因此IC设计者想要确认跨时钟错误需要分析应用场景。
- 还有一些CDC错误是spyglass 工具无法发现的,因此不能全部依赖工具检查。
- 有些项目组为了避免新手对cdc理解不深刻造成bug,对跨时钟设计做了更加严格的规范。例如,下文中的裸跨是不允许存在的。
1、没有跨时钟 CDC Unsynchronized
没有采用跨时钟模块,即咱们通常说的裸跨,不同时钟域的数据直接互连,会存在亚稳态问题。同步电路会进行STA(静态时序分析)保证setup-hold time满足要求,因此寄存器能够保证正确采样。而不同时钟域的信号之间没有setup-hold time要求,无法保证正确采样。
图5-1 所示为亚稳态的案例,F1是clk_A时钟域的寄存器,F2是clk_B时钟域的寄存器,clk_A和clk_B是异步时钟,寄存器F1的输出信号A发生跳变的时刻有可能与clk_B的上升沿发生重叠,此时对寄存器F2来说,在setup-hold time时间区间内,输入A没有保持稳定,因此寄存器F2输出的B是不确定状态,这就是亚稳态。
解决方案:根据实际场景添加对应的跨时钟模块,例如bit同步器,脉冲跨时钟模块,异步fifo,多比特跨时钟等等。
鸽子解读1:
没有跨时钟,不一定就是错误;在一些场景中,为了节约资源不跨时钟是允许的。
下图所示案例: 配置模块csr模块产生的配置信号cfg_mode是clk1时钟域,直接用于clk2时钟域的逻辑模块。
在芯片使用过程中,复位和配置顺序如下:hrst_n先释放—>完成csr模块寄存器配置—>释放srst_n。
在srst_n复位释放后,静态配置cfgmode不再发生改变。这种情况中,功能逻辑模块处于复位状态时,cfg*_mode发生跳变,这种情况下即使发生了亚稳态也没有影响,因为功能逻辑模块还没允许。