我的HDL编译器(Quartus II)生成时序报告。在其中,节点具有“时钟偏斜”列。我发现的时钟偏斜的唯一定义是在TimeQuest文档中(请参阅第7-24页):
要为时钟到时钟的传输手动指定时钟不确定性或时滞,请使用
set_clock_uncertainty
命令。
因此,如果偏斜是“不确定性”,为什么我的某些时钟偏斜为负(例如-0.048)?时钟偏斜到底是什么?
我的HDL编译器(Quartus II)生成时序报告。在其中,节点具有“时钟偏斜”列。我发现的时钟偏斜的唯一定义是在TimeQuest文档中(请参阅第7-24页):
要为时钟到时钟的传输手动指定时钟不确定性或时滞,请使用
set_clock_uncertainty
命令。
因此,如果偏斜是“不确定性”,为什么我的某些时钟偏斜为负(例如-0.048)?时钟偏斜到底是什么?
Answers:
从维基百科:
时钟偏斜可以是正数或负数。如果时钟信号完全同步,则在这些寄存器处观察到的时钟偏移为零。
因此,一个寄存器的时钟偏移量相对于另一寄存器而言。由于它是相对的,因此可以是正数或负数。
一些插图:
以您提供的TimeQuest文档中定义的时钟内传输为例:
当寄存器到寄存器的传输发生在器件的内核中,并且源时钟和目标时钟来自同一PLL输出引脚或时钟端口时,发生时钟内传输。
因此,如果目标寄存器在物理上更接近时钟生成电路,那么时钟可能会在到达源寄存器之前到达目标寄存器,从而导致实际上是正的超前时钟偏斜。如果目标寄存器在源寄存器之后接收到时钟的沿,则时钟偏斜将滞后或为负。
换句话说,时钟偏斜是关于寄存器到寄存器传送中的时钟沿时间到达源地址寄存器相对于时间单位给定的两个独立寄存器之间的时间间隔的不确定性。
将该定义扩展为包括时钟间传输以及建立和保持时间会有些混乱。因此,将其视为两个寄存器之间的边沿或保持时间的“同步程度”可能更容易。我们倾向于将“同步”视为“同时发生”。但是事情很少会在完全相同的时间发生。因此,我们需要在那段时间容忍。公差通常用正负表示(即±)。
现代数字逻辑设备通常采用“同步设计实践”(*)设计:全局同步的边沿触发寄存器传输设计样式(RTL):所有时序电路均分解为连接到全局时钟信号CLK的边沿触发寄存器和纯粹的组合逻辑。
这种设计风格使人们可以快速设计数字逻辑系统,而无需考虑时序。只要从一个时钟沿到下一个时钟沿有足够的时间使内部状态稳定下来,他们的系统就会“正常工作”。
采用这种设计风格,除了弄清楚“该系统的最大时钟速率是多少?”以外,时钟偏斜和其他与时序相关的问题都无关紧要。
时钟偏斜到底是什么?
例如:
...
R1 - register 1 R3
+-+
->| |------>( combinational ) +-+
...->| |------>( logic )->| |--...
->|^|------>( )->|^|
+-+ ( ) +-+
| +--->( ) |
CLK | +->( ) CLK
| |
R2: | |
+-+ | |
...->| |->+ |
->|^|->--+
+-+
|
CLK
在实际的硬件中,“ CLK”信号永远不会真正在每个寄存器上同时精确地切换。的偏移时钟 t偏离-max是时钟相对于下游向上游时钟延迟(一):
Tskew(来源,目的地)=目的地时间-来源时间
其中source_time是上游源寄存器(在此情况下,R1或R2)上活动时钟沿的时间,而destination_time是下游目标寄存器(在此情况下,R3)上“相同”活动时钟沿的时间。 。
时钟偏斜的影响是什么?
(也许这里的时序图会更清楚)
为了使事情正常工作,即使在最坏的情况下,R3的输入在R3的建立时间或保持时间内也不得改变。更糟糕的是,为了使事情正常运行,我们必须设计这样的事情:
Tskew(R1,R3)<Tco-Th。
Tclk_min = Tco + Tcalc + Tsu-Tskew(R1,R3)。
哪里:
过多的正偏斜是无法缓解的灾难。正偏斜过大会(带有某些数据组合)会导致“潜行路径”,从而导致R3不在时钟N + 1处锁存“正确的数据”(先前在时钟N处锁存到R1和R2中的数据的确定性函数) ,在时钟N + 1锁存到R1和R2的新数据可能会泄漏通过,破坏组合逻辑,并导致错误的数据在“相同”时钟沿N + 1锁存到R3。
可以通过降低时钟速率来“修复”任何数量的负偏斜。这只是“坏”的意思,它迫使我们以较低的时钟速率运行系统,以便让R3的输入有时间在R1和R2在时钟沿N锁存新数据之后稳定,然后在R3之后在“下一个”时钟沿N + 1处锁存结果。
许多系统使用时钟分配网络,试图将时滞降低到零。违反直觉的是,通过小心地沿着时钟路径(从时钟发生器到每个寄存器的CLK输入的路径)增加延迟,可以提高时钟沿波前从一个寄存器的CLK输入到寄存器的实际传播速度。下一个寄存器的CLK输入要比光速快。
在Altera的文档中提到
“避免在时钟路径中使用组合逻辑,因为它会导致时钟偏斜。”
这是指许多人编写HDL,然后以某种方式导致将HDL编译到FPGA上,而这种方式会导致除全局CLK信号以外的其他东西来驱动某些寄存器的本地CLK输入。(这可能是“时钟门控”逻辑,以便仅在满足某些条件时才将新值加载到寄存器中;或者是“时钟分频器”逻辑,仅使N个时钟中的1个通过,等等)。本地CLK通常以某种方式从全局CLK派生而来-全局CLK滴答作响,然后本地CLK不改变,或者(在全局CLK之后短暂的延迟,信号通过“其他”传播)本地CLK改变一次。
当“其他”驱动下游寄存器(R3)的CLK时,它会使偏斜变得更正。当“其他”驱动上游寄存器(R1或R2)的CLK时,它会使偏斜变得更负。有时,无论是驱动上游寄存器的CLK还是驱动下游寄存器的CLK都具有几乎相同的延迟,从而使它们之间的偏移几乎为零。
某些ASIC内部的时钟分配网络经过精心设计,在某些寄存器上具有少量正时钟偏斜,这为组合逻辑上游提供了更多的稳定时间,因此整个系统可以以更快的时钟速率运行。这称为“时钟偏斜优化”或“时钟偏斜调度”,与“ 重定时 ”有关。
我仍然对set_clock_uncertainty
命令感到迷惑-为什么我要“手动指定”偏斜?
(*)一个例外: 异步系统。