verilog - 可能重置域交叉?
问题描述
我有一个控制时钟的 ICG。ICG 的启用由一个复位域驱动,例如 rst1。门控时钟驱动来自另一个复位域的触发器,例如 rst2。
这是“重置域交叉”(RDC)吗?spyglass/jasper 之类的工具是否可以像查找常规 RDC(存在于数据路径上)一样查找此问题?
解决方案
我将对此进行尝试,并提供一些我所看到的背景。
首先,我认为不存在“重置域交叉”之类的东西。我将其称为“涉及复位信号的时钟域交叉”。因为在时序逻辑中从一个点到另一个点时,复位与 D 或 Q 没有什么不同。
为了清楚起见,我们忽略 RST1/RST2,并根据 CLK1 和 CLK2 进行讨论。RST1 与 CLK1 同步(从取消断言的角度,如 Pradyuman Bissa 所述),RS2 与 CLK2 相同,但与 CLK2 同步。
这是一个 CDC 问题,很可能会被 CDC 工具捕获(我认为 Jasper 更多用于形式验证,因此它可能无法捕获此问题)。导致这种情况不会被 CDC 工具捕获的事情将是添加的任何类型的附加约束。假设您在 CLK1 和 CLK2 之间做了一些排除,或者您通配了一些排除或单元格。这些将从失败列表中删除它,因此您不会看到它。
在对具有 50 多个时钟的设计进行 CDC 评估后,我可以告诉您,故障列表太长了,您很有可能用不正确的排除/通配符来掩盖自己的错误。
该电路可能仍然有效。特别是如果 CLK1(门控)在复位解除后的某个时间启用。
因此,要回答您有关捕获它的工具的问题,是的,它可能会。在老人咆哮之前到此结束。
但我会争辩说,我相信 Pradyuman Bissa 所说的是,您应该创建一个模块/单元来为您提供此功能,而无需明确定义逻辑。这也可以让您减少一开始就引入 CDC 的机会。有时,消除这些错误的最佳方法是首先减少您犯这些错误的机会。
然后,您可以在需要门控时钟并伴随其他时钟域复位的任何时候实例化它。显然存在一些问题,需要确保来自 CLK2 的复位保持足够长的时间以使复位同步能够看到它。
我见过很多问题,人们采用这样的方法并手动放置逻辑,而不是仅仅创建一个特定的单元格并在需要时对其进行实例化。在总体设计方案中,该单元所需的门/触发器数量通常是最少的。
推荐阅读
- ranorex - 如何在 Ranorex 中使用全局变量?
- python - 如何将字节添加在一起并根据python中的校验和验证它们
- mysql - 查询“归属”的sql代码是什么?
- android - android数据绑定错误运行时/编译器
- guidewire - 戈苏(导线)
- python - Python pocketsphinx 0.1.15 配置与 pocketsphinx_continuous.exe 配置
- typescript - 如何在打字稿编译构建中包含自定义类型/命名空间
- javascript - 鼠标滚轮平滑滚动滚动条问题
- python - Python/matplotlib:如何更改绘图中每个第 n 个数据点的颜色和/或符号?
- oauth-2.0 - 身份服务器 4:如何添加 Instagram 登录工作流程