多异步时钟设计(3)

5.0 命名约定和设计分区

命名约定有助于确保良好的团队沟通,并有助于使用脚本语言来收集和分组与特定时钟相关的设计中的所有信号。良好的设计划分可以显着减少合成和验证多时钟设计时序的工作量。本节将讨论推荐的命名约定和设计分区。

有两种方法可以解决潜在的CDC问题:
(1)验证设计符合合格的CDC规则,
(2)避免问题。
这两种方法都很有价值,应该用于确保无差错设计。

第一种方法是验证CDC设计规则,通常需要使用特殊工具来检查设计是否存在可能的CDC违规。
第二种方法,避免问题,可以通过采用如下概述的一些良好的编码指南来完成。

5.1时钟和信号命名约定

各种设计团队已经使用了许多有用的时钟和信号命名约定。

指南:使用时钟命名约定来识别设计中每个信号的时钟源。

原因:命名约定可帮助所有团队成员识别设计中每个信号的时钟域,并使用合成脚本中的正则表达式“wild-carding”更容易地进行时序分析信号分组。

一种经过验证的命名约定要求使用前导字符来标识各种异步时钟域。示例包括:用于微处理器时钟的uClk,用于视频时钟的vClk和用于显示时钟的dClk。

然后将每个信号同步到设计中的一个时钟域,并且每个信号名称用前缀字符标记以标识用于生成该信号的时钟域。例如,由uClk生成的任何信号都在信号名称中标有u前缀,例如uaddr,udata,uwrite等。由vClk生成的任何信号都类似地用v-prefix标记。信号名称,例如vdata,vhsync,vframe等。相同的信号命名约定用于设计中任何其他时钟生成的所有信号。
使用这种技术,设计团队中的任何工程师都可以轻松识别设计中任何信号的时钟域源,并直接使用信号或通过适当的同步传递信号,以便信号可以在新的时钟域内使用。
确切的命名约定并不重要,但项目中的每个工程师都同意遵守团队选择的命名约定至关重要。命名约定将极大地提高设计团队的工作效率。

5.1.1没有命名约定的多时钟/多源模块

如果您的团队没有使用任何特定的面向时钟的信号命名约定,并且如果允许模块具有多个时钟输入,那么CDC分析工具可能无法正确设置并且很容易错过错误的CDC设计实践。

即使您的团队可以访问良好的CDC分析工具,我强烈建议您采取一些简单的步骤来分析和识别潜在的CDC设计问题,以便更容易识别和调试。

5.2每个时钟域的定时验证

要验证任何设计的时序,必须验证设计中每个时钟域的时序是否满足。尽管在过去十年中工具已经得到改进,以帮助在单独的时钟域中自动分析和验证信号,但使用良好的分区和命名约定来处理多时钟设计仍然是一种很好的做法。

通过将设计划分为每个模块仅允许一个时钟,静态时序分析对于设计中的每个域而言变得非常容易。

5.3面向时钟的设计分区

一些最简单和最好的设计分区方法是使用时钟边界处的设计分区来实现的。

指南:每个模块只允许一个时钟。

原因:在单时钟模块或单时钟模块组上更容易实现静态时序分析和创建综合脚本。

例外:将来自所有不同时钟域的信号连接在一起的顶层模块自然会将所有时钟作为该模块的输入。最大限度地减少多时钟验证工作,只允许顶层模块具有多个时钟输入。

指南:将设计块划分为一个时钟模块。

原因:可以使用STA(静态时序分析)工具轻松验证完全同步子块的时序验证,并将设计块划分为多个 -

时钟域子块将大型复杂时序分析任务转换为多个完全同步的单时钟设计。

指南:创建同步器模块,将信号从一个时钟域传递到另一个时钟域,每个同步器模块只允许一个时钟。

原因:给出从一个时钟域到另一个时钟域的任何信号最终都会遇到建立和保持时间问题。隔离CDC边界逻辑可以显着减少多时钟设计的设计和验证工作。

在大多数情况下,同步器模块将是设计中唯一会遇到故意设置和保持时间违规的模块。在异步时钟域之间传递信号时,会发生时序违规,这就是为什么必须将同步器添加到设计中的全部原因。

在这里插入图片描述
考虑具有三个时钟域的示例设计,标记为aClk,bClk和cClk,如图30所示。在该设计中,所有aClk设计块已被分组为单个aClk逻辑块。所有的bClk设计模块都被分组到一个bClk逻辑模块中,同样我们创建了一个cClk逻辑模块。源自异步时钟域的任何信号在允许驱动另一个逻辑块的输入之前通过同步器模块。

5.3.1时钟分区模块的时序分析

使用面向时钟的设计分区策略,每个设计模块的所有输入和输出完全同步到一个时钟。这是使用静态时序分析(STA)工具验证的最简单设计类型,因为设计中没有错误路径。

