📅  最后修改于: 2021-01-11 14:40:59             🧑  作者: Mango
端口是Verilog模块的基本组件。端口用于通过输入和输出与外部世界进行模块通信。
由于模块是作为组装好的芯片放置在PCB上的,因此它通过其引脚与芯片进行通信。
必须将端口列表中的每个端口声明为input,output或inout 。默认情况下,所有声明为其中一个端口的端口均假定为wired进行声明,否则必须再次声明。
将模块连接到其他模块时,使用端口(也称为引脚或端子)。
根据端口信号的方向,端口列表中的每个端口都定义为输入,输出或输入输出。
如果端口声明包含网络或变量类型,则该端口被视为完全声明。在网络或变量类型声明中声明同一端口是非法的。
并且,如果端口声明不包含网络或变量类型,则可以在网络或变量类型声明中再次声明端口。
例如,考虑上图所示的顶部和全加器端口。
module fulladd4(sum, c_out, a, b, c_in); //Begin port declarations section
output [3 : 0] sum;
output c_out;
input [3:0] a, b;
input c_in;
//End port declarations section
endmodule
注意:按照惯例,模块的输出始终在端口列表中排在第一位。 Verilog中的预定义模块中也使用此约定。
电线和Reg
在Verilog中,所有端口声明都隐式声明为wire 。如果要将端口用作电线,则只需将其声明为输出,输入或输入输出即可。
输入和输入端口通常声明为电线。但是,如果输出端口保留其值,则必须将它们声明为reg ,如下所示:
module DFF(q, d, clk, reset);
output q;
reg q; // Output port q holds value; so it is declared as reg input d, clk, reset;
endmodule
注意:输入和输入类型的端口不能声明为reg。
在模块实例中指定的信号与模块定义中的端口之间建立连接有两种方法。
1.通过有序列表进行连接:这是初学者的简单方法。要连接的信号必须以与模块定义中的端口相同的顺序出现在模块实例中。
2.按名称连接端口:对于模块具有大约50个或以上端口的大型设计。在这种情况下,记住模块定义中端口的顺序既复杂又不切实际。
Verilog提供了通过端口名称(而不是位置)将外部信号连接到端口的功能。
通过名称连接端口的另一个主要原因是,只要不更改端口名称,就可以重新排列模块端口列表中端口的顺序,而无需在模块实例化中更改端口连接。
在这里,模块声明必须首先在方括号内列出端口名称。然后,这些端口的方向稍后将在模块主体中定义。
module test (a, b, c);
input [3:0] a; // inputs "a" and "b" are wires
input [3:0] b;
output [3:0] c; // output "c" by default is a wire
// Still, we declare them again as wires
wire [3:0] a;
wire [3:0] b;
wire [3:0] c;
endmodule
module test (a, b, c);
input [3:0] a, b;
output [3:0] c; // By default c is of type wire
// port "c" is changed to a reg type
reg [3:0] c;
endmodule