0

我正在尝试做一个简单的断言来检查两个值是否相等。当我为同一个变量分配两个不同的值时,有人可以解释一下行为吗

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_sigalt_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
4

1 回答 1

2

a并且b是 1-bit wires,因为你还没有声明它们。(在 Verilog/SV 中,除非您指定,否则default_nettype none未声明的对象是wires)。

如果您wire从多个地方驱动 a ,则执行解析函数以评估wire.

在您的情况下,有两个驱动程序-wire a这两个assign语句。该initial块确保不同的值始终由两个assign语句驱动,因此线路上的解析值始终为1'bx. on 的值wire a永远不会改变。

wire b仅由一个assign语句驱动。该initial块确保它的值在 101ns、111ns 和 131ns 时发生变化。on 值wire b在 121ns 时不变。

您已经编写了 your property,以便仅在or发生更改时检查条件wire awire 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 时不检查条件。

于 2017-06-14T09:43:30.870 回答