多异步时钟设计的同步浅谈

本文深入探讨了多异步时钟设计中常见的亚稳态问题及其解决方案,包括双触发器同步器的原理,静态时序分析的重要性和多时钟设计的挑战。文章还介绍了如何在不同时钟域间正确传递控制信号和数据,以及使用握手信号和FIFO进行数据路径同步的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

亚稳态

引用Dally和Poulton关于亚稳态的话:
“当用时钟对变化的数据信号进行采样时…采样数据信号的顺序决定了结果。采样之间的时间差越小,确定哪个数据信号首先采样的时间越长。当两个采样时间非常接近时, 决策过程可能需要比分配的时间更长的时间,并且会发生同步失败。“
在这里插入图片描述
图1显示了当在一个时钟域中生成的信号被采样得太接近来自另一个时钟域的时钟信号的上升沿时发生的同步故障。 同步失败是由输出变为亚稳态引起的,并且在输出必须再次采样时不会收敛到合法稳定状态。
图2显示亚稳态输出可能导致非法信号值在整个设计中传播。
在这里插入图片描述
在任何设计中使用的每个触发器都具有指定的建立和保持时间,或者在时钟上升沿之前和之后法律上不允许更改数据输入的时间。 该时间窗口被精确地指定为设计参数,以防止数据信号变得太接近于可能导致输出变为亚稳定的另一同步信号。

同步

引用Dally和Poulton关于亚稳态的书:
“同步器是一种对异步信号进行采样并输出信号版本的设备,该信号具有与本地或采样时钟同步的转换。”
数字设计人员使用的最常见的同步器是双触发器同步器,如图3所示。
在这里插入图片描述
第一个触发器将异步输入信号采样到新的时钟域,并等待一个完整的时钟周期,以允许第一级输出信号上的任何亚稳态衰减,然后通过相同的时钟将第一级信号采样到 第二级触发器,其目标是第2级信号现在是一个稳定且有效的信号,同步到新的时钟域。
理论上,在将信号计时到第二级以使第二级信号也变为亚稳态时,第一级信号仍然可以充分地亚稳定。 同步失败之间的时间概率(MTBF)的计算是多个变量的函数,包括用于产生输入信号和为同步触发器计时的时钟频率。
对于大多数同步应用,两个触发器同步器足以消除所有可能的亚稳态。

静态时序分析

执行静态时序分析是验证设计中的每个信号路径是否满足所需的时钟周期时序的过程,无论是否所有信号路径都是可能的。静态时序分析不用于验证设计的功能,只是设计符合时序目标。理论上,时序验证可以通过设计之后运行具有SDF标准时延文件的门级仿真来完成,即动态时序验证。
静态时序分析与动态时序验证相比有三个主要优点:
(1)静态时序分析工具验证任意两个连续元素之间的每条路径,
(2)静态时序分析不需要生成任何测试向量,
(3)静态时序分析比动态时序分析更快。

对具有两个或更多异步时钟的模块进行时序分析容易出错,且难度很大,耗时。

对于具有两个或更多异步时钟作为输入的RTL模块,设计人员需要向静态时序分析工具指示应忽略哪些信号路径。 这是通过在从一个时钟域到另一个时钟域的信号上“设置错误路径”来实现的。

在设计的时候应遵循三条准则:

准则1:使用时钟命名约定来识别设计中每个信号的时钟源,使用同一个时钟的话,应遵循那个始终的命名约定(UCLK,UDATA,UWRITE等)。
原因:命名约定可帮助所有团队成员识别设计中每个信号的时钟域,就像 vClk 给Video Clock ,dClk 给 display clock.,rest_n。n代表低电平有效等等。

准则2:每个模块只允许一个时钟。
原因:在单时钟模块或单时钟模块组上更容易实现静态时序分析和创建综合脚本。

