Die Art des Arguments ist nicht das Problem, das Sie mit integer
Typ-Signal und weisen erklären. Das Problem ist, dass der Always Block nicht ausgeführt wird. Die Werte von A
und n
ändern sich nicht und daher wird always @
nicht ausgeführt. Wenn dies ein echtes Programm wäre, hätten Sie kein Problem, da diese Signale von irgendwoher kommen und sich zu diesem Block ausbreiten würden. In jedem Fall ist jeder Integralwert für n
in Ordnung, Sie müssen ihn nur während der Simulation ändern. Um zu sehen, dass es nie ausgeführt wurde, könnten Sie einen innerhalb des Blocks immer verwenden und Sie werden sehen, wenn es läuft.
Wenn ich laufen die folgenden:
module test;
reg signed [7:0] A = 'h17;
reg [2:0] n = 3'b010;
reg signed [7:0] w;
always @(A, n) begin
w = A >> n;
$display("%0t: always has been run", $time);
end
initial $monitor("%X %d %X", A, n, w);
endmodule
Ausgang:
17 2 xx
Wenn ich stattdessen den folgenden Code verwenden, dann bekomme ich die erwartete Antwort:
module test;
reg signed [7:0] A;
reg [2:0] n;
reg signed [7:0] w;
initial begin
#10;
A = 'h17;
n = 3'b010;
end
always @(A, n) begin
w = A >> n;
$display("%0t: always has been run", $time);
end
initial $monitor("%X %d %X", A, n, w);
endmodule
Ausgang:
xx x xx
10: always has been run
17 2 05
Die andere Option ist, dass, wenn Sie einen SystemVerilog-Simulator haben, dann können Sie nur always_comb
verwenden, die im Gegensatz zu den always @
es ohne Änderungen an den Eingängen zum Zeitpunkt ausführt 0