【发布时间】:2020-05-13 11:01:23
【问题描述】:
假设,我的设计中有一个按钮。当按钮被按下三次时,我想在接下来的两个时钟之间增加计数器,我想用 SVA 检查这种行为。 我写了这个:
`timescale 1ns / 1ps
module tb();
parameter NUMBER_OF_PRESSES = 10;
parameter CLK_SEMI_PERIOD = 5;
bit clk;
always #CLK_SEMI_PERIOD clk = ~clk;
bit button_n;
bit reset_n;
logic [7:0] counter;
property p;
logic[7:0] val;
disable iff(!reset_n) @(posedge clk) (($fell(button_n)[=3]),val=counter) |=> ##[0:2] (counter== val+1);
endproperty
assert property(p);
initial begin
automatic bit key_d;
automatic byte key_lat;
automatic byte key_press_count;
reset_n = 1;
button_n = 1;
counter = 0;
fork
begin
repeat(NUMBER_OF_PRESSES) begin
repeat(5)begin
@(negedge clk);
end
button_n = 0;
key_lat = $urandom_range(1,4);
repeat(key_lat) begin
@(negedge clk);
end
button_n = 1;
end
end
begin
forever begin
@(posedge clk);
if(!button_n && key_d) begin
key_press_count++;
end
if(key_press_count == 3) begin
counter++;
key_press_count = 0;
end
key_d = button_n;
end
end
join_any
end
endmodule
这在前三下工作得很好,但是它总是会抛出断言错误,因为它已经在每次按下按钮时启动了新的断言线程。所以,我需要阻止测试台这样做。开始重复后,我不需要启动新线程。
我该怎么做?
【问题讨论】:
标签: system-verilog verification system-verilog-assertions