System verilog 断言属性:将值从属性块传递到断言块
我在表格上有财产System verilog 断言属性:将值从属性块传递到断言块,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我在表格上有财产 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 每当断言失败时,我
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
每当断言失败时,我想打印用于该断言的特定属性实例的存储数据。是否有任何方法可以引用属性的内部变量,或以任何方式将数据从属性块传递到断言块?提问者在回答问题时加入一个。这是一个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对此很满意 您可以使用非本地数据吗?