准则3:对设计进行分区,为从一个时钟域传递到另一个时钟域的每组信号创建一个同步器模块。
使用命名约定,所有处理器时钟生成的信号(u信号)将用作可能由视频时钟计时的模块的输入。该模块被称为“sync_u2v”模块,RTL代码只做每个u信号输入,并通过vClk提供的一对触发器运行它。除了vClk和复位输入之外,“sync_u2v”模块的每个其他输入信号都有一个“u”前缀,来自同一模块的每个输出信号都有一个“v”前缀。
给出从一个时钟域传递到另一个时钟域的任何信号都将具有建立和保持时间问题。 、
同步器模块不需要最坏情况(最大时间)时序分析。 在第一级和第二级触发器之间只需要最佳情况(最短时间)时序分析,以确保满足所有保持时间。 此外,可以更轻松地配置门级仿真,以忽略每个同步器第一级上的建立和保持时间违规。
多时钟设计需要一些RTL模块将信号从一个时钟域传递到在不同时钟域内计时的模块。这个时候需要创建单独的同步器模块,允许来自一个且仅一个时钟域的信号同步到新时钟域的模块中。

通常,如果有n个异步时钟域,则设计将需要n(n-1)个同步器模块,每对时钟信号对应两个(例如:使用uClk和vClk信号:所需的两个同步器模块将是sync_u2v和sync_v2u)。只有在两个特定时钟域之间没有信号传递时,才需要一对同步器模块。
如图4.
在这里插入图片描述

设计问题分析

传送到一个较慢的时钟域

当在时钟域之间传递一个控制信号时,如果遵循其他规则(下面描述),则简单的双触发器同步器通常就足够了。
当尝试将控制信号从较快的时钟域传递到较慢的时钟域时,会出现此规则的例外情况,控制信号必须比较慢的时钟的周期时间宽。 如果控制信号仅在一个快速时钟周期内被置位,则控制信号可以在较慢时钟的上升沿之间变为高电平和低电平,而不会被捕获到较慢的时钟域中,如图5所示。
在这里插入图片描述
解决方案:
将控制信号置位超过采样时钟周期时间的一段时间,如图6所示。假设控制信号将被接收器至少采样一次,可能两次采样 时钟。
在这里插入图片描述

传送多个控制信号

工程师在进行多时钟设计时经常犯的错误是将多个控制信号从一个时钟域传递到另一个时钟域,并忽略了控制信号排序的重要性。 简单地在所有控制信号上使用同步器并不总是足够好,如以下示例所示。

1.问题 – 两个同时需要的控制信号。

在图8所示的简单示例中,新时钟域中的寄存器需要加载信号和使能信号,以便将数据值加载到寄存器中。 如果从一个时钟域发送加载和使能信号,则控制信号之间的小偏斜可能导致两个信号在新时钟域内被同步到不同的时钟周期。 在此示例中,这将导致不加载寄存器的数据。
在这里插入图片描述
解决方案: 如图9所示,仅通过一个控制信号驱动新时钟域中的负载和使能寄存器输入信号。
在这里插入图片描述

2.问题 – 两个相移序列控制信号

图10中的图表显示了两个使能信号aen1和aen2,用于通过短流水线设计实现数据信号的顺序传递。 问题是在第一个时钟域中,aen1控制信号可能在aen2控制信号有效之前稍微终止,而第二个时钟域可能会尝试在这个微小时间间隔的中间对aen1和aen2控制信号进行采样,从而导致 在第二时钟域中的使能控制信号链中形成一个单周期间隙。 这将导致第二个触发器错过a2输出信号。
在这里插入图片描述
解决方案:
如图11所示,是仅将一个控制信号发送到新的时钟域,并在新的时钟域内产生第二个相移的顺序控制信号。
在这里插入图片描述

3.两个编码控制信号

图12中的图表显示了在时钟域之间传递的两个编码控制信号。 如果两个编码信号在采样时稍微偏斜,则可以在新时钟域中的一个时钟周期产生错误的解码输出。
在这里插入图片描述
解决方案:
发送整形使能信号以充当新时钟域中的“就绪标志”。 发送解码器输入后,发送时钟域必须在一个时钟周期内产生并使能信号。 发送时钟域还必须在取消断言解码器输入之前一个时钟周期移除使能信号。 如前所述,必须将使能信号置为持续时间段,该时间段长于接收时钟域的周期时间。如图13:
在这里插入图片描述
在最坏情况下,整形使能信号将在编码输入被采样到接收时钟域的同时被采样,或者整形使能信号将在编码输入被去除的同时被解除断言。在接收时钟域中声明。在最佳情况条件下,整形使能脉冲将在比编码输入的断言晚一个接收时钟周期被断言,并且在编码输入的解除断言之前取消断言一个接收时钟周期。此方法可确保编码输入在启用到接收时钟域之前有效。

