Должен ли вывод быть выходным reg при использовании его в созданном подмодуле?

#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