我正在尝试对一些代码进行故障排除,我可能稍后再发布,但是首先我想知道是否需要将一些模块端口定义从简单输出更改为输出reg?我知道如果使用分配操作,则应将其简单地输出;但是,如果我使用的是多层实例化模块,那么实际的实例化是否被视为过程块或顺序块?如果是这样,我是否应该将顶部模块的输出端口声明为输出寄存器,因为实例化的行为总是像带有特定敏感度列表的块一样?
答案 0 :(得分:0)
Verilog语言本身并不强迫您仅将输出定义为输出reg,如果下游模块和上游模块之间需要组合关系,则可以很好地声明这些输出而无需reg修饰符。但是,有一些良好的实践准则,例如,这是顶级模块,并且输出被视为主要输出(很可能将与某种I / O交互),因此建议确保此类输出为已注册类型,但是同样,语言也不会阻止您这样做。
答案 1 :(得分:0)
这些简单的规则适用:
如果在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