芯学长 | 掌握芯资讯,引领芯未来

您当前所在位置:首页 > 资源下载 > 技术文库

verilog基础语法|verilog菜鸟教程!

发布时间:2023-08-02来源:芯学长

下载资料
文件概述:

verilog语法对于学习IC设计来说比较重要,它也是目前应用最为广泛的硬件描述语言,可以用来进行各种层次的逻辑设计,也可以进行数字系统的逻辑综合,仿真验证和时序分析等。芯学长带你了解verilog语法。

一、Verilog HDL简介

HDL :Hardware Description Language 硬件描述语言。

VHDL or Verilog ?

毫无疑问,新手选Verilog就对了,原因一是对新手友好,有过C语言底子的很快就能上手;原因二是现目前公司基本使用Verilog。

鉴于Verilog 1995标准有些地方比较拉跨,目前基本采用2001标准。

学习Verilog的基本都是FPGA/IC前端预备军,其他就不再赘述了。

二、Verilog模型

Verilog模型可以是实际电路不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:

1) 系统级(system)

2) 算法级(algorithmic)

3) RTL级(RegisterTransferLevel):

4) 门级(gate-level):

5) 开关级(switch-level)

目前,用门级和RTL级抽象描述的Verilog HDL模块可以用综合器转换成标准的逻辑网表;用算法级描述的Verilog HDL模块,只有部分综合器能把它转换成标准的逻辑网表;而用系统级描述的模块,目前尚未有综合器能把它转换成标准的逻辑网表,往往只用于系统仿真。

其实不用纠结这么多,我们设计基本是行为RTL级,初学时也不必纠结什么电路,只要功能运行正常就OK。大佬都说“看到代码背后的电路”,初期真是强人锁男。待到一定程度后,再来研究代码优化,电路优化。

Verilog模块

Verilog的基本设计单元是“模块”。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。

下面举例说明:



基础-1

可以看到模块由关键字module....endmodule 确定。

module 模块名(接口信号);

//信号声明

//功能描述

endmodule

要求: 1. 模块名具有意义;2. 一个.v文件只有一个模块。

Verilog数据类型

虽然平时我们好像就用到reg/wire ,但其实verilog数据类型有多达19种。

了解常用的4种就好:reg、wire、parameter、integer。

4.1常量

数字 : <位宽><类型><数字> 如: 8’b1100_0010

X和Z值 : X:不定值;Z:高阻 (同也可用?表示)

负数 : 如:-8’d5 ,减号在最前面。

4.2参数型

Verilog模块中可使用parameter来定义一个标识符来代表一个常量。

parameter SIZE = 15;

这里不得不提一下localparam 和 define ,它们都是定义一个标识符来代表一个常量。区别如下:

image

4.3变量

4.3.1 wire型

①线网型,输入输出信号默认为wire型,同时输入信号只能是wire型。

②模块间端口连接,信号都定义为wire型,即进行电路连线。

③wire信号定义: wire [7:0] a;

④wire信号赋值:只能使用assign进行连续赋值(阻塞赋值 “=”):

assign a = b & c;

4.3.2 reg型

①寄存器是数据储存单元的抽象。寄存器数据类型的关键字是reg。但reg型不一定综合成寄存器,具体还要看设计电路。

②always块中的变量必须定义为reg型,使用非阻塞赋值“<=”。

③reg型数据定义: reg [7:0] a;

④reg型数据可以赋正值,也可以赋负值。但当一个reg型数据是一个表达式中的操作数时,它的值被当作是无符号值,即正值。

⑤reg型数据的缺省值为不定值X。

4.3.3 memory型

Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。

verilog2001支持多维数组。

memory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:

reg [n-1:0] 存储器名[m-1:0];

如:reg [7:0] mem_a[255:0];

这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255。注意:对存储器进行地址索引的表达式必须是常数表达式。

这里不得不提一下下面这两种定义的区别:

reg [n-1:0] rega; //一个n位的寄存器

reg mem_a [n-1:0]; //一个由n个1位寄存器构成的存储器组

一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。见下例:

rega =0; //合法赋值语句

mem_a =0; //非法赋值语句

运算符

Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下几类:

1) 算术运算符(+,-,×,/,%)

2) 赋值运算符(=,<=)

3) 关系运算符(>,<,>=,<=)

4) 逻辑运算符(&&,||,!)

5) 条件运算符(?:)

6) 位运算符(~,|,^,&,^~)

7) 移位运算符(<<,>>)

8) 拼接运算符({ })

9) 其它

在Verilog HDL语言中运算符所带的操作数是不同的,按其所带操作数的个数运算符可分为三种:

1) 单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。

2) 二目运算符(binary operator):可以带二个操作数,操作数放在运算符的两边。

3) 三目运算符(ternary operator):可以带三个操作,这三个操作数用三目运算符分隔开。

见下例:

image

优先级:单独运算符优先级最高;不需要刻意去背,书写时使用()便于阅读。

verilog基础语法资料点击上方蓝色按钮下载。

【免责声明】:本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。

文章评价

-   全部 0 条 我要点评