将所有在每个时钟域内计时的设计模块组合在一起。应该为设计中的每个时钟域形成一组。这些组将进行时序验证,就好像每个组都是一个完全同步的独立设计。对于每个时钟域,我们只有一个设计模块,我们可以轻松地执行最坏情况(最大时间/设置时间检查)时序分析和最佳情况(最小时间/保持时间检查)时序分析。

同样使用这种面向时钟的分区策略,使用同步器模块隔离了每个CDC边界。每个同步器模块仅包括由ASIC或FPGA供应商提供的同步器单元(优选),或者使用成对连接的触发器构建以形成同步器等效单元。

如果同步器单元可从ASIC或FPGA供应商处获得并实例化到设计中,则无需验证这些模块的设置和保持时间,因为供应商应该已经创建了一个不违反设置或保持的单元布局触发器阶段之间的时间。

如果同步器是从RTL代码合成的,那么最重要的是执行最佳情况时序分析,以确保触发器不会放得太近,以至于第一级的输出可能会变得太快而不能满足第二阶段输入的保持时间要求。一位同事最近指出,如果布局工具恰好将两个同步器触发器放置在ASIC或FPGA芯片上,则应该执行最坏情况的时序分析。我同意这个更新的建议。

由于单独的同步器的分区,可以更容易地配置门级仿真,以忽略每个同步器的第一级上的建立和保持时间违规

RTL同步器的静态时序分析需要简单的set_false_path命令来从STA中删除输入。我们知道同步器的输入存在时序问题,这就是使用同步器的原因。

通过划分设计和同步器块以允许每个模块只有一个时钟,静态时序分析变得非常容易执行。用于解决多个时钟域问题的综合脚本命令现在变成了分组,识别错误路径和执行最小 - 最大时序分析的问题。

5.4 采用MCP公式

将时钟边界处的设计划分为单独的设计模块和同步器模块在大多数情况下都能很好地工作,但如果需要使用MCP公式在时钟域之间传递多个信号,那么传递给设计模块的一些信号可能会出现 来自不同的时钟域,如图31所示。
在这里插入图片描述

如果基于时钟的命名约定已用于设计中的信号,则具有异步输入的设计块仍然可以很容易地定时。 在对相关设计块执行STA之前,只需从分析中排除异步输入。

通常,只有同步器和MCP配方数据路径的输入需要“set_false_path”命令。 如果使用时钟前缀命名方案,则可以使用通配符轻松识别所有异步输入。 在图31中,要从bClk Logic块中的STA中排除adata总线,首先执行以下命令:

set_false_path-from { a* }

此命令应足以消除bClk STA的所有异步输入。

6.0多时钟门级仿真问题

当同步器识别CDC信号的建立和保持时间违规时,数字仿真模型通常会生成X.这经常会导致门级仿真失败。有哪些技术可以解决这个问题?

如5.3.1节所述,通过同步器跨越时钟边界的信号将经历建立和保持违规。这就是为什么将同步器添加到设计中,以滤除信号的亚稳态效应,该信号变化太接近接收时钟域时钟信号的上升沿。

6.1同步器门级CDC仿真问题

在多时钟设计上进行门级仿真时,触发器的ASIC库模型使用建立和保持时间表达式建模,以匹配实际触发器的时序规范。 ASIC库通常模拟触发器,以在发生时序违规时驱动触发器输出上的X(未知数)。在模拟门级同步器时,建立和保持时间违规可能导致ASIC库发出建立和保持时间错误消息,并且有问题的信号经常被驱动为X值。当尝试验证整个门级设计的功能时,这些X值传播到设计的其余部分,从而导致问题,如图31所示。
在这里插入图片描述

6.2从门级仿真中消除X传播的策略

解决每次信号违反同步器第一级设置或保持时间时X的不必要传播问题。

由于X传播发生在违反建立或保持时间时,几乎所有解决此问题的方法都涉及将建立和保持时间更改为0,因此不会出现设置或保持时间违规,因此,没有X-传播。

有些方法很糟糕,有些则很好。以下是为解决X传播问题而考虑的一些策略。

6.2.1模拟器命令关闭时序检查

大多数SystemVerilog仿真器都有一个命令选项来忽略所有时序检查,但是这也会忽略对设计其余部分的所需时序检查。

6.2.2将触发器设置和保持时间更改为0

对于同步器中使用的任何ASIC库触发器,可以将建立和保持时间设置更改为零,但这会导致对同一类型触发器的所有实例进行所有设置和保持时间检查设置为零,包括您可能想要用来测试设计其余部分的触发器。

6.2.3复制和修改新的触发器模型

