注意:语法集和C语言几乎完全一样,但是设计方法和C完全不一样(从根本上不同)
Verilog HDL语言要素
空白符
空格符(\b)、制表符(\t)、换行符、换页符。编译和综合时被忽略。
作用:提高代码易读性
注释符
单行://
多行:/* */
所有的注释用英文(EDA工具对中文支持不好)
标识符
用来命名信号名、模块名、参数名等。
规则:
- 任意一组字母、数字、$、_(下划线)的组合;
- 区分大小写
- 首字符必须是字母或下划线
转义标识符:以\开头,空白符结尾(可以是\b、\t或换行),如:\a+b-c
关键字
见课本2.1.4
数值
| 状态 | 含义 |
|---|---|
| 0 | 低电平、逻辑”0“、假 |
| 1 | 高电平、逻辑”1“、真 |
| x/X | 不确定或未知的逻辑状态 |
| z/Z | 高阻态 |
| 数制 | 基数符号 | 合法表示符 |
|---|---|---|
| 二进制 | b/B | 0、1、x、X、z、Z、?、_ |
| 八进制 | o/O | 0-7、x、X、z、Z、?、_ |
| 十进制 | d/D | 0-9、_ |
| 十六进制 | h/H | 0-9、a-f、A-F、x、X、z、Z、?、_ |
-
整数及其表示: +/-< size > ’ <base_format>< number >
- 正负号。数值可以用补码
- size:位数。标准的写法,建议都把size写上。
- base_format: 基数符号
- number:对应的数字(过长可以使用_分割以增强易读性)
几个例子:
//正确表示(课本例2.1-6):
8'b10001101 //8位二进制数:10001101
8'ha6 //8位十六进制数:a6
5'o35 //5位八进制数:35
4'd6 //4位十进制数:6
4'b1x_01 //4位二进制数:1x01
//错误表示(课本例2.1-7):
4'd-4 //符号出现在数值位,有符号应该放在最左边
3' b001 //'和基数之间不能有空格
(4+4)'b11 //size不能是表达式
-
实数及其表示(也允许使用_):
(1)十进制表示法:十进制格式。小数点两边必须有数字,如3.0是正确的,5.和.3就是错误的
(2)科学计数法:同C
数据类型
信号强度表示数字电路不同的驱动源,用来解决不同驱动强度下的赋值冲突:(???)
| 标识符 | 名称 | 类型 |
|---|---|---|
| supply | 电源级驱动 | 驱动 |
| strong | 强驱动 | 驱动 |
| pull | 上拉级驱动 | 驱动 |
| large | 大容性 | 存储 |
| weak | 弱驱动 | 驱动 |
| medium | 中性驱动 | 存储 |
| small | 小容性 | 存储 |
| highz | 高容性 | 高阻 |
强弱程度:从supply到highz依次递减。
物理数据类型
连线型
| 数据类型 | 功能说明 |
|---|---|
| wire,tri | 标准线型(缺省为该类型) |
| wor,trior | 多重驱动时,具有线或特性的连线型 |
| wand,trand | 多重驱动时,具有线与特性的连线型 |
| trireg | 具有电荷保持特性的连线型类型(特例) |
| tri1 | 上拉电阻 |
| tri0 | 下拉电阻 |
| supply1 | 电源线,用于对电源建模,为高电平1 |
| supply0 | 电源线,用于对”地“建模,为低电平0 |
声明:
<net_declaration>[list_of_variables];
net_declaration:见上表。
drive-strength:连线变量的驱动强度。
range:指定数据为标量或矢量。默认为1位的标量,超过1位为矢量。
delay:仿真延迟时间。
list_of_variables:变量名称,一次可定义多个名称,用逗号分隔。
寄存器型
reg型是数据存储单元的抽象类型,其对应的硬件电路单元具有状态保持作用,能够存储数据,如触发器、锁存器。
常用于行为级描述(?),由过程赋值语句对其进行描述。
定义:
reg [x:x] 名称; 如果没有用中括号定义位数,就是一位变量。
一般为无符号数,若将一个负数赋值给reg变量,则自动转为其补码类型。
声明:
reg<list_of_register_variables>:
range:可选项,指定range的位宽,缺省为1位。
list_of_register_variables:变量名称列表,一次可定义多个名称,用逗号分隔。
存储器型
可描述RAM、ROM类型存储器以及reg文件。
声明:
reg<name_of_register>;
range1和range2是可选项,缺省是1。
range1:表示存储器中寄存器的位宽,格式:[msb:lsb]。
range2:表示寄存器的个数,格式:[msb:lsb],即有msb-lsb+1个。
name_of_register:一次可定义多个名称,用逗号分隔。
抽象数据类型
整型(integer)、时间型(time)、实型(real)、参数型(parameter)