Verilog HDL硬件描述语言程序基本结构
Verilog HDL语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间进行外部访问设计,包括模拟的具体控制和运行。
Verilog语言程序的模块
Verilog语言的基本描述单位是模块,以模块集合的形式来描述数字系统。其中每一个模块都有接口部分,用来描述与其他模块之间的连接。模块代表硬件上的逻辑实体,其范围可以从简单的门到整个大的系统。一个模块的基本语法如下:
module <顶层模块名>(<输入输出端口列表>);
output 输出端口列表;
input 输入端口列表;
// 定义数据、信号的类型,任务、函数声明wire 信号名;
reg 信号名;
//逻辑功能定义assign<结果信号名>=<表达式>;
//使用assign语句定义逻辑功能//用always块描述逻辑功能
always @(<敏感信号表达式>)
begin
//过程赋值
//if_else
//case语句
//while,repeat,for循环语句
//task,function调用
end
//调用其他模块<调用模块名module_name><例化模块名>(<端口列表port_list>);
//门元件例化门元件关键字<例化门元件名>(<端口列表 portlist>);
endmodule
说明部分和逻辑功能描述语句可以放在模块的任何地方,但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。一般为了使模块描述清晰以及具有良好的可读性,最好将说明部分放在语句前。//符号为注释。
下面看一个简单的Verilog HDL程序:
【例】二选一数据选择器。
module mux2_1(out,a,b,sel);
//模块名为mux2_1(端口列表out,a,b,sel)
output out;
//模块的输出端口为out
input a,b,sel;
//模块的输入端口为a,b,sel
assign out=sel?a:b;
//逻辑功能描述
endmodule
可以看出,Verilog模块的内容都嵌在module和endmodule两个语句之间,每个Verilog模块包括4个主要部分:模块声明、端口定义、信号类型说明和逻辑功能描述。
(1)模块声明
模块声明包括模块名字和模块输入、输出端口列表。
格式如下:
module 端口名(端口1,端口2,端口3,……)
模块结束的关键字为:endmodule。
(2)端口定义
端口是模块与外界或其他模块连接和通信的信号线,对模块的输入、输出端口要明确说明,格式为:
output 端口名1,端口名2,……,端口名N;
//输出端口
input 端口名1,端口名2,……,端口名N;
//输入端口
inout 端口名1,端口名2,……,端口名N;
//输入/输出端口
(3)信号类型声明
对模块中所用到的所有信号(包括端口信号、节点信号等)都必须进行数据类型的定义。语言提供了各种信号类型,分别模拟实际电路中的各种物理连接和物理实体。如:
wire a,b,c;
//定义信号a,b,c为wire型
reg out;
//定义信号out为reg型
reg[7:0]out;
//定义信号out的数据类型为8位reg型
如果信号的数据类型没有定义,则综合器将其默认为wire型。其中还应注意:输入和双向端口不能定义为寄存器型;在测试模块中不需要定义端口。
(4)逻辑功能描述
模块中最核心的部分是逻辑功能的描述。有多种方法可以在模块中描述和定义逻辑功能,还可以调用函数function和任务task来描述逻辑功能。