📜  Verilog端口

📅  最后修改于: 2021-01-11 14:40:59             🧑  作者: Mango

Verilog端口

端口是Verilog模块的基本组件。端口用于通过输入和输出与外部世界进行模块通信。

由于模块是作为组装好的芯片放置在PCB上的,因此它通过其引脚与芯片进行通信。

必须将端口列表中的每个端口声明为input,outputinout 。默认情况下,所有声明为其中一个端口的端口均假定为wired进行声明,否则必须再次声明。

将模块连接到其他模块时,使用端口(也称为引脚或端子)。

  • 如果模块不与环境交换任何信号,则列表中没有端口。
  • 考虑一个在顶级模块中实例化的4位全加器。
  • 模块fulladd4在端口a,b和c_in上接受输入,并在端口sum和c_out上产生输出。

港口申报

根据端口信号的方向,端口列表中的每个端口都定义为输入,输出或输入输出。

如果端口声明包含网络或变量类型,则该端口被视为完全声明。在网络或变量类型声明中声明同一端口是非法的。

并且,如果端口声明不包含网络或变量类型,则可以在网络或变量类型声明中再次声明端口。

例如,考虑上图所示的顶部和全加器端口。

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提供了通过端口名称(而不是位置)将外部信号连接到端口的功能。

通过名称连接端口的另一个主要原因是,只要不更改端口名称,就可以重新排列模块端口列表中端口的顺序,而无需在模块实例化中更改端口连接。

端口变化

  • Verilog进行了一些研究, 1995年的原始IEEE版本采用以下方式声明端口。

在这里,模块声明必须首先在方括号内列出端口名称。然后,这些端口的方向稍后将在模块主体中定义。

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
  • ANSI-C样式的端口命名是在2001年引入的。它允许在端口列表中指定类型。