三防平板方案-用户定义对时序冲突的响应
时间:2024-08-16 作者:乐凡信息 浏览:58


三防平板方案中时序检查提示符检可以用于打印描述冲突或者在器件输出端出现x的错误信息。

提示符是一个reg,在需要调用时序检查任务的模块中声明,它作为系统时序检查的最后一个参数。只要发生时序冲突,时序检查就更新提示符的值。

对所有的系统时序检查来说,提示符是一个可选的参数,可以从时序检查中去掉该参数而不会对时序检查产生不利的影响。


1.三防平板方案中精确仿真的要求

为了对负值时序检查准确建模,应满足下面的要求。

(1)如果信号在冲突窗口中(不包括结束点)发生改变,将触发时序冲突。小于两个单位仿真精度的冲突窗口,将不产生时序冲突。

(2)在冲突窗口内(除去结束点),锁存数据应该是一个稳定的值。

三防平板方案中为了便于这些建模要求,在时序检查中,产生数据和参考信号的延迟复制版本。在运行时,用于内部时序检查评估。调整内部所使用的建立和保持时间,以移动冲突窗口,使它和参考信号重叠。

在时序检查中,声明延迟数据和参考信号。这样,可以在模型的功能实现中使用它们,以保证精确的仿真。如果在时序检查中,没有延迟信号,并且出现负的建立时间和保持时间,则创建隐含的延迟信号。三防平板方案中由于在定义的模块行为中不能使用隐含的延迟信号,这样的一个模型可能有不正确的行为。【例1.41】隐含延迟信号Verilog HDL描述的例子1。

为CLK和DATA创建隐含延迟信号,但是不可能访问它们。$setuphold检查将正确地评估。但是,功能行为不总是正确的。如果在CLK的上升沿和10个时间单位后,DATA跳变,则时钟不正确地获取前面的DATA数据。【例1.42】隐含延迟信号Verilog HDL描述的例子


2.三防平板方案中为CLK、DATA1和DATA2创建隐含延迟信号,即使在两个不同的时序检查中都引用CLK,仍然只创建一个隐含的延迟信号,并且用于所有的时序检查。【例1.43】隐含延迟信号Verilog HDL描述的例子3。

为CLK和DATA1创建明确的延迟信号del_CLK和del_DATA1,而为DATA2创建了隐含的延迟信号。换句话说,CLK只创建了一个延迟信号del_CLK,而不是为每个时序检查都创建一个延迟信号。

信号的延迟版本,不管是隐含的还是明确的,可以用在$setup、$hold、$setuphold,、$recovery、$removal、$recrem、$、$period和$nochange时序检查中。这些检查将相应地调整其限制。这将保证在正确的时刻切换提示符。如果调整后的限制小于或等于0,则将限制设置为0,仿真器将产生一个警告。

信号的延迟版本不可以用于$skew、$fullskew和$timeskew时序检查。因为它可能导致信号跳变顺序的逆转,导致模型剩余部分在错误时间切换用于时序检查的提示符,导致在取消一个时序检查冲突时跳变到x。这个问题可以通过为每个检查使用单独的提示符来解决。

三防平板方案中对负的时序检查值,可以会出现相互之间的不一致,并且对于延迟信号的延迟值没有解决的方法。在这些情况下,仿真器将产生警告信息。可以将最小的负限制值改为0,并且重新计算延迟信号的延迟,并且通过反复计算直到找到一个解决方案为止。这样,可以解决不一致的问题。因为在最坏情况下,所有负的限制值都变为0,不需要延迟信号。所以,这个过程总是可以找到一个解决方案。

当出现负限制值的时候,延迟时序检查信号才真正地被延迟。如果一个时序检查信号被多个该信号到输出的传播延迟所延迟,将花费比它传播延迟更长的时间来改变输出。它将在相同的时间(被延迟的时序检查信号发生变化的时间)取代跳变。这样,输出的行为就好像它的指定路径延迟等于应用到时序检查信号的延迟。只有为数据信号的每个边沿给出唯一的建立/保持或去除/恢复时间时,才产生这种情况。【例1.44】隐含延迟信号Verilog HDL描述的例子4。

建立时间是−7(−3和−7中,较大的绝对值),为dCLK创建延迟7。因此,在CLK的上升沿之后的7个时间单位输出Q才发生变化,而不是在指定路径中给出的6个时间单位。2.负时序检查的条件

通过使用“&&&”操作符,可以使条件与参考信号和数据信号相关。但是,当建立或保持时间为负时,条件需要以更灵活的方式与参考信号和数据信号配对。

三防平板方案中下面的$setup和$hold检查将一起工作以提供和单个$setuphold相同的检查:

在$setup检查中,clk是时间检查事件;而在$hold检查中,data是时间检查事件。不能用一个$setuphold表示。因此,提供额外的参数,使得用一个$setuphold表示成为可能。这些参数是timestamp_cond和timecheck_cond。下面的$setuphold等效于分开的$setup和$hold: