Verilog HDL 基本语法
以$开头的字符串是为系统函数保留的。关键字不能作为标识符使用。
格式
Verilog HDL是自由格式的,即结构可以跨越多行编写,也可以一行内编写。空白符(换行、换页、Tab、空格)没有特殊的意义。
常量及其表示
Verilog HDL用下列4种基本的值表示逻辑电路中的逻辑状态。
- 0: 逻辑0或“假”
- 1: 逻辑1或“真”
- x: 未知状态,通常是在这个信号未被赋值前
- z: 高阻
x值和z值都是不分大小写的,既01xz与01XZ相同
整数表示
<+/−><位宽>′<基数格式><整数>
<script type="math/tex" id="MathJax-Element-3"><+/->
<位宽>
'
<基数格式>
<整数>
</script>
位宽:用十进制数表示整数的位宽,如果没有定义整数的位宽,则位宽的实际长度就是响应的位数。
基数格式:二进制(b或B)、八进制(o或O)、十进制(d或D)、十六进制数(h或H)
整数:最左边是最高有效位,最右边为最低有效位。注意,表示负数时,减号必须写在表达式的前面,不能写在表达式的其他位置上。
如:
-14 // 十进制数 -14
16’d255 //位宽为16的十进制数255
8’h9a //位宽为8的十六进制数0x9a
1. 除了第一个字符,下划线“_”可以出现在数字中的任何位置,仅用于提高可读性,在编译阶段会被忽略掉。例如“32’h21_65_bc_fe”表示位宽为32位的十六进制数0x2165bcfe。8’o_0111_1011”为非法格式 。
2. 在数字电路中,x代表不定值,z代表高阻值,z还有一种表达方式是可以写作“?”。x或z在二进制数字中代表1位x或z的值,在八进制中代表3位x或z的值,在十六进制数中代表4位x或z的值。
如:
4’b1x0x //位宽为4的二进制数1x0x
8’h3x //位宽为8的十六进制数,其低4位值为不定值,0011 xxxx
实数表示
- 十进制格式,由数字和小数点组成。如:0.1、3.1415
- 指数格式(科学表示法),由数字和字符e(或E)组成,e(或E)的前面必须有数字且后面必须为整数。如:13_5.1e2(其值为13510.0,“_”仅为了提高可读),8.5E2(其值850.0)
字符串
字符串常量是由一对双引号括起来的字符序列。且它必须在一行内写完,不可书写在多行中,也不能包含回车符。
变量的数据类型
在Verilog HDL中变量的数据类型是用来表示数字电路中的物理连线、数据存储和传送单元等物理量。共有19种数据类型,包括wire型、reg型、parameter型、large型、integer型、medium型、scalared型、time型、small型、tri型、tri0型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型、net型。
1. 线网型变量(net)
线网型变量可以理解为实际电路中的导线。既然是“导线”则不可以存储任何值,且只能被激励信号“驱动”,可通过连续赋值(assign)和元件的输出连接产生驱动线网的激励信号。给线网提供驱动的赋值和元件就是驱动源。线网的值由驱动源决定。如果没有驱动源的线网型变量,则其值为高阻态即值为z。一个线网型变量可以同时受到几个驱动源的驱动,则该线网型变量的值由逻辑强度较高的驱动源决定;如果驱动源逻辑强度相同,则该值为不定态即值为x。常用的线网型变量包括
wire型
和
tri型
。wire通常用来表示单个门驱动或连续赋值语句的线网型变量。tri通常用来表示多驱动源驱动同一根线的线网类型。
在Verilog 程序模块中,被声明为
input型
或者
inout型
的端口,只能被定义为线网型变量,被声明为
output型
的端口可以被定义为线网型变量或者寄存器型变量。输入输出信号类型(inout)缺省时自动定义为
wire型
。
wire型信号可以用作任何方程式的输入,也可以用作assign语句或实例元件的输出,不可以在initial和always模块中被赋值。
其他线网类型:supply0,supply1(用于对电源建模),wand,triand(多重驱动,具有线与特性的线网类型)、wor,trior(多重驱动,具有线与特性的线网类型),tri1,tri0(上拉电阻,用于开关级建模),trireg(具有电荷保持特性的线网类型,用于开关级建模)。
2. 寄存器型变量
寄存器型变量可以理解为实际电路中的寄存器,在输入信号消失后它可以保持原有的数值不变。与线网型变量的根本区别在于:register型变量需要被明确地赋值,并且在被重新赋值之前将一直保持原值。且只能在initial或always内部通过赋值语句改变寄存器存储的值,赋值之前,默认值为x。
其他寄存器变量类型 :integer (32位有符号整型变量),time(64位无符号时间变量),real(64位有符号实型变量),由于这几种寄存器变量的位宽已经固定,因此在定义此类变量时,不可以加入位宽。
3. memory型变量
memory型数据是通过扩展reg数据的地址范围来生成的。其格式为:
reg[msb:lsb] 存储器名1[upper1:lower1],
存储器名2[upper2:lower2],....;
如:reg[7:0] mem[1023:0]; 1024个单元,每单元8bit。mem[1] = 2;对存储器变量的赋值只能是这样,其他的赋值非法。
4. parameter(参数)语句
用parameter来定义一个标识符代表一个常量,相当于宏定义。如:parameter Pi = 3.14;