#verilog
#verilog
Вопрос:
Я пытаюсь устранить неполадки в некотором коде, который я мог бы опубликовать позже, но сначала мне интересно, нужно ли мне изменить некоторые определения портов моего модуля с простых выходов на выходные данные reg’s? Я знаю, что если я использую операцию присваивания, она должна просто выводиться; однако, если я использую несколько уровней созданных модулей, считаются ли фактические экземпляры процедурными или последовательными блоками? Если да, должен ли я объявлять выходные порты верхнего модуля как выходные reg, поскольку экземпляры действуют как всегда блоки с определенными списками чувствительности?
Ответ №1:
Сам язык Verilog не заставляет вас определять выходные данные исключительно как выходные данные reg, если между нижестоящим и восходящим модулем требуется комбинационное соотношение, тогда вполне нормально объявлять такие выходные данные без модификатора reg. Однако есть некоторые рекомендации по надлежащей практике, например, если это модуль верхнего уровня, а вывод рассматривается как основной вывод (скорее всего, будет взаимодействовать с каким-либо вводом-выводом), тогда рекомендуется убедиться, что такой вывод имеет зарегистрированный тип, но опять же язык не мешает вам поступать иначе.
Ответ №2:
Применяются эти простые правила:
-
если он назначен в
assign
инструкции или управляется выводом или inout экземпляра, то это должен быть провод; -
если назначается блоком
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