原文链接:https://www.cnblogs.com/nanoty/p/14969359.html
在进行后仿真的时候,我们经常会发现有人在仿真命令中增加了“+no_notifier”,从而使输出不定态导致的功能异常出现的情况神奇的消失了。那么,到底是为什么会出现这种情况呢?本文将以示例说明notifier到底是干啥滴!
Notifier在英文中的意思是通知人、通告人,在后仿真过程中他的作用就跟他的英文意思一样。在代码中,notifier是一个reg类型,常作为SystemTimingCheckTask(常用的task如下表所示)的一个参数。
当检测到存在违例时,参数notifier就会发生变化,然后改参数的变化一般会影响到模拟触发器行为的udp(User Defined Primitive)中的真值表行为,从而使触发器模型输出不定态,最终将不定态反映到仿真输出上,其执行过程示意图如下:
所以在声明notifier的module中一般都会存在SystemTimingCheckTask的调用,否则SystemTimingCheckTask监测到的违例将不能通过notifier反映出来。
【示例】
示例中,notifier一般都存在于系统时序检查任务(SystemTimingCheckTask)的参数列表中,当检测到时序违例时,时序检查任务会改变notifier的值,然后示例中udp_dff会检测到notifier值的变化,然后udp_dff会根据notifier的变化查找其中定义的真值表,最后输出相应的值(一般会输出不定态),反映出违例发生。
一般情况下,只要违例发生并且notifier存在于时序检查任务的参数列表中,此时notifier的值都会发生变化,其值变化的一般规律如下表所示:
这里需要注意,如果notifier不包括在时序检查任务中,那么该时序检查任务在检测到违例时,并不会改变notifier的值,也不会通过udp将该违例反应在具体的波形输出上,从而很容易导致时序违例被忽略掉。
另外,在一般操作过程中,不要人为改变notifier的值,这样可能会导致notifier的变化出现不期望的情况,因为notifier的作用就是通知违例发现了,结果人为修改了就可能会导致没有发生违例结果udp反映出发生了违例。也不要把notifier的值改为z,此时如果发生违例了,也不会改变notifier的值,因为此时违例发生前后notifier的值都是z,udp就不会发现notifier发生变化。
由此我们也可以知道,如果不想让notifier的变化影响到仿真结果,其实完全可以将notifier从时序检查任务的参数列表中删除,但是这样做修改一个标准单元还可以,面对成千上万的标准单元如果这样修改下去是会死人的。为此,目前基本上所有的主流EDA工具都提供了一个仿真命令参数“+no_notifier”,通过这个命令参数可以使时序检查任务中检测到时序违例后,不影响其参数列表中的notifier的值,从而避免了notifier变化引起udp输出不定态的情况,该命令仅对notifier的值有影响,对于时序检查任务检测到的时序违例不产生任何影响,如下例所示。
【示例】
【仿真结果】
Elaboration时不使用“+no_notifier”参数仿真结果如下:
Elaboration时使用“+no_notifier”参数仿真结果如下:
通过仿真波形可以观测到,使用“+no_notifier”之后,时序检查任务参数列表中的notifier未发生变化,从而屏蔽了notifier变化对于UDP的影响,即q的输出此时不会出现不定态,保证了标准单元输出状态的确定。
虽然在具体的仿真波形上使用“+no_notifier”和不使用“+no_notifier”有差别,但是具体的违例信息是相同的,如下图所示:
示例中,在没有使用“+no_notifier”时,当检测到违例,此时时序检查任务会改变notifier的值,dff_udp中的真值表检测到notifier发生变化(*:相当于??,即notifier发生任何变化的意思),此时的输出q为x(不定态)。使用“+no_notifier”时,尽管可以检测到违例,但是此时时序检查任务不会改变notifier的值(notifier没有变化),也就不会影响dff_udp的输出。
可见,不管是否使用“+no_notifier”都不会影响违例信息的产生和报出,虽然使用“+no_notifier”可以避免标准单元输出不定态,但是这样就存在一个潜在的问题,因为标准单元此时输出为确定的状态,确定的状态一般也就不会影响后续电路的执行,从而如果忽略log文件将会很容易遗漏一些违例信息,为此从严谨的角度出发,除了仿真波形直观的反应以外,必须对于后仿真的log文件中的违例信息进行详细的筛查。