微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解“断言”的工作原理

如何解决了解“断言”的工作原理

在尝试验证触发器是否在上升沿对输入值进行采样时,我遇到了 Systemverilog 'assert' 令人费解的行为。如果我在上升沿后添加一个任意小的延迟,则断言似乎会通过,但不是正确的。但是,如果我添加一个在上升沿时间打印输出值的“始终”块,它将显示正确的值。顺便说一句,“如果”比较的行为类似于“断言”。我使用 Modelsim 作为我的模拟器。下面是我的带有内联注释的代码来说明问题。另请查看链接中的图片以获得进一步说明。

Modelsim Image


谢谢。

`timescale 1ns/1ns


module example_t(input logic clk,input logic resetb,input logic selector,output logic result);

always_ff @ (posedge clk or ~resetb)
  if(~resetb)
    result <= 0;
  else
    result <= selector ?  1'b1  :  1'b0;
endmodule 


module tst();

logic clk;
logic resetb;
logic selector;
logic result;

example_t example(.clk(clk),.resetb(resetb),.selector(selector),.result(result));

//Simulate a clock 
always
  #10 clk = ~clk;
  
initial
 begin
    clk = 0;
    resetb = 0; //Reset
    selector = 0;
    
    #20
    @(posedge clk);
    resetb = 1;
    
    #20
    @(posedge clk);
    selector = 1;
    
    #20            //**At this time we are at 70ns**
    @(posedge clk); //**We are already at the posedge,but adding just in case**
    assert(result == 1'b1); //**This will fail,meaning result[enter image description here][1]==0 at 70ns**
    
 end
 
 always @ (result)
  begin
    $display("result=%h time=%t",result,$realtime); //**This will print the value at 70ns as 1**
  end

endmodule

解决方法

您在代码中有几个问题。

  1. 问题在于 selector(以及 resetb)上的比赛。您可以在使用信号的同一仿真周期中通过阻塞分配来修改信号。根据模拟器或模拟条件,更新可以在使用之前或之后发生。因此,synopsys 和 cadence 在时间 50 时已准备好结果,使断言愉快。另一方面,导师 aldera 仅在 70 时才准备好结果,此时会导致断言失败。您可以避免此问题并使用 nbas 并使每个编译器在 70 时准备好结果。

  2. 有一个稍微不同的种族来源,它涉及初始块中的即时断言。在非阻塞赋值之前,其中的条件表达式将作为活动区域中程序块流的一部分执行。它仍然看到 result 的旧值并被评估为 false。

解决方法是在posedge之前设置'selector'和resetb方式。下面的内容会让大家开心。结果将在 50 时准备好,在 70 时断言也会很高兴。

initial
 begin
    clk = 0;
    resetb = 0; //Reset
    selector = 0;
    
    #15    
    resetb = 1; // set it before the next posedge
   
    @(posedge clk); // wait for posedge
   
    #10   
    selector = 1; // set it before the next edge
    
    #20            //**At this time we are at 70ns**
    @(posedge clk); //**We are already at the posedge,but adding just in case**
    assert(result == 1'b1) $info("Assertion is ok at %0t",$realtime); //**This will fail,meaning result[enter image description here][1]==0 at 70ns**
    
   #20 $finish;
 end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。