Verilog:连接端口的正确方法

时间:2019-05-24 06:06:00

标签: verilog hdl

假设有两个不同的模块(first_modulesecond_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>,或者我们可以声明两条不同的导线connection1connection2,然后:

assign connection2 = connection1;

并进行相应连接。

  • 这两种方法的合成方式是否不同?如果答案是肯定的,那么您能解释它们的合成方式将很高兴。
  • 如果答案是否定的,那么其中一种方法在不同条件下能否优于另一种方法?不是在代码行或简单性方面,而是在综合方面。

1 个答案:

答案 0 :(得分:1)

是的,有区别。但具体情况并非如此。

直接使用连接可以使连接成为单向或双向的,具体取决于模块中的基础端口是什么。

但是assign connection2 = connection1;仅是单向的。

因此,双向端口之间应使用直接连接,或者仅应在它们之间使用双向Verilog构造。 assign ...不是其中之一。

但是在您这种情况下,信号是单向的,所以没关系。

请注意,现代FPGA不再具有片上双向总线。 (至少我不知道有)。另外,在芯片设计中,强烈不鼓励或完全禁止片上总线。
因此,双向信号通常仅存在于测试台中。由于无法综合,因此您的问题不适用于此。

最后但并非最不重要的: 在HDL设计中,我强烈建议不要无故更改信号名称。在整个设计中使用相同的名称,可以更轻松地调试和跟踪合成后的信号。