在进行后仿真的时候,我们经常会发现有人在仿真命令中增加了“+no_notifier”,从而使输出不定态导致的功能异常出现的情况神奇的消失了。那么,到底是为什么会出现这种情况呢?本文将以示例说明notifier到底是干啥滴!
Notifier在英文中的意思是通知人、通告人,在后仿真过程中他的作用就跟他的英文意思一样。在代码中,notifier是一个reg类型,常作为SystemTimingCheckTask(常用的task如下表所示)的一个参数。
时序检查系统任务 |
说明 |
$setuphold<setup> |
检查建立时间和保持时间,当setup违例时,出现此信息 |
$setuphold<hold> |
检查建立时间和保持时间,当hold违例时,出现此信息 |
$setup |
检查建立时间 |
$hold |
检查保持时间 |
$recovery |
检查恢复时间(以复位信号为例,可以理解为rst必须在时钟沿之前的有效的最小时间),一般用于复位、置位等 |
$removal |
检查撤销时间(以复位信号为例,可以理解为rst必须在时钟沿之后的有效的最小时间),一般用于复位、置位等 |
$recrem |
检查恢复和撤销时间,一般常用于复位、置位等 |
$period |
检查周期信号的最小周期,一般常用于时钟 |
$skew |
检查两个信号之间的最大时间差 |
$width |
检查脉冲的最小宽度 |
当检测到存在违例时,参数notifier就会发生变化,然后改参数的变化一般会影响到模拟触发器行为的udp(User Defined Primitive)中的真值表行为,从而使触发器模型输出不定态,最终将不定态反映到仿真输出上,其执行过程示意图如下:
所以在声明notifier的module中一般都会存在SystemTimingCheckTask的调用,否则SystemTimingCheckTask监测到的违例将不能通过notifier反映出来。
【示例】
示例中,notifier一般都存在于系统时序检查任务(SystemTimingCheckTask)的参数列表中,当检测到时序违例时,时序检查任务会改变notifier的值,然后示例中udp_dff会检测到notifier值的变化,然后udp_dff会根据notifier的变化查找其中定义的真值表,最后输出相应的值(一般会输出不定态),反映出违例发生。
一般情况下,只要违例发生并且notifier存在于时序检查任务的参数列表中,此时notifier的值都会发生变化,其值变化的一般规律如下表所示:
时序违例前 |
时序违例后 |
X(notifier默认值) |
0 |
0 |
1 |
1 |
0 |
z |
z |
这里需要注意,如果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文件中的违例信息进行详细的筛查。
更多技术内容,可关注下图个人技术微信公众号,欢迎朋友们关注沟通!