Должен ли вывод выводиться reg, если он используется в инстанцированном субмодуле? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь устранить неполадки некоторого кода, который я мог бы опубликовать позже, но сначала мне интересно, нужно ли мне изменить некоторые определения портов моего модуля с простых выходных данных на выходные reg? Я знаю, что если я использую операцию присваивания, она должна просто выводиться; однако, если я использую несколько слоев экземпляров модулей, фактические экземпляры считаются процедурными или последовательными блоками? Если так, я должен объявить выходные порты верхнего модуля как выходные регистры, так как экземпляры работают как блоки с определенными списками чувствительности, как всегда?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Применяются следующие простые правила:

  • , если они назначены в операторе 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
0 голосов
/ 23 апреля 2019

Сам язык Verilog не заставляет Вас определять выходные данные исключительно как выходные регистры, если между нижестоящим и вышестоящим модулем требуется комбинационное соотношение, тогда вполне нормально объявлять такие выходные данные без модификатора reg. Тем не менее, есть некоторые рекомендации по хорошей практике, например, если это модуль верхнего уровня, и выход рассматривается как первичный выход (скорее всего, будет взаимодействовать с каким-либо видом ввода / вывода), тогда рекомендуется убедиться, что такой вывод имеет зарегистрированный тип, но опять язык не мешает Вам поступать иначе.

...