一、语言简介

Verilog HDL 是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以来表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

二、Verilog HDL 语言基础语法

2.1 逻辑值

0:逻辑低电平,条件为假

1:逻辑高电平,条件为真

z:高阻态,无驱动

x:未知逻辑电平

在综合工具眼中,或者说在实际实现的电路中,并没有什么 X 值,只存在 0、 1 和 Z 三种状态。在实际电路中还可能出现亚稳态,它既不是 0,也不是 1,而是一种不稳定的状态。

2.2 变量

Verilog 语言中主要的两种变量类型:

1. 线网型:表示电路间的物理连接;

2. 寄存器型: Verilog 中一个抽象的数据存储单元。

2.3 参数

数是一种常量,通常出现在 module 内部,常被用于定义状态机的状态、数据位宽和计数器计数个数大小等,例如:

2.4 常量

基数表示法 :[换算为二进制后位宽的总长度][’ ][数值进制符号][与数值进制符号对应的数值]

常量是 Verilog 中不变的数值, Verilog 中的常量有三种类型 :
(1) 整数型;

(2) 实数型;

(3) 字符串型。

2.5 赋值语句

赋值语句的赋值方式有两种,分别为“<=”(非阻塞赋值)和“=”(阻塞赋值)。

1. 以赋值操作符“ <=”来标识的赋值操作称为“非阻塞型过程赋值( NonblockingAssignment)”。非阻塞型过程赋值语句的特点如下:

(1) 在 begin-end 串行语句块中,一条非阻塞过程语句的执行不会阻塞下一语句的执行,也就是说在本条非阻塞型过程赋值语句对应的赋值操作执行完之前,下一条语句也可以开始执行;

(2) 仿真过程在遇到非阻塞型过程赋值语句后首先计算其右端赋值表达式的值,然后等到仿真时间结束时再将该计算结果赋值变量。也就是说,这种情况下的赋值操作是在同一仿真时刻上的其他普通操作结束后才得以执行。

2. 以 赋 值 操 作 符 “ = ” 来 标 识 的 赋 值 操 作 称 为 “ 阻 塞 型 过 程 赋 值 ( BlockingAssignment)”。阻塞型过程赋值语句的特点如下:

(1) 在 begin-end 串行语句块中的各条阻塞型过程赋值语句将以它们在顺序块后排列次序依次得到执行;

(2) 阻塞型过程赋值语句的执行过程是:首先计算右端赋值表达式的值,然后立即将计算结果赋值给“=”左端的被赋值变量。

阻塞型过程赋值语句的这两个特点表明:仿真进程在遇到阻塞型过程赋值语句时将计算表达式的值并立即将其结果赋给等式左边的被赋值变量;在串行语句块中,下一条语句的执行会被本条阻塞型过程赋值语句所阻塞,只有在当前这条阻塞型过程赋值语句所对应的赋值操作执行完后下一条语句才能开始执行。

2.6 关系运算符

关系运算符种类:

(1) a < b, a 小于 b

(2) a > b, a 大于 b

(3) a <= b, a 小于或者等于 b

(4) a >= b, a 大于或者等于 b
进行关系运算时,如果声明的关系是假的( false),则返回值是 0;如果声明的关系是真的(true),则返回值是 1;如果某个操作数的值不定,则关系是模糊的,返回值是x。

2.7 归约运算符、按位运算符和逻辑运算符

2.7.1 归约运算符和按位运算符

“&”操作符有两种用途,既可以作为一元运算符(仅有一个参与运算的量),也可以作为二元运算符(有两个参与运算的量)。

2.7.2 逻辑运算符

我们在写 Verilog 代码时常常当 if 的条件有多个同时满足时就执行使用“&&”逻辑与操作符。 m&&n 是判断 m 和 n 是否都为真,最后的结果只有 1bit,如果都为真则输出1’b1,如果不都为真则输出 1’b0。要注意和“&”的功能区分。

2.8 移位运算符

移位运算符是二元运算符,左移符号为“<<”,右移符号为“>>”,将运算符左边的操作数左移或右移指定的位数,用 0 来补充空闲位。

2.9 条件运算符

如果在条件语句中,只执行单个的赋值语句时,用条件表达式会更方便。条件运算符为“ ? : ”,它是一个三元运算符,即有三个参与运算的量。

由条件运算符组成的条件表达式的一般形式为:表达式 1 ? 表达式 2 : 达式 3

执行过程是:当表达式 1 为真,则表达式 2 作为条件表达式的值,否则以表达式 3 作为条件表达式的值。例如: a = 6, b = 7,条件表达式(a > b) ? a : b 的结果为 7。

2.10 优先级

总的优先级关系为:归约运算符 > 算数运算符 > 移位运算符 > 关系运算符 > “= =”和“!=” > 按位运算符 > “&&”和“||” > 条件运算符,总的来说是一元运算符 > 二元运算符 > 三元运算符。

2.11 位拼接运算符

位拼接运算符由一对花括号加逗号组成“ { , }”,拼接的不同数据之间用“ ,”隔开。位拼接运算符的作用主要有两种,一种是将位宽较短的数据拼接成一个位宽长的数据;另一种是可以通过位拼接实现移位的效果。

2.12 if-else 与 case

Verilog HDL 语言中存在两种分支语言:

1、 if-else 条件分支语句

2、 case 分支控制语句

2.13 inout 双向端口

在定义端口列表的时候我们知道输入用 input,输出用 output,其实还有一种双向端口,我们定义时使用 inout,在后面的实例中会用到,例如 IIC 和 SDRAM 的数据线都是双向端口。

2.14 Verilog 语言中的系统任务和系统函数

Verilog 语言中预先定义了一些任务和函数,用于完成一些特殊的功能,它们被称为系统任务和系统函数,这些函数大多数都是只能在 Testbench 仿真中使用的,使我们更方便的进行验证。

`timescale 1ns/1ns //时间尺度预编译指令 时间单位/时间精度

主要的函数有如下这些,在支持 Verilog 语法的编辑器中都会显示为高亮关键字