您可以从ASIC库中复制触发器并将它们存储到具有不同名称的新SystemVerilog库中,将所有设置和保持时间设置为零,然后修改设计门级网表,替换所有第一级同步器ASIC库翻转-flops与修改后的库触发器没有时序检查,但这可能是一个容易出错且繁琐的过程,每次生成新的网表时都可能需要重复这个过程,或者可能需要创建一个makefile和脚本来自动生成每次生成新网表时的修改。

6.2.4 Synopsys set_annotated_check命令

Bhatnagar提出的一个有用的解决这个问题的方法是使用Synopsys命令来修改设置的SDF反向注释,并在设计中的第一级触发器单元上保持时间。 Bhatnagar指出SDF文件是基于实例的,因此更容易实现针对违规单元的建立和保持时间。 Bhatnagar指出:

不是手动从SDF文件中删除设置和保持时间结构,更好的方法是将SDF文件中的设置和保持时间清零,仅用于违反的触发器,即替换现有的设置和保持时间数字为零。

Bhatnagar进一步指出,设置保持时间为零意味着不存在时序违规,因此没有未知数传播到设计的其余部分。由Bhatnagar给出的以下dc_shell-t命令用于使设置和保持时间为零:

set_annotated_check
0 -setup -hold -from REG1/CLK -to REG1/D

对同步器的第一级触发器的输出使用创造性命名约定可能使得通配符表达式可以轻松地反向注释所有第一级触发器SDF设置并使用极少数dc_shell-t命令将时间值保持为零。
如果使用Synopsys DesignCompiler工具完成设计,这种技术是有效的,但是非Synopsys流程呢?

6.3消除X传播的其他策略

Clifford在2001年给出的第一个多时钟设计论文中分享了7.2到7.2.4节中描述的所有策略。

6.3.1使用多个SDF文件

请记住,删除不需要的X传播的关键是强制同步器输入的建立和保持时间为0,从而消除同步器输入上所有可能的建立和保持时间违规。
许多工程师告诉我他们实际上生成了两个SDF文件。第一个SDF文件具有整个设计的所有实际延迟,包括准确的设置和保持时间。然后工程师生成第二个SDF文件,只包含文件中包含的第一级触发器。在此文件中,设置和保持时间设置为0.一些工程师手动构建此文件,而其他工程师使用脚本生成此文件。

然后,工程师使用$ sdf_annotate命令读入第一个SDF文件。然后他们读入第二个SDF文件,该文件覆盖第一阶段同步器的数据输入的建立和保持时间。在读取两个SDF文件时,每个实例的最后一个SDF文件都会获胜。所有时序都被准确注释,然后修改了第一阶段同步器的时序检查。
这是一种聪明的技术,可以与生成SDF文件的任何工具流一起使用。

6.3.2具有支持SDF生成工具的供应商同步器单元

其他工程师已经说出了解决X传播问题的好方法,但该方法要求(a)控制单元库,或者(b)与ASIC供应商建立良好的工作关系。

该技术要求在两个触发器级之间创建具有适当放置关系的单独的同步器单元。要使此方法有效,供应商必须提供:

(1)实际的同步器单元 - 这些将被设置到设计中。

(2)用于仿真的同步器单元的SystemVerilog模型。

(3)SDF文件生成工具,它将为同步器单元生成0设置和0保持的SDF文件。

如果供应商可以提供此单元和这些功能,则只需要生成单个SDF文件,并对同步器单元进行适当的时序检查。

任何提供此功能的FPGA供应商的ASIC都会为他们的客户群做出巨大的贡献。我听说有些ASIC供应商提供这种功能。我不知道任何提供此功能的FPGA供应商。认识到大多数现代设计都是多时钟设计,我强烈要求所有ASIC甚至所有FPGA供应商都提供具有适当仿真和SDF文件工具支持的同步器单元。

6.3.3具有内置同步器支持的供应商

Clifford未在相关文档中列出此类供应商

6.4用于门级CDC仿真的多个SDF文件

该技术包括写出完整的SDF时序文件,然后手动或使用脚本,为所有同步器模块的第一级触发器生成第二个SDF文件。第二个SDF文件将所有设置和保持时间设置为0,然后使用$ sdf_annotate命令将两个SDF文件应用于设计。第一个SDF文件注释整个设计的所有实际时序,然后读取第二个SDF文件以覆盖第一阶段同步器的建立和保持时间。

这种技术的优势在于它可以用于所有使用所有工具的设计,而不仅仅是Synopsys ASIC设计。这是一种强烈推荐的技术。

6.5强制同步器通知程序输入为固定值

Verilog和SystemVerilog设置和保持时间检查($ setup,$ hold和$
setuphold)的内置时序检查具有可选的通知器输出。每当检测到时序违规时,此通知器输出将从0-1-X-Z切换。
大多数ASIC和FPGA触发器模型都是由Verilog用户定义原语(UDP)构建的,通知信号通常被列为UDP表的输入之一。每当通知器输入切换(由时序违规引起)时,触发器输出变为未知,并且未知是在门级触发器模型的输出上可见的。这些第一级触发器模型上的通知器可以强制到逻辑电平,以防止它们在模拟期间切换并导致触发器输出未知。

