数字电路中的Multi-bits跨时钟域设计
- 跨时钟域同步设计
- 跨时钟域处理目标
- Multi-bits的Clock Domin Crossing (CDC) 电路设计
- 1-bit "Guard" 信号同步multi-bits数据
- 其他的Multi-bits跨时钟域同步设计
- 跨时钟域电路的仿真验证
跨时钟域同步设计
跨时钟域处理目标
在跨时钟域同步设计中,我们需要达到的主要目标就是 100% 确保数据(事件)在跨时钟域当中的完整性。数据(事件)的完整性包括了:
- 数据(事件)的值不能错;
- 数据(事件)的顺序不能错;
- 数据(事件)的个数不能错;
- 在跨时钟域同步设计中,不能出现metastable现象。
Multi-bits的Clock Domin Crossing (CDC) 电路设计
在之前的文章数字电路中的Single-Bit跨时钟域设计中我们提出了通过打两拍的方式将跨时钟域的单bit信号进行同步,那么我们对于多bits的信号也可以如下图一样,将每一bit的信号都通过打两拍的方式跨时钟域同步吗?
这样设计是错误的。原因如下图所示,当DFF处于CK->Q之间的延迟时间中,每一个bit的跨时钟域同步传输可能出现metastable现象也可能不出现metastable现象,可能同步结果数据与同步前一致也可能不一致。这样的话,就会在CK->Q延时期间出现和预测不符的结果,影响电路的正常运转。
1-bit “Guard” 信号同步multi-bits数据
在这里我们介绍一种比较简单可行的多bit数据信号跨时钟域同步设计——一种基于1-bit “Guard” 信号同步multi-bits数据的方法。
如上图所示,在设计多bits数据CDC电路的时候,我们通过添加“Guard“信号——vld和vld_sync,来保证当异步时钟可以稳定的传输数据的时候,再抓取数据信号进行传输。整个过程分为4步:
- Step 0:当clk0中的多bits的数据信号需要被传输的时候,将vld信号拉高,并通过两级DFF打两拍的方式输出clk1中稳定的vld_sync信号;
- Step 1:当vld_sync信号被拉高,表示时钟域已经稳定,将需要同步的data信号进行传输,输出data_sync信号。同时通知clk0时钟域,clk1已经接收到了信号;
- Step 2: 当clk0接收到了clk1传递的信号,并且data信号传输完毕之后,vld信号拉低,并通过两级DFF传递给vld_sync信号;
- Step 3:最后vld_sync接收到信号,并返回通知给vld信号进行最后一次shake。
经过这4步,一个完整的data sync time就完成了。
其他的Multi-bits跨时钟域同步设计
那么我们的多bits跨时钟域同步设计效率还可以更高一点吗?
如上图所示,可以同时使用vld信号的上升沿和下降沿作为“Guard”信号对多bits信号进行传输,提升数据传输效率。
那么,这种多bits的同步电路设计还可以再快一点吗?
当然可以。可以通过使用异步FIFO(Async FIFO)进行Multi-bits的跨时钟域同步。关于异步FIFO的设计,参考Clifford E.Cummings的两篇paper。 1 2 在使用Async FIFO的时候,因为CDC电路设计很难被RTL仿真验证或者被带delay的gate level后仿验证,所以建议使用成熟的、商业化的Async FIFO IP核,例如:
- 使用Synopsys DesignWare (DW) 里面的Async_FIFO IP核;
- 使用公司经过tap-out验证的Async_FIFO IP核;
- 使用ISE/Vivado工具自带的Async_FIFO IP核。
跨时钟域电路的仿真验证
每当我们设计完一个电路之后,我们都想将其进行仿真验证,在设计阶段就防止出现bug。但CDC通过RTL仿真是不能验证其正确性的,因为在RTL仿真当中,tool不会检查reg寄存器的setup/hold requirement,所以一定不会出现metastable现象。那么我们可以通过带delay的gate level后仿验证CDC电路的正确性吗?这种验证方法也是很难完整的验证CDC电路的。因为,第一,信号的翻转率可能不够。在同步电路的设计中,我们会将信号翻转,从“0”到“1”,从“1”到“0”,用于验证function的正确性。但在异步跨时钟域的电路中,我们不仅要验证function的正确,我们还要考虑在任意timing的条件下,这个CDC电路是否都正确完成指定的目标;第二,仿真时间不够长,没有把clk间的关系全部覆盖。跨时钟域电路的不同时钟源之间的关系是复杂的,比如时钟的频率、时钟的相位关系、时钟输入的latency等等。如果仿真时间不够长的话,clk间的关系没有覆盖完全,设计出来的电路也是有风险的;第三,在gate level后仿验证中,我们一般默认CDC电路会出现metastable现象,所以在第一级DFF的D pin上,我们不会进行timing check,即不会检查它的setup/hold requirement。如果DFF在cell library中的CK->Q延迟比较大,显示出来的最后Q pin输出了一个稳定的电平,我们也不能保证这个的电平是没有产生metastable现象的。
那么我们应该怎样保证CDC电路的正确性呢?第一,我们可以通过设计的电路结构保证,即grant by design;第二,通过工具检查CDC电路结构是否正确,比如:spyglass。这些工具会检查电路是否为同步电路,电路结构是否正确,是否在错误的位置放置了组合逻辑电路或时序逻辑电路。
Simulation and Sythesis Techniques for Asyncronous FIFO Design —— Clifford E.Cummings ↩︎
Sytnesis and Scripting Techniques for Designing Multi-Asynchronous Clock Designs —— Clifford E.Cummings ↩︎