一、模块

模块定义以关键字module开始,模块名、端口列表、端口声明和可选的参数声明必须出现在其他部分的前面,endmodule语句必须为模块的最后一条语句。模块内部的5个组成部分是:
变量声明、数据流语句、低层模块实例、行为语句块以及任何和函数。在模块的组成部分中,只有module、模块名、endmodule必须出现,其他部分都是可选的,用户可以根据设计的需要随意选用。

二、端口
1.端口列表
如果模块和外部环境没有交换任何信号,则可以没有端口列表。

模块Top是一个顶层模块,作为仿真中的顶层模块,调用设计模块,无需和周围环境交换信息,因此没有端口列表。
而被调用的fulladd4模块,则由a, b, c_in端口读入数据,将结果从sum和c_cout端口送出。
2.端口声明
在verilog中端口具有以下三种类型:

在verilog中,所有的端口隐含地声明wire类型;如果输出类型的端口需要保存数值,则必须将其显式地声明为reg数据类型。
不能将input和inout类型的端口声明为reg数据类型,因为reg类型的变量是用于保存数值的,而输入端口只反映与其相连的外部信号的变化。
在verilog中,有两种端口声明风格:

3.端口连接规则


位宽匹配
在对模块进行调用的时候,verilog允许端口的内、外两个部分具有不同的位宽。在一般的情况下,verilog仿真器会对此给予警告。
4.端口与外部信号的连接
在对模块调用的时候,也已使用两种方法将模块定义的端口与外部环境连接起来。
顺序端口连接
按照顺序进行端口连接:

命名端口连接
fulladd4 fa_byname(.c_out(C_OUT), .sum(SUM), .b(B), .c_in(C_IN), .a(A));