2017-06-14 158 views
1

我想做一个简单的断言,检查两个值是否相等。是否有人可以解释行为时,我给你两个不同的值相同的变量当我们将2个值赋给同一个变量时会发生什么?

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 
+0

我有一些想法,但没有[MCVE](https://stackoverflow.com/help/mcve)我不能再进一步了。请创建一个MCVE。 –

+0

我已经粘贴了一个链接。如果您需要,我也可以发布整个代码。谢谢您的帮助。 – SShankar

+0

您的问题在于您最初并未在您的问题中发布的代码。这就是为什么一个MCVE非常有价值。请编辑您的问题以包含您的所有代码。 –

回答

2

ab是1位wire S,因为你还没有宣布他们。 (在Verilog/SV中,除非指定default_nettype none,否则未声明的对象为wire s)。

如果从不止一个地方,那么一个解析功能,以评估对wire值执行驾驶wire

在你的情况,也有对wire a 2名司机 - 两个assign声明。 initial块确保不同的值总是由两个assign语句驱动,因此解析值在线上始终为1'bxwire a上的值永不改变。

wire b仅由一个assign声明驱动。 initial模块确保其值在101ns,111ns和131ns处发生变化。 wire b上的值在121ns时不变。

你已完成property这样,如果在任一台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时不检查条件。

相关问题