一、Verilog模块的结构
module block1(a, b, c, d ); //端口信息
input a, b, c ;
output d ; // I/O说明
wire x; //内部信号声明
assign d = a | x ;
assign x = ( b & ~c ); //功能定义
endmodule
Verilog的基本设计是由模块组成,一个模块是由两个部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义如何影响输出的。如上例,Verilog结构是在module和endmodule声明语句之间的。在这里,module和endmodule构成了模块的关键词。每个Verilog模块包括4个主要部分:端口定义、I/O说明、内部信号声明和功能定义。
二、数据类型及其常量与变量
Verilog HDL中数据类型用来表示硬件电路的数据存储和传送元素的,总共有19种数据类型。其中reg型、wire型、integer型和parameter型是最常见的4种数据类型。其它类型包括large型、medium型、small型、scalared型、time型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wor型。这14中数据类型除time型外都与基本逻辑单元建库有关。
A.常量
1.数字
(1)整数:
- 1) 二进制整数(b或B)
- 2) 十进制整数(d或D)
- 3) 十六进制整数(h或H)
- 4) 八进制整数(o或O)
数字表达方式:
- <位宽><进制><数字>,该表达方式为最全面的描述
- <进制><数字>,在该表达方式中位宽省略时采用默认位宽(由具体的机器系统决定,至少为32位)
- <数字>,该表达方式采用默认进制(十进制)
下述举例:
8’b10000011 //位宽为8的二进制数10000011,‘b表示二进制
4’hf //位宽为4的十六进制数f,‘h表示十六进制
’d32 //默认位宽的十进制数32,‘d表示十进制
(2)x和z值:
x代表不定值,z代表高阻值。个x可以定义十六进制的4位,八进制的3位。z的表示方式与x类似。z还有一种表达方式为“?”,一般用于case语句中
下述举例:
4'b10x0 //位宽为4的二进制数倒数第二位数值不定
4'b101z //位宽为4的二进制数最后一位数值为高阻
12'dz //位宽为12的十进制数,其值为高阻值
12'hz //位宽为12的十六进制数,其低四位为高阻值
(3)负数:
位宽前加-号,内部是补码
-12'h1 = 12'hFFF
8'd-5 //非法表示
(4)下划线_:
仅用来提高程序的可阅读性
2.参量
参数是一个常量,经常用于定义时延和变量的宽度。在Verilog HDL中用parameter定义参量,其说明格式:
parameter 参数名1=表达式,参数名2=表达式,···;
在模块或实例的应用中,可以传递参数值:
module decode(A,F); parameter Width=1; parameter P=2; …. endmodule module top; wire [3:0]A4; wire [3:0]F4; decode #(3,4) D1(A4,F4) endmodule
在上例代码中,实例D1引用参数Width=3,P=4时的decode模块。若想要在一个模块改变另外一个模块的参数时,需要使用defparam命令。
例:test.T.B1.P=2
B.变量
1.wire型
用来表示单个门驱动或连续赋值语句驱动的网络型数据,默认值为z,常用assign语句指定的组合逻辑信号中。
说明格式: wire [n-1:0] 数据名1,数据名2,···;
2.reg型
其作用与改变触发器储存的值相当,默认值为x。在always 块内被赋值的每一个变量必须是reg型。
说明格式: reg [n-1:0] 数据名1,数据名2,···;
注:reg类型不一定为实际的寄存器或触发器的输出
3.memory型
:通过对reg 型变量建立数组来对存储器建模,可以描述RAM 型存储器,ROM 存储器和reg文件。
说明格式:reg [n-1:0] 存储器名[m-1:0]
例:reg[7:0] mema[255:0] 该例子定义一个名为mema的存储器,该存储器有256个8位的寄存器