首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Verilog定时仿真:+通知检查与+no_notifier

Verilog定时仿真:+通知检查与+no_notifier
EN

Stack Overflow用户
提问于 2021-10-01 18:46:54
回答 1查看 930关注 0票数 1

对于用SDF文件注释的门级模拟,当触发器出现设置/保持违规时,默认情况下将发生以下情况:

  • (1) FF的输出将更改为“X”
  • (2)--一个违反时间的断言将生成

但是,+notimingcheck的诗句+no_notifier的作用是什么?你能同时使用这两个Verilog编译标志吗?

以下是我的猜测:(这是正确的还是完全错误的?)

  • 当指定+notimingcheck时,项目(2)被禁用,断言将不会生成

当指定

  • 时,项目(1)被禁用,输出将不会更改为“X”(这对于运行具有多个时钟域的门级设计非常有利)。

对还是错?或者说几乎是对的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-01 19:22:22

首先,这两个选项不属于Verilog的IEEE Std (例如1800-2017年)。这意味着它们的行为是由模拟器定义的,并不是所有的模拟器都能保证支持它们。卡登斯和Synopsys使用的模拟器确实支持它们。

其次,通知程序的行为取决于它们在Verilog代码中的使用方式,并且它们是可选的。参见IEEE Std 1800-2017,第31.6节通知程序:用户定义的对定时违规的响应.大多数标准单元库确实使用它们,但您需要查看Verilog代码,以了解它们在您的情况下是如何实现的。当通知程序更改值时,FF可能会将输出设置为X,但对于定时检查通常不是这样。

下面是我所掌握的一些代码,它们可以演示它们的用法:

代码语言:javascript
运行
复制
module tb;
    reg  [3:0] addr;
    wire [3:0] addr2 = addr;
    reg ntfy_reg_p;
    reg ntfy_reg_n;

    specify
        $width(posedge addr2, 50, 30, ntfy_reg_p);
        $width(negedge addr2, 50, 30, ntfy_reg_n);
    endspecify

    always @(ntfy_reg_p or ntfy_reg_n) begin
        $display("Error: width violation at %0t", $time);
    end

    initial begin
        $monitor("addr2 = %b, %0t", addr2, $time);
        #100 addr = 4'b0000;
        #40  addr = 4'b0100;    // get violation here
        #100 addr = 4'b0000;
        #100 addr = 4'b1111;
        #10 $finish;
    end
endmodule

当我在不打开Cadence的情况下运行模拟时,我会收到一条simulator-specific警告消息,并看到我的用户定义的通知器Error消息:

代码语言:javascript
运行
复制
addr2 = xxxx, 0
addr2 = 0000, 100

Warning!  Timing violation
           $width( negedge addr2[2]:100 NS,  : 140 NS,  50 : 50 NS );
            File: ./tb.sv, line = 9
           Scope: tb
            Time: 140 NS

Error: width violation at 140
addr2 = 0100, 140
addr2 = 0000, 240
addr2 = 1111, 340

当我只使用+no_notifier运行时,我会收到警告,但不会收到错误。这意味着通知程序被忽略:

代码语言:javascript
运行
复制
addr2 = xxxx, 0
addr2 = 0000, 100

Warning!  Timing violation
           $width( negedge addr2[2]:100 NS,  : 140 NS,  50 : 50 NS );
            File: ./tb.sv, line = 9
           Scope: tb
            Time: 140 NS

addr2 = 0100, 140
addr2 = 0000, 240
addr2 = 1111, 340

当我只使用+notimingchecks运行时,既不会收到警告,也不会收到错误:

代码语言:javascript
运行
复制
addr2 = xxxx, 0
addr2 = 0000, 100
addr2 = 0100, 140
addr2 = 0000, 240
addr2 = 1111, 340

当我使用这两种方法(+notimingchecks +no_notifier)运行时,既不会收到警告,也不会收到错误,如上面所示。

所有这些都与这些选项的模拟器文档一致。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69410712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档