• 【仿真】后仿真中的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文件中的违例信息进行详细的筛查。

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

  • 相关阅读:
    RocketMQ系列(一)基本概念
    怎样实现登录?| Cookie or JWT
    Hotspot GC研发工程师也许漏掉了一块逻辑
    初级Java工程师也能轻松进行JVM调优了
    自动化不知如何参数化(二)?xlrd来帮你解决
    自动化不知如何参数化(一)?xlrd来帮你解决
    SpringCloud系列之API网关(Gateway)服务Zuul
    SpringCloud系列之客户端负载均衡Netflix Ribbon
    SpringCloud系列之使用Feign进行服务调用
    Spring Security系列之极速入门与实践教程
  • 原文地址:https://www.cnblogs.com/nanoty/p/14969359.html
Copyright © 2020-2023  润新知