我试图做一个简单的断言来检查两个值是否相等。有人可以解释当我将两个不同的值分配给同一个变量时的行为吗
logic src_sig ;
logic dest_sig;
logic alt_sig;
assign a = src_sig;
assign a = alt_sig;
assign b = dest_sig;
我的断言顺序是:
sequence check_seq(X,Y);
(X == Y);
endsequence
我的初始块是:
initial begin
#100 @ (posedge clk) begin
src_sig <= 1;
dest_sig <=1;
alt_sig <= 0;
end
#10 @ (posedge clk) begin
src_sig <=1;
dest_sig <=0;
alt_sig <= 0;
end
#10 @ (posedge clk) begin
src_sig <= 0;
dest_sig <= 0;
alt_sig <= 1;
end
#10 @ (posedge clk) begin
src_sig <= 0;
dest_sig <= 1;
alt_sig <= 1;
end
#30 $finish;
end
我期待第二个分配将覆盖第一个或者它会分配给src_sig
和alt_sig
。因此,它应该分别显示 2 次或 4 次违规。但我得到以下结果(3 次犯罪)。
"testbench.sv", 31: test.check_assert: started at 103ns failed at 103ns
Offending '(a == b)'
"testbench.sv", 31: test.check_assert: started at 113ns failed at 113ns
Offending '(a == b)'
"testbench.sv", 31: test.check_assert: started at 133ns failed at 133ns
Offending '(a == b)'
请解释这里发生了什么?
编辑::完整代码
module test_gcc();
logic clk=0;
logic src_sig,dest_sig,alt_sig;
assign a = src_sig;
assign a = alt_sig;
assign b = dest_sig;
initial begin
clk = 0;
forever #1 clk=~clk;
end
sequence check_seq(X,Y);
(X == Y);
endsequence
property check_connection(M,N);
@(posedge clk)
($rose(M)||$rose(N)||$fell(M)||$fell(N)) |-> check_seq(M,N);
endproperty
check_assert : assert property (check_connection(a,b));
initial begin
#100 @ (posedge clk) begin
src_sig <= 1;
dest_sig <=1;
alt_sig <= 0;
end
#10 @ (posedge clk) begin
src_sig <=1;
dest_sig <=0;
alt_sig <= 0;
end
#10 @ (posedge clk) begin
src_sig <= 0;
dest_sig <= 0;
alt_sig <= 1;
end
#10 @ (posedge clk) begin
src_sig <= 0;
dest_sig <= 1;
alt_sig <= 1;
end
#30 $finish;
end
endmodule
a
并且b
是 1 位wire
s,因为您还没有声明它们。(在 Verilog/SV 中,除非您指定,否则default_nettype none
未声明的对象是wire
s)。
如果您
wire
从多个地方驱动 a ,则执行解析函数以评估wire
.
在您的情况下,有两个驱动程序对wire a
- 两个assign
语句。该initial
块确保两个assign
语句始终驱动不同的值,因此线路上的解析值始终为1'bx
。的值wire a
永远不会改变。
wire b
仅由一个assign
语句驱动。该initial
块确保它的值在 101ns、111ns 和 131ns 发生变化。on 的值wire b
在 121ns 时不会改变。
您已经编写了您的,property
以便仅在或发生更改时检查条件:wire a
wire b
property check_connection(M,N);
@(posedge clk)
($rose(M)||$rose(N)||$fell(M)||$fell(N)) |-> check_seq(M,N);
endproperty
wire a
从不改变,wire b
也不会在 121ns 改变,所以在 121ns 不检查条件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句