了解“断言”的工作原理

问题描述

在尝试验证触发器是否在上升沿对输入值进行采样时,我遇到了 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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)