对于用SDF文件注释的门级模拟,当触发器出现设置/保持违规时,默认情况下将发生以下情况:
但是,+notimingcheck
的诗句+no_notifier
的作用是什么?你能同时使用这两个Verilog编译标志吗?
以下是我的猜测:(这是正确的还是完全错误的?)
+notimingcheck
时,项目(2)被禁用,断言将不会生成当指定
对还是错?或者说几乎是对的?
发布于 2021-10-01 19:22:22
首先,这两个选项不属于Verilog的IEEE Std (例如1800-2017年)。这意味着它们的行为是由模拟器定义的,并不是所有的模拟器都能保证支持它们。卡登斯和Synopsys使用的模拟器确实支持它们。
其次,通知程序的行为取决于它们在Verilog代码中的使用方式,并且它们是可选的。参见IEEE Std 1800-2017,第31.6节通知程序:用户定义的对定时违规的响应.大多数标准单元库确实使用它们,但您需要查看Verilog代码,以了解它们在您的情况下是如何实现的。当通知程序更改值时,FF可能会将输出设置为X,但对于定时检查通常不是这样。
下面是我所掌握的一些代码,它们可以演示它们的用法:
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
消息:
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
运行时,我会收到警告,但不会收到错误。这意味着通知程序被忽略:
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
运行时,既不会收到警告,也不会收到错误:
addr2 = xxxx, 0
addr2 = 0000, 100
addr2 = 0100, 140
addr2 = 0000, 240
addr2 = 1111, 340
当我使用这两种方法(+notimingchecks +no_notifier
)运行时,既不会收到警告,也不会收到错误,如上面所示。
所有这些都与这些选项的模拟器文档一致。
https://stackoverflow.com/questions/69410712
复制相似问题