Verilog中的模块:输出reg vs assign reg to wire output

时间:2016-02-26 14:12:45

标签: verilog hdl

我们说module_a中有register_a,需要与module_b相关联。应register_a单独声明并分配给module_a的输出:

reg register_a;
assign output_a = register_a;

或者我们应该在模块声明中使用output_a内联声明reg并在代码中使用它?

3 个答案:

答案 0 :(得分:5)

我认为您在询问以下内容之间的区别:

module my_dff (output reg q, input clk, d); //None Blocking style
  always @(posedge clk) begin
    q <= d;
  end
endmodule

VS

module my_dff (output q, input clk, d);
  reg reg_q;
  assign q = reg_q; // Blocking style
  always @(posedge clk) begin
    reg_q <= d;
  end
endmodule

两者之间没有功能差异。它主要是编码偏好。有一个充满模拟器的手不强制输入和输出的方向,因此如果意外地有两个模块驱动相同的网络,那些模拟器X可以通过output reg将X传播到寄存器。这是一种罕见的情况,大多数模拟器(尤其是主流模拟器)没有这个问题。

我个人更喜欢output reg,主要是因为它的代码行数较少。

无论如何声明输出类型,在实例化模块时,输出都需要连接到网络类型(例如wire),而不是reg。输入可以是任何一种类型。

module fifo(output out, input clk, in);
  wire q0;
  reg q1;
  my_dff dff0 ( q0, clk, in );
  always @(posedge clk) begin
    q1 <= q0;
  end
  my_dff dff1 ( out, clk, q1 );
endmodule

答案 1 :(得分:1)

我假设你正在寻找这样的东西:

module module_b (...);
    ....
    module_a foo (.output_a(some_wire),
                  ...);
endmodule

如果是这种情况,则无关紧要 - 两个版本都会生成相同的结果电路。

第一种方法确实有一些优点,即您可以根据需要对输出进行门控(类似assign output_a = valid ? register_a : 0;),并且如果为您定义了接口,则可以使用您选择的名称在内部工作(例如,像预设的引脚映射)。

如果你不想做上述事情,那可能不是这样。

答案 2 :(得分:0)

我读到应该始终注册输出。也就是说module_a有一个名为output_a的输出。这是一种行为与顺序代码风格。确实,您可以以任何方式创建相同的硬件,但我认为您的问题的答案是您应该将输出声明为reg。

所以模块声明类似于:

module module_a (output reg output_a);
....
output_a <= "some value"
endmodule