Verilog:连接端口的正确方法
Verilog: proper way of connecting ports
假设有两个不同的模块(first_module
、second_module
)。两个模块都与时钟信号同步。 first_module
具有以下结构:
module first_module(
input clk,
input reset_n,
input in1,
output reg out1,
output reg out2
);
//******** some verilog codes *********
endmodule
和second_module
有相似的结构:
module second_module(
input clk,
input reset_n,
input in1,
input in2,
output reg out1
);
//******** some verilog codes *********
endmodule
然后有一个名为 top_module
的模块,它使用两个模块的实例:
module top_module(
input clk,
input reset_n,
input insignal1,
input insignal2,
output outsignal1,
output outsignal2
);
first_module fm1(
.clk(clk),
.reset_n(reset_n),
.in1(insignal1),
.out1(outsignal1),
.out2(<connection1>) // to be connected to the connection2
);
second_module sm1(
.clk(clk),
.reset_n(reset_n),
.in1(insignal2),
.in2(<connection2>), // to be connected to the connection1
.out1(outsignal2)
);
endmodule
目的是将 connection1
连接到 connection2
。据我所知(如果它是正确的),我们可以声明一条线(让它的名称为 connection
)并用它替换 <connection1>
和 <connection2>
,或者我们可以声明两条不同的电线 connection1
和 connection2
,然后:
assign connection2 = connection1;
并相应地连接它们。
- 这两种方法合成的方式不同吗?如果答案是肯定的,如果你能解释一下它们是如何合成的,我会很高兴。
- 如果答案是否定的,在不同的条件下,一种方法是否可以比另一种更好?不是在代码行数或简单性方面,而是在综合方面.
是的,有区别。但不是你的具体情况。
直接使用连接可以是 uni-directional 或 bi-directional,具体取决于模块中的底层端口。
但是 assign connection2 = connection1;
只是 uni-directional。
因此 bi-directional 端口之间应该使用直接连接,或者您应该只在它们之间使用 bi-directional Verilog 结构。 assign ...
不是其中之一。
但在你的情况下,信号是 uni-directional,所以没关系。
请注意,现代 FPGA 不再具有 on-chip bi-directional 总线。 (至少我不知道有)。同样在芯片设计中 on-chip 总线被制造商强烈反对或完全禁止。
因此 bi-directional 信号通常只出现在 test-bench 中。由于没有得到综合,您的问题不适用于那里。
最后但同样重要的是:
在 HDL 设计中,我强烈反对无缘无故地更改信号名称。在整个设计中使用相同的名称可以更轻松地调试和跟踪您的信号 post-synthesis。
假设有两个不同的模块(first_module
、second_module
)。两个模块都与时钟信号同步。 first_module
具有以下结构:
module first_module(
input clk,
input reset_n,
input in1,
output reg out1,
output reg out2
);
//******** some verilog codes *********
endmodule
和second_module
有相似的结构:
module second_module(
input clk,
input reset_n,
input in1,
input in2,
output reg out1
);
//******** some verilog codes *********
endmodule
然后有一个名为 top_module
的模块,它使用两个模块的实例:
module top_module(
input clk,
input reset_n,
input insignal1,
input insignal2,
output outsignal1,
output outsignal2
);
first_module fm1(
.clk(clk),
.reset_n(reset_n),
.in1(insignal1),
.out1(outsignal1),
.out2(<connection1>) // to be connected to the connection2
);
second_module sm1(
.clk(clk),
.reset_n(reset_n),
.in1(insignal2),
.in2(<connection2>), // to be connected to the connection1
.out1(outsignal2)
);
endmodule
目的是将 connection1
连接到 connection2
。据我所知(如果它是正确的),我们可以声明一条线(让它的名称为 connection
)并用它替换 <connection1>
和 <connection2>
,或者我们可以声明两条不同的电线 connection1
和 connection2
,然后:
assign connection2 = connection1;
并相应地连接它们。
- 这两种方法合成的方式不同吗?如果答案是肯定的,如果你能解释一下它们是如何合成的,我会很高兴。
- 如果答案是否定的,在不同的条件下,一种方法是否可以比另一种更好?不是在代码行数或简单性方面,而是在综合方面.
是的,有区别。但不是你的具体情况。
直接使用连接可以是 uni-directional 或 bi-directional,具体取决于模块中的底层端口。
但是 assign connection2 = connection1;
只是 uni-directional。
因此 bi-directional 端口之间应该使用直接连接,或者您应该只在它们之间使用 bi-directional Verilog 结构。 assign ...
不是其中之一。
但在你的情况下,信号是 uni-directional,所以没关系。
请注意,现代 FPGA 不再具有 on-chip bi-directional 总线。 (至少我不知道有)。同样在芯片设计中 on-chip 总线被制造商强烈反对或完全禁止。
因此 bi-directional 信号通常只出现在 test-bench 中。由于没有得到综合,您的问题不适用于那里。
最后但同样重要的是: 在 HDL 设计中,我强烈反对无缘无故地更改信号名称。在整个设计中使用相同的名称可以更轻松地调试和跟踪您的信号 post-synthesis。