Verilog HDL程序是由模块构成的,一个模块可以包括整个设计模型或者设计模型的一部分。从结构上看,每个模块主要包含模块声明、端口定义、信号类型说明、逻辑功能描述。其中,只有moudle、模块名、endmodule必须出现,其他部分都是可选的。
端口定义:
数据类型说明:
逻辑功能描述:
模块声明包括模块名和端口列表。
module 模块名(端口1, 端口2, 端口3, ....);
端口是模块与外界交互的接口。端口的位宽最好定义在端口定义中。
input[3:0] 端口名1, 端口名2, ..., 端口名N; //输入端口
output[3:0] 端口名1, 端口名2, ..., 端口名N; //输出端口
inout[7:0] 端口名1, 端口名2, ..., 端口名N; //输入输出端口
信号可以分为端口信号和内部信号,出现在端口列表中的信号是端口信号,其他的信号为内部信号。信号的类型分寄存器类型(reg)、连线类型(wire)。如果信号的数据类型没有定义,则综合器将其默认为wire型。不能将input和inout类型的端口声明为reg信号类型。reg信号用于保存数值,wire信号用于连接信号。
wire 端口名1, 端口名2, ..., 端口名N;
reg 端口名1, 端口名2, ..., 端口名N;
模块中最核心的部分是逻辑功能描述。最基本的描述方式有3种:always、assign和创建模块实例。
一个Verilog HDL模块中允许使用一种或多种方法描述逻辑功能。此外,还可以调用函数(function)和任务(task)来描述逻辑功能。