3.1 模块的结构
模块是Verilog的基本设计单元。包括接口描述和逻辑功能描述两部分。
每个verilog程序包括4个主要部分:端口定义
;I/O口说明
;内部信号声明
;功能定义
。
(1) 端口定义
格式为:
module 模块名(口1, 口2, 口3, …)
引用时,用”.”符号,标明原模块时定义时规定的端口名,格式为
模块名(.端口1名(连接信号名1), .端口2名(连接信号名2),…)
例如:
MyDesignMK M1(.sin(SerialIn), .pout(ParallelOut), …)
(2) 模块内容
I/O口说明的格式
输入口:input[信号位宽-1: 0] 端口名;
输出口:output[信号位宽-1: 0] 端口名;
输入/输出口:inout[信号位宽-1: 0] 端口名;
I/O说明也可以写在端口声明语句里,其格式如下:
module module_name(input port1, input port2, output port1, inout port1, …)
(3) 内部信号说明
wire和reg类型变量,如
reg[width-1: 0] 变量1, 变量2…;
wire[width-1: 0] 变量1, 变量2…;
(4) 功能定义
- 用”assign”声明语句,例如:assign a = b & c;
- 用实例元件,如:and #2 u1(q, a, b)。”#2”表示延迟两个单位时间。
- 用“always”块,如:always @(posedge clk or posedge clr);
并行发生的:assign, 实例元件和always块三者是并行发生的。
顺序发生的:always块里的语句是顺序执行的。if…else…if是顺序执行的。
3.2 数据类型及其常量和变量
4种基本数据类型:reg型
,wire型
,integer型
,parameter型
3.2.1 常量
(1) 数字
- 整数:<位宽><进制><数字>,例如8’d10101010;
缺省位宽时,默认为32位;缺省进制时,默认为十进制。
二进制整数(b或B);十进制整数(d或D)
十六进制整数(h或H);八进制整数(o或O)
- x和z值:x代表不定值,z代表高阻值。一个x或z等同于十六进制数的4位二进制数状态、八进制数的3位或二进制的1位。”z”也可写成“?”。
- 负数:在位宽表达式前加一个减号,例如:-8‘d5。
- 下画线:分隔开数的表达,以提高可读性,不参与编译。例如:
16’d1010_1010_1010_1010.
(2)参数(parameter)型
用parameter来定义符号常量。格式:paremeter 参数名1=表达式1, 参数名2=表达式2, …
在模块或实例引用时,可通过参数传递改变被引模块中的参数。例如
module Decode(A, F);
parameter Width = 1, Polarity = 1;
....
endmodule
module Top;
wire [3:0] A4;
wire [4:0] A5;
wire [15:0] F16;
wire [31:0] F32;
Decode #(4,0) D1(A4, F15)
Decode #(5) D2(A5, F32);
endmodule
D1中Width和Polarity分别为4, 0。
D2中Width为5,Polarity不变仍然为1。
也可通过defparam来改变另一模块的参数。详见教材