6.6 ASIC和FPGA库单元同步器

如果能够将完全表征的同步器单元实例化为设计,则ASIC和FPGA提供商可以使CDC设计更容易实现。高级ASIC供应商提供:

(1)表征的同步器单元。

(2)Verilog模型用于模拟同步器单元。

(3)SDF生成器生成SDF文件,该文件注释设置并将同步器单元上的保持时间设置为0,以避免在信号违反设置或保持时间时跨越CDC边界的X生成。

我知道没有提供此功能的FPGA供应商,但具有前瞻思维的FPGA供应商将为其先进的多时钟设计客户提供此类单元。

6.7具有随机延迟插入的仿真模型

多个同事已经提出了一个有趣的模型,它可以合成正确的同步器进行设计,但模拟随机循环延迟。

该模型的框图如图33所示,支持该模型的SystemVerilog代码如例6所示。

在这里插入图片描述

从框图中可以看出,该模型设计用于生成可合成同步器模型或用作具有可选延迟的仿真模型。

IEEE Std 1364.1-2002 Verilog RTL综合标准[6]要求兼容的综合工具在读取任何Verilog模型之前设置SYNTHESIS宏。虽然大多数综合工具在很大程度上忽略了IEEE Verilog综合标准的许多要求,但大多数工具都实现了这个很好的SYNTHESIS宏要求。

在读取此sync2 SystemVerilog代码之前设置SYNTHESIS宏的工具将选择用于推断两个触发器同步器的代码。

不设置SYNTHESIS宏的模拟器将读取sync2模型,忽略用于可合成模型的代码,并将在代码的“else”部分模拟模型。

该模型是参数化的,因此对于简单的1位CDC信号,可以使用相同的模型,宽度为1位的默认参数SIZE,或者可以将SIZE参数设置为多位宽度来实例化模型,以便同步器可用于捕获和同步多位总线,例如格雷码计数器。
在这里插入图片描述

模型的模拟部分包括一个名为DLY的SIZE-ed变量的默认声明。默认情况下,DLY变量初始化为0,这会导致整个sync2模型使用默认的两个触发器延迟进行模拟,但DLY变量可以从测试平台分层设置为可重现的1和0的随机值,从而导致一些总线中的位通过三个触发器级,而其他位通过仅两个触发器级。这可以模拟一组同步器的行为,其中某些位在比其他时钟边缘更早的时钟边沿上捕获,并允许模拟观察设计在多位数据路径中具有小偏斜的情况。

7.0总结和结论

时钟域交叉(CDC)错误可能导致严重的设计故障。通过遵循一些关键指导原则并使用完善的验证技术,可以避免这些昂贵的故障。

7.1推荐的1位CDC技术

在时钟域之间传递一位时:

•在发送时钟域中注册信号以消除组合建立。

•将信号同步到接收时钟域。可能需要多循环路径(MCP)公式。

7.2推荐的多位CDC技术

在时钟域之间传递多个控制或数据信号时,请使用以下策略之一:

•整合 - 在将信号同步到接收域之前,首先尝试将多个信号组合成发送时钟域中的1位表示。

•使用多周期路径(MCP)公式在时钟域之间传递多个信号

•使用FIFO传递多位总线,数据总线或控制总线。

•使用灰色代码计数器。

7.3推荐的命名约定和设计分区

使用基于时钟的命名约定。

尽可能将设计子块划分为完全同步的1时钟设计。

7.4多时钟门级CDC仿真的推荐解决方案

在门级仿真期间,CDC X传播仿真问题有多种有用的解决方案:

•使用Synopsys开关为同步器上的第一级触发器生成0设置和0保持时间。仅适用于Synopsys工具。

•使用多个SDF文件 - 本节后面介绍的良好技术。

•供应商提供同步器单元和适当的SDF工具 - 如果您的ASIC或FPGA供应商提供模型和工具(很少有人 - 请ASIC和FPGA供应商支持此功能),这是一个很好的解决方案

•使用创新的SystemVerilog模型来模拟同步问题。

本文中描述的技术旨在促进多时钟设计的稳健开发和验证。

8.0相关code

8.1 Common sync2 model - used by MCP formulation and FIFO synchronizer

sync2模型对于具有就绪确认设计的MCP配方(第8.2节中的源代码)和多位1深/ 2寄存器FIFO同步器(第8.3节中的源代码)都是通用的。
在这里插入图片描述

8.2 MCP formulation with ready-acknowledge source code

This model requires the sync2 model shown in section 8.1.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.3 Multi-bit 1-deep / 2-register FIFO synchronizer source code

This model requires the sync2 model shown in section 8.1.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值