Ich habe folgendes MWE:Verilog: Draht-Wert nicht aktualisiert
module test(
input wire clock,
input wire start
);
reg [7:0] x = 8'b10101010;
reg processing = 0;
wire [7:0] x_wire0 = x;
wire [7:0] x_wire1 = {4'hf, x};
wire [11:0] x_wire2 = {4'hf, x};
always @(posedge clock) begin
if (start & ~processing) begin
x = 8'h0f;
processing = 1;
end
$display("---> x=%h x_wire0=%h x_wire1=%h x_wire2=%h",
x, x_wire0, x_wire1, x_wire2);
end
endmodule
mit dem Prüfstand
module test_test();
reg clock = 0;
reg start = 0;
test test(
.clock(clock),
.start(start)
);
always #5 clock = ~clock;
initial begin
$monitor("%b %b", clock, start);
#20 start = 1;
#20 start = 0;
#200 $finish;
end
endmodule
die Icarus Verilog 0.9.7 gibt mir die Ausgabe
0 0
---> x=aa x_wire0=aa x_wire1=aa x_wire2=faa
1 0
0 0
---> x=aa x_wire0=aa x_wire1=aa x_wire2=faa
1 0
0 1
---> x=0f x_wire0=0f x_wire1=aa x_wire2=f0f
1 1
0 1
---> x=0f x_wire0=0f x_wire1=0f x_wire2=f0f
1 1
0 0
...
Ich frage mich, warum x_wire1 erst beim nächsten Tick-Tick aktualisiert wird und ob es irgendwelche Regeln gibt, um diese Art von Situationen zu vermeiden. Wenn ich vor dem Anzeigebefehl eine "# 0" verwende, wird sie aktualisiert.
Verwenden Sie nichtblockierende Zuweisungen in sequenzieller Logik: 'x <= 8'h0f; processing <= 1; ' – toolic
Es gibt blockierende Zuweisungen im selben' always' Block, die 'x_wire1' auf ihrem RHS haben. Ich habe diesen Code nicht in den Beispielcode aufgenommen, um ihn minimal zu halten. Ich habe mal gelesen, dass nicht blockierende Zuweisungen und blockierende Zuweisungen nicht im selben "always" -Block gemischt werden sollten. – apriori
Sie sollten blockierende und nicht blockierende Zuweisungen nicht mit der _same_Variablen mischen. –