跨时钟域验证可分为结构验证和功能验证两类。
结构验证确保在需要的地方添加了适当的同步逻辑。
功能验证确保已添加的逻辑实现了预期的功能。
仅通过执行结构验证,就可以检测到许多CDC问题。这些检查比功能验证更简单、更快。因此,验证应从结构检查开始,检测到的问题应在转向功能验证之前进行修复。
基于规则的检查是执行结构验证的一种非常有效的方法。断言可以在设计中使用一些EDA工具自动推理证明,也可以将它们插入到RTL中带入仿真环境,这两种技术都有各自的优缺点。
仿真结果取决于所使用的测试向量的质量。如果所应用的测试向量不能触发问题,那么该问题可能不会被检测到。很难确定正确的测试向量集,从而提供良好的覆盖范围。与仿真相比,形式化技术提供了更好的覆盖范围,并且不需要提供任何测试向量。然而,由于状态空间爆炸,形式化技术存在一些性能问题。因此,这些检查不用于全芯片分析,但它们在模块级别上工作得相当好。
验证跨时钟域问题可以按照以下几个步骤:
Step 1
检查以下场景中是否存在有效的同步器:
1、跨异步时钟域
2、存在亚稳态问题的同步跨时钟域
一个级联触发器同步器可能足以确保不会存在亚稳态传播。然而,仍然可能存在数据不一致的问题。因此,建议在这个阶段只检查级联触发器同步器是否只用于单比特变化信号。如果缺少同步器,设计人员应修改设计以添加适当的同步逻辑。
Step 2
检查是否存在单独同步的汇聚信号,这可能会导致数据不一致的问题。单独同步的汇聚信号数据应是 Gray-encoded。下图显示了一个控制总线时钟域交叉,它使用级联多触发器进行同步,但没有进行Gray-encoded。此时,将为断言失败生成一个波形轨迹。
如果汇聚信号不能进行Gray-encoded,则将同步方案更改为使用公共控制信号的同步方案,例如,MUX再循环、FIFO或握手。这些方案仍然需要进行验证,以实现预期功能。
Step 3
一旦添加了适当的同步逻辑并完成了Gray-encoding检查,下一步是验证在将数据从一个时钟域传输到另一个时钟域时没有数据丢失。这需要对以下两种情况进行检查:
同步跨时钟域:
1、同步跨时钟域从快时钟域到慢时钟域
2、同步跨时钟域从慢时钟域到快时钟域,时钟边沿可能连续多拍非常靠近
3、异步跨时钟域
可以通过断言每个源数据始终能够在目标时钟域采样到。对于其他同步方案,可以进行一些标准的功能检查,以确保没有数据丢失。
Step 4
在所有使用某些特殊同步方案的情况下,都需要验证它们是否正确地执行了预期的功能。这对于确保不传播亚稳态、数据不一致性或数据丢失问题非常重要。这里给出了三个常用方案所需的检查:
握手同步:检查request-data和request-acknowledge协议是否符合规范要求。
FIFO同步:检查是否没有FIFO overflow 或underflow。
Mux recirculation:检查当同步控制信号EN_Sync拉高时,是否保持“源数据A稳定并且目的时钟中至少有一个有效边沿”。
作者:验证哥布林
原文链接:https://mp.weixin.qq.com/s/ZBCxDX2_hDjkrXLhaywkxw
微信公众号:
推荐阅读
更多IC设计技术干货请关注IC设计技术专栏