Применяются следующие простые правила:
, если они назначены в операторе assign
или управляются выходом или входом экземпляра, то это должен быть провод;
если назначено блоком initial
или always
, то это должна быть переменная.
Но тогда вы уже знали, что и этот вопрос имеетспросили много раз.Что отличает вас от других, так это ситуация, когда что-то изначально управляется блоком initial
или always
, но затем является выходом экземпляра.Ответ таков: это вывод экземпляра, поэтому он должен быть проводным.Как он управляется внутри экземпляра, не имеет значения. Смотрите эту строку здесь:
.this_must_be_a_variable(so_must_this_be_a_wire)
https://www.edaplayground.com/x/5kmV
module TOP (input verilog_inputs_are_always_wires,
output this_must_be_a_wire,
so_must_this_be_a_wire,
output reg this_must_be_a_variable);
BOT b (
.verilog_inputs_are_always_wires(verilog_inputs_are_always_wires),
.this_must_be_a_wire(this_must_be_a_wire),
.this_must_be_a_variable(so_must_this_be_a_wire)
);
endmodule
module BOT (input verilog_inputs_are_always_wires,
output this_must_be_a_wire,
output reg this_must_be_a_variable);
assign this_must_be_a_wire = verilog_inputs_are_always_wires;
always @(*) this_must_be_a_variable = verilog_inputs_are_always_wires;
endmodule