我们说module_a
中有register_a
,需要与module_b
相关联。应register_a
单独声明并分配给module_a
的输出:
reg register_a;
assign output_a = register_a;
或者我们应该在模块声明中使用output_a
内联声明reg
并在代码中使用它?
答案 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