3.1 模块的结构
Verilog 的基本设计单元是“模块”( block)。一个模块是由两部分组成的:一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。
Verilog 模块结构位于在 module和 endmodule声明语句之间。每个Verilog程序包括4个主要部分:端口定义、I/O说明、内部信号声明、功能定义。
3.1.1 模块的端口定义
模块的端口声明了模块的输入输出口。其格式如下:
module模块名(口1,口2,口3,口4,…...)
在引用模块时其端口有两种方式连接:
一种是位置关联
模块名(连接端口1信号名,连接端口⒉信号名,连接端口3信号名,……) ;
一种是名称关联
模块名(.端口1名(连接信号1名),端口2名(连接信号2名),……) ;
3.1.2 模块内容
模块的内容包括I/O说明、内部信号声明、功能定义。
- I/O说明的格式
输入口:
input[信号位宽-1:0]端口名1;
input[信号位宽-1:0]端口名2;
...
input[信号位宽-1:0]端口名i;//(共有i个输人口)
输出口:
output[信号位宽-1:0]端口名1;
output[信号位宽-1:0]端口名2;
...
output[信号位宽-1:0]端口名j;//(共有j个输出口)
输人/输出口:
inout[信号位宽-1:0]端口名1;
inout[信号位-1:0]端口名2;
...
inout[信号位宽-1:0]端口名k;//(共有k个双向总线端口)
- 内部信号声明
wire和 reg类型变量的声明:
reg [width-1 : 0]R变量1,R变量2……;
wire [width-1 : 0]W变量l,W变量2……;
- 功能定义
模块中最重要的部分是逻辑功能定义部分,有以下3种方法可在模块中产生逻辑。
(1)assign声明语句
如:
assign a=b &c;//两输入与门
(2)实例元件
如:
and #2 ul( q,a,b );//两输入与门
(3))always块
如:
always @ (posedge clk or posedge clr) ;
begin
if(clr)q<=0;
else if(en)q<= d;
end
采用assign语句是描述组合逻辑最常用的方法之一,而 always块既可用于描述组合逻辑,也可描述时序逻辑。
always语句的执行顺序:
- 在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的。所以, “ always”块也称为“过程块”。
- 两个或更多的“always”模块都是同时执行的,而模块内部的语句是顺序执行的。
与C语言的不同:
- 在Verilog模块中所有过程块(如:initial 块,always块),连续赋值语句,实例引用都是并行的。
- 它们表示的是一种通过变量名互相连接的关系。
- 在同一模块中,assign语句、实例元件、always块语句这三者出现的先后顺序没有关系。
- 只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分。