如果在实例化的子模块中使用输出,则应将输出为输出 reg



我正在尝试对一些代码进行故障排除,我可能会稍后发布,但首先我想知道我是否需要将我的一些模块端口定义从简单输出更改为输出注册?我知道如果我使用的是分配操作,它应该只是输出;但是,如果我使用多层实例化模块,实际实例化是否被视为过程块或顺序块?如果是这样,我是否应该将顶部模块的输出端口声明为输出注册,因为实例化的行为就像总是使用特定敏感度列表的块一样?

Verilog 语言本身并不强制您将输出仅定义为输出 reg,如果下游和上游模块之间存在组合关系,那么在没有 reg 修饰符的情况下声明此类输出是完全可以的。但是,有一些良好的实践指南,例如,这是顶级模块,输出被视为主输出(很可能与某种I/O接口(,然后建议确保此类输出是注册类型,但语言不会阻止您这样做。

这些简单的规则适用:

  • 如果在 assign 语句中分配或由实例的输出或输入驱动,则它必须是连线;

  • 如果由initialalways块分配,则它必须是变量。

但是后来你已经知道了,这个问题已经被问了很多次了。让你与众不同的是,某些东西最初是由initialalways块驱动的,但后来是实例的输出。答案是:它是实例的输出,因此必须是连线。如何在实例中驱动它无关紧要。请参阅此处的这一行:

.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

最新更新