https://zh.wikipedia.org/wiki/Verilog
基本规范
- 空白符 不影响
- 注释 // 或 /**/
- 大小写敏感
- 转义 \
- 保留字均为小写
数据类型
- 四值逻辑
- 0:逻辑低电平,条件为假
- 1:逻辑高电平,条件为真
z:高阻态,浮动x:未知逻辑电平
- 信号强度(从强到弱)及其属性
supply:驱动strong:驱动pull:驱动large:存储weak:驱动medium:存储small:存储highz:高阻态
Verilog采用的具有八种信号强度的四值逻辑(four-valued logic),数字电路中的信号可以用逻辑值、信号强度加以描述。当系统遇到信号之间的竞争时,需要考虑各组信号的状态和强度。如果驱动统一线网的信号强度不同,则输出结果是信号强度高的值;如果两个强度相同的信号之间连接到同一个线网,将会发生竞争,结果为不确定值x。
线网(wire)与寄存器(reg)
Verilog所用到的所有变量都属于两个基本的类型:线网类型和寄存器类型。
- 线网类型的变量有以下几种:
wire、tri、wor、trior、wand、triand、tri0、tri1、supply0、supply1、trireg,其中wire作为一般的电路连线使用最为普遍
- 寄存器类型的变量有以下几种:
- reg(普通寄存器)、integer(整数)、time(时间)、real(实数)
数字表示
数字表示的基本语法结构为<位宽>'<数制的符号><数值>
- 233:十进制数233(未指明位宽)
- 12'h123:十六进制数123(使用12位)
- 20'd44:十进制数44(使用20位,高位自动使用0填充)
- 4'b1010:二进制数1010(使用4位)
- 6'o77:八进制数77(使用6位)
- -233:十进制数-233(未指明位宽)
- -32'd3: 十进制数-3 (使用32位)
- 32'hfffffffd: 十六进制数-3 (使用32位)
向量
向量的表示需要使用方括号,方括号里的第一个数字为向量第一个分量的序号,第二个数字为向量最后一个分量的序号,中间用冒号隔开。
向量定义和初始化
wire [3:0] input_add; //声明名为input_add的4位wire型向量 wire [4:1] input_add1; //也是4位wire型向量,但是分量序号从4到1 wire [0:3] input_add2; //也是4位wire型向量,但是分量序号从0到3
向量操作
input_add [3] = 1'b1; //将1赋值给input_add向量的第三位(最高位) input_add [1:0] = 2'b01; //将0和1分别赋值给input_add向量的第1、0位(最低两位)
当对向量进行赋值时,如果右边的数值位宽大于左边的变量,则多出来的位被丢弃;如果右边的数值位宽小于左边的变量,则不够的位用0填补
数组
参数
可以通过parameter关键字声明参数。参数与常数的意义类似,不能够通过赋值运算改变它的数值。
但是也是可以通过一些方法进行重载的
字符串
同C语言
流程控制
包括
- if
- if ... else
- if ... else if ... else
- case
- for
- while
- casex、casez
- forever:无限循环
- repeat:指定次数循环
运算符
系统任务
所有的系统任务名称前都带有美元符号$使之与用户定义的任务和函数相区分。类似于C语言中的库函数
编译指令
`<keyword> 类似于C语言中的预编译指令,如 `<ifdef>
两种过程
- always
- always过程从关键字
always开始,可以连续多次运行。如果没有使用系统任务$finish,always过程将不断循环执行。
- always过程从关键字
- initial
- initial过程从关键字
initial开始,它只能执行一次
- initial过程从关键字
寄存器变量的过程赋值
- 阻塞赋值 =
- 如果这一句没有执行完成,那么后面的语句不会执行
- 非阻塞赋值 <=
- 如果在顺序代码块中使用非阻塞赋值,则执行这一句的同时,并不会阻碍下一句代码的执行。如果后一个语句涉及前面一个非阻塞赋值语句中的变量,由于这两个语句“同时”执行,因此后一个语句所用到的是前面一个语句执行前变量的数值。
数值交换函数 always @ (posedge reset or posedge clock) begin a <= b; b <= a; end endmodule
的