如图14所示,该问题的第二种解决方案是在发送时钟域中对信号进行解码,然后通过同步器将解码的输出(其中只有一个输出被断言)发送到新的时钟域。在新的时钟域内,状态机用于确定新的解码输出。
在这里插入图片描述
每当有多个控制信号跨越时钟边界时,必须小心以确保所传递的控制信号的顺序是正确的,或者控制信号的任何潜在的错误排序都不会对设计的正确操作产生不利影响。

数据路径同步

将数据从一个时钟域传递到另一个时钟域是在时钟域之间传递多个随机变化的信号的示例。 使用同步器来处理数据传递通常是不可接受的。 使用同步器对多位数据更改进行错误采样的机会太多了。
在时钟域之间同步数据的两种常用方法是:
(1)使用握手信号在时钟域之间传递数据,
(2)使用FIFO(先进先出存储器)

握手信号

可以使用两个或三个握手控制信号在时钟域之间传递数据,具体取决于应用程序和设计工程师的喜好。
在握手时,使用的控制信号越多,将数据从一个时钟域传递到另一个时钟域的延迟就越长。 使用握手的最大缺点是传递和识别传输的每个数据字的所有握手信号所需的延迟。
对于许多开放式数据传递应用程序,简单的双线握手序列就足够了。发送方将数据放入数据总线,然后将“data_valid”信号同步到接收时钟域。当在新时钟域中识别出“data_valid”信号时,接收器将数据计时到新时钟域中的寄存器(数据应该在发送时钟域中至少两个上升时钟沿稳定)然后通过通过同步器向发送方发出“确认”信号。当发送方识别出同步的“确认”信号时,发送方可以将被驱动的值改变为数据总线。
在某些情况下,使用通过同步器从接收器发送到发送器的第三控制信号“就绪”可能是有用的,以指示接收器确实“准备好”接收数据。当“data_valid”信号为真时,不应声明“就绪”信号。当“data_valid”信号被解除断言时,“就绪”信号可以传递给发送者。当然,随着增加的握手信号,同步和识别第三控制信号的延迟更长。

FIFO

参考上一篇博客。

Simulation Issues

通过同步器跨越时钟边界的信号将经历建立和保持违规,这就是为什么将同步器添加到设计中,以滤除信号的亚稳态效应,该信号变化太接近新时钟域时钟信号的上升沿。
在多时钟设计上进行门级仿真时,触发器的ASIC库模型使用建立和保持时间表达式建模,以匹配实际触发器的时序规范。 ASIC库通常模拟触发器,以在发生时序违规时驱动触发器输出上的X(未知数)。在模拟门级同步器时,建立和保持时间违规可能导致ASIC库发出建立和保持时间错误消息,并且有问题的信号经常被驱动为X值。在尝试验证整个门级设计的功能时,这些X值传播到设计的其余部分,从而导致问题。
大多数Verilog仿真器都有一个命令选项来忽略所有的时序检查,但是这也会忽略对设计其余部分的所需时序检查。
对于同步器中使用的任何ASIC库触发器,可以将建立和保持时间设置更改为零,但这会导致对同一类型触发器的所有实例进行所有设置和保持时间检查设置为零,包括您可能想要用来测试设计其余部分的触发器。

Bhatnagar提出的一种解决这个问题的方法是使用Synopsys命令来修改设置的SDF反向注释标准延时文件,并在设计中的第一级触发器单元上保持时间。 Bhatnagar指出SDF文件是基于实例的,因此更容易实现针对违规单元的建立和保持时间。 Bhatnagar注意到:不是手动从SDF文件中删除设置和保持时间结构,更好的方法是将SDF文件中的设置和保持时间清零,仅用于违反的触发器,即替换现有的设置和保持时间数字为零。
Bhatnagar进一步指出,设置保持时间为零意味着不存在时序违规,因此没有未知数传播到设计的其余部分。 由Bhatnagar给出的以下dc_shell命令用于使设置和保持时间为零:

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

对同步器的第一级触发器的输出使用创造性命名约定可能使得通配符表达式可以容易地反对所有第一级触发器SDF设置,并使用极少数dc_shell命令将时间值保持为零。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值