nanoty

导航

【仿真】后仿真中的notifier是奏啥滴!

在进行后仿真的时候,我们经常会发现有人在仿真命令中增加了+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就会发生变化,然后改参数的变化一般会影响到模拟触发器行为的udpUser Defined Primitive)中的真值表行为,从而使触发器模型输出不定态,最终将不定态反映到仿真输出上,其执行过程示意图如下:

 

所以在声明notifiermodule中一般都会存在SystemTimingCheckTask的调用,否则SystemTimingCheckTask监测到的违例将不能通过notifier反映出来。

【示例】

 

示例中,notifier一般都存在于系统时序检查任务(SystemTimingCheckTask)的参数列表中,当检测到时序违例时,时序检查任务会改变notifier的值,然后示例中udp_dff会检测到notifier值的变化,然后udp_dff会根据notifier的变化查找其中定义的真值表,最后输出相应的值(一般会输出不定态),反映出违例发生。

一般情况下,只要违例发生并且notifier存在于时序检查任务的参数列表中,此时notifier的值都会发生变化,其值变化的一般规律如下表所示:

时序违例前

时序违例后

Xnotifier默认值)

0

0

1

1

0

z

z

这里需要注意,如果notifier不包括在时序检查任务中,那么该时序检查任务在检测到违例时,并不会改变notifier的值,也不会通过udp将该违例反应在具体的波形输出上,从而很容易导致时序违例被忽略掉。

另外,在一般操作过程中,不要人为改变notifier的值,这样可能会导致notifier的变化出现不期望的情况,因为notifier的作用就是通知违例发现了,结果人为修改了就可能会导致没有发生违例结果udp反映出发生了违例。也不要把notifier的值改为z,此时如果发生违例了,也不会改变notifier的值,因为此时违例发生前后notifier的值都是zudp就不会发现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发生任何变化的意思),此时的输出qx(不定态)。使用“+no_notifier”时,尽管可以检测到违例,但是此时时序检查任务不会改变notifier的值(notifier没有变化),也就不会影响dff_udp的输出。

可见,不管是否使用+no_notifier”都不会影响违例信息的产生和报出,虽然使用“+no_notifier”可以避免标准单元输出不定态,但是这样就存在一个潜在的问题,因为标准单元此时输出为确定的状态,确定的状态一般也就不会影响后续电路的执行,从而如果忽略log文件将会很容易遗漏一些违例信息,为此从严谨的角度出发,除了仿真波形直观的反应以外,必须对于后仿真的log文件中的违例信息进行详细的筛查。

 

更多技术内容,可关注下图个人技术微信公众号,欢迎朋友们关注沟通!

 

 

posted on 2021-07-04 17:01  nanoty  阅读(3958)  评论(2编辑  收藏  举报