Что происходит, когда мы присваиваем 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_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

person SShankar    schedule 14.06.2017    source источник
comment
У меня есть некоторые идеи, но без MCVE я не могу двигаться дальше. Пожалуйста, создайте MCVE.   -  person Matthew Taylor    schedule 14.06.2017
comment
Я вставил ссылку. Я также могу опубликовать весь код, если вам это нужно. Спасибо за помощь.   -  person SShankar    schedule 14.06.2017
comment
Ваша проблема заключается в коде, который вы изначально не разместили в своем вопросе. Вот почему MCVE так ценен. Пожалуйста, отредактируйте свой вопрос, чтобы включить весь ваш код.   -  person Matthew Taylor    schedule 14.06.2017


Ответы (1)


a и b являются 1-битными wire, потому что вы их не объявили. (В Verilog/SV, если вы не укажете default_nettype none, то необъявленные объекты будут wire).

Если вы управляете wire более чем из одного места, выполняется функция разрешения для оценки значения wire.

В вашем случае есть два драйвера в wire a — два оператора assign. Блок initial гарантирует, что два оператора assign всегда управляют разными значениями, поэтому разрешенное значение в сети всегда равно 1'bx. Значение wire a никогда не меняется.

wire b управляется только одним оператором assign. Блок initial гарантирует, что его значение изменится на 101 нс, 111 нс и 131 нс. Значение wire b не меняется на 121 нс.

Вы записали свой 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 не меняется на 121 нс, поэтому условие не проверяется на 121 нс.

person Matthew Taylor    schedule 14.06.2017