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

Has*_*aan 1 verilog hdl

让我们说它module_aregister_a,它需要链接到module_b.应register_a单独声明并分配给以下输出module_a:

reg register_a;
assign output_a = register_a;
Run Code Online (Sandbox Code Playgroud)

还是应该只宣布output_areg在模块声明内联和使用的代码?

Gre*_*reg 5

我想你问的是以下几点之间的区别:

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

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
Run Code Online (Sandbox Code Playgroud)

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

我个人更喜欢output reg主要是因为代码行数较少.

无论如何声明输出类型,当您实例化模块时,输出都需要连接到网络类型(例如wire),而不是a 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
Run Code Online (Sandbox Code Playgroud)