数字电路中的Multi-bits跨时钟域设计

跨时钟域同步设计

跨时钟域处理目标

在跨时钟域同步设计中,我们需要达到的主要目标就是 100% 确保数据(事件)在跨时钟域当中的完整性。数据(事件)的完整性包括了:

  1. 数据(事件)的值不能错;
  2. 数据(事件)的顺序不能错;
  3. 数据(事件)的个数不能错;
  4. 在跨时钟域同步设计中,不能出现metastable现象。

Multi-bits的Clock Domin Crossing (CDC) 电路设计

在之前的文章数字电路中的Single-Bit跨时钟域设计中我们提出了通过打两拍的方式将跨时钟域的单bit信号进行同步,那么我们对于多bits的信号也可以如下图一样,将每一bit的信号都通过打两拍的方式跨时钟域同步吗?

Multi-bits跨时钟域同步错误示例

这样设计是错误的。原因如下图所示,当DFF处于CK->Q之间的延迟时间中,每一个bit的跨时钟域同步传输可能出现metastable现象也可能不出现metastable现象,可能同步结果数据与同步前一致也可能不一致。这样的话,就会在CK->Q延时期间出现和预测不符的结果,影响电路的正常运转。

Multi-bits跨时钟域同步错误示例_2

1-bit “Guard” 信号同步multi-bits数据

在这里我们介绍一种比较简单可行的多bit数据信号跨时钟域同步设计——一种基于1-bit “Guard” 信号同步multi-bits数据的方法。

如上图所示,在设计多bits数据CDC电路的时候,我们通过添加“Guard“信号——vld和vld_sync,来保证当异步时钟可以稳定的传输数据的时候,再抓取数据信号进行传输。整个过程分为4步:
1-bit "Guard" 信号同步multi-bits数据

  1. Step 0:当clk0中的多bits的数据信号需要被传输的时候,将vld信号拉高,并通过两级DFF打两拍的方式输出clk1中稳定的vld_sync信号;
  2. Step 1:当vld_sync信号被拉高,表示时钟域已经稳定,将需要同步的data信号进行传输,输出data_sync信号。同时通知clk0时钟域,clk1已经接收到了信号;
  3. Step 2: 当clk0接收到了clk1传递的信号,并且data信号传输完毕之后,vld信号拉低,并通过两级DFF传递给vld_sync信号;
  4. Step 3:最后vld_sync接收到信号,并返回通知给vld信号进行最后一次shake。

经过这4步,一个完整的data sync time就完成了。

其他的Multi-bits跨时钟域同步设计

那么我们的多bits跨时钟域同步设计效率还可以更高一点吗?

通过"Guard"信号进行多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核,例如:

  1. 使用Synopsys DesignWare (DW) 里面的Async_FIFO IP核;
  2. 使用公司经过tap-out验证的Async_FIFO IP核;
  3. 使用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。这些工具会检查电路是否为同步电路,电路结构是否正确,是否在错误的位置放置了组合逻辑电路或时序逻辑电路。


  1. Simulation and Sythesis Techniques for Asyncronous FIFO Design —— Clifford E.Cummings ↩︎

  2. Sytnesis and Scripting Techniques for Designing Multi-Asynchronous Clock Designs —— Clifford E.Cummings ↩︎

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值