Home Verilog语法-1
Verilog语法-1
取消

Verilog语法-1


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所用到的所有变量都属于两个基本的类型:线网类型和寄存器类型。

  • 线网类型的变量有以下几种:
    • wiretriwortriorwandtriandtri0tri1supply0supply1trireg,其中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过程将不断循环执行。
  • initial
    • initial过程从关键字initial开始,它只能执行一次


寄存器变量的过程赋值

  • 阻塞赋值 =
    • 如果这一句没有执行完成,那么后面的语句不会执行
  • 非阻塞赋值 <=
    • 如果在顺序代码块中使用非阻塞赋值,则执行这一句的同时,并不会阻碍下一句代码的执行。如果后一个语句涉及前面一个非阻塞赋值语句中的变量,由于这两个语句“同时”执行,因此后一个语句所用到的是前面一个语句执行变量的数值。
数值交换函数
always @ (posedge reset or posedge clock)
begin
  a <= b;
  b <= a;
end
endmodule








该博客文章由作者通过 CC BY 4.0进行授权。