【问题标题】:assert property: Pass value from property block to assert block断言属性:将值从属性块传递到断言块
【发布时间】:2018-09-21 00:07:25
【问题描述】:

我在表格上有财产

property p1;
  logic [31:0] data;
  @(posedge clk) (trigger, data = data) |=> !resolve[*0:$] ##1 resolve && checkPassed;
endproperty

在断言中使用

assert property(p1) else begin
  $error("Assertion failed. data = %h", ?);
end

每当断言失败时,我想打印用于该断言的特定属性实例的存储数据。有没有办法引用属性的内部变量,或者以任何方式将数据从属性块传递到断言块?

【问题讨论】:

  • 你能用非本地数据代替吗?

标签: system-verilog system-verilog-assertions


【解决方案1】:

提问者在回答问题时添加MCVE 会有所帮助。这是一个 MCVE:

module testing;

  bit a, b, clk;

  always #5 clk = ~clk;

  initial begin
    #20 a = 1'b1;
    #20;
    $finish;
  end

  property p1;
    logic [31:0] data;
    @(posedge clk) (a, data = 3) |=> b;
  endproperty

  assert property(p1) else begin
    // $error("Assertion failed. data = %h", ??? );
  end

endmodule

这是一个解决方案:

module testing;

  bit a, b, clk;

  always #5 clk = ~clk;

  logic [31:0] d;

  initial begin
    #20 a = 1'b1;
    #20;
    $finish;
  end

  task store (input logic [31:0] data);
    d = data;
  endtask

  property p1;
    logic [31:0] data;
    @(posedge clk) (a, data = 3, store(data)) |=> b;
  endproperty

  assert property(p1) else begin
    $error("Assertion failed. data = %h", d);
  end

endmodule

您可以在( , ) 构造中的逗号后执行以下三项操作:

1) 初始化一个局部变量

2) 增加或减少一个局部变量

3) 调用任务或函数。

我使用任务将局部变量复制到具有模块范围的变量。然后可以通过操作块中的$error 系统任务访问它。

从技术上讲,我认为将局部变量复制到任务中具有模块范围的变量是非法的;我认为断言中调用的任务应该没有副作用。然而,Aldec Riviera Pro 对此很满意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2016-06-21
    • 1970-01-01
    • 2015-07-05
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多