3.Verilog HDL语言基础.ppt_第1页
3.Verilog HDL语言基础.ppt_第2页
3.Verilog HDL语言基础.ppt_第3页
3.Verilog HDL语言基础.ppt_第4页
3.Verilog HDL语言基础.ppt_第5页
已阅读5页,还剩315页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Verilog HDL语言基础-本章概述,本章介绍Verilog语言的基础知识,其中包括: Verilog语言概述; Verilog语言的程序结构; Verilog语言要素; Verilog常量; Verilog语言数据类型; Verilog名字空间; Verilog语言表达式; Verilog的行为级描述语句;,Verilog HDL语言基础-本章概述,Verilog的门级描述语句; Verilog编译指示语句; Verilog系统任务和函数; Verilog用户定义任务和函数和Verilog语言模块描 述方式。 本章内容对于初步掌握Verilog语言规则非常重 要。,-Verilog语言概

2、述,Verilog HDL(以下简称Verilog)是一种硬件描述语 言,用于从算法级、门级到开关级的多种抽象设计层次的 数字系统建模。,-Verilog语言概述,Verilog HDL语言具有下述描述能力: 设计的行为特性 设计的数据流特性 设计的结构组成 包含响应监控和设计验证方面的时延和波形产生机制。 所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、 验证期间从设计外部访问设计,包括模拟的具体控制和运 行。,-Verilog语言概述,Verilog HDL语言不仅定义了语法,而且对每个语法 结构都定义了清晰的模拟、仿真语义。因此,用

3、这种语言 编写的模型能够使用Verilog仿真器进行验证。语言从C编 程语言中继承了多种操作符和结构。Verilog HDL提供了 扩展的建模能力,其中许多扩展最初很难理解。,Verilog HDL语言发展历史,Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模拟器产品开发的硬件建模语言。由 于他们的模拟、仿真器产品的广泛使用,Verilog HDL作 为一种便于使用且实用的语言逐渐为众多设计者所接受。 在一次努力增加语言普及性的活动中,Verilog HDL语言 于1990年被推向公众领域。Open Verilog Internatio

4、nal (OVI)是促进Verilog发展的国际性组织。1992年,OVI 决定致力于推广Verilog OVI标准成为IEEE标准。这一努 力最后获得成功,Verilog语言于1995年成为IEEE标准, 称为IEEE Std13641995。完整的标准在Verilog硬件描 述语言参考手册中有详细描述。,Verilog HDL硬件描述语言功能,Verilog硬件描述语言的主要功能包括: 1基本逻辑门,例如and、or和nand等都内置在语言 中。 2用户定义原语(UDP)创建的灵活性。用户定义的 原语既可以是组合逻辑原语,也可以是时序逻辑原语。 3开关级基本结构模型,例如pmos和nmos

5、等也被内置 在语言中。,Verilog HDL硬件描述语言功能,4提供显式语言结构指定设计中的端口到端口的时 延及路径时延和设计的时序检查。 5可采用三种不同方式或混合方式对设计建模。这 些方式包括: 行为描述方式使用过程化结构建模; 数据流方式使用连续赋值语句方式建模; 结构化方式使用门和模块实例语句描述建模。,Verilog HDL硬件描述语言功能,6Verilog HDL中有两类数据类型:网络数据类型和 寄存器数据类型。网络类型表示构件间的物理连线,而寄 存器类型表示抽象的数据存储元件。 7能够描述层次设计,可使用模块实例结构描述任何 层次。 8设计的规模可以是任意的,语言不对设计的规模

6、 (大小)施加任何限制。,Verilog HDL硬件描述语言功能,9Verilog HDL不再是某些公司的专有语言而是IEEE 标准。 10人和机器都可阅读Verilog 语言,因此它可作为 EDA的工具和设计者之间的交互语言。 11Verilog HDL语言的描述能力能够通过使用编程语 言接口(PLI)机制进一步扩展。PLI是允许外部函数访问 Verilog模块内信息、允许设计者与模拟器交互的例程集 合。,Verilog HDL硬件描述语言功能,12设计能够在多个层次上加以描述,从开关级、门 级、寄存器传送级(RTL)到算法级,包括进程和队列 级。 13能够使用内置开关级原语在开关级对设计完

7、整建 模。 14同一语言可用于生成模拟激励和指定测试的验证 约束条件,例如输入值的指定。,Verilog HDL硬件描述语言功能,15Verilog HDL能够监控模拟验证的执行,即模拟验 证执行过程中设计的值能够被监控和显示。这些值也能够 用于与期望值比较,在不匹配的情况下,打印报告消息。 16在行为级描述中,Verilog HDL不仅能够在RTL级 上进行设计描述,而且能够在体系结构级描述及其算法级 行为上进行设计描述。 17能够使用门和模块实例化语句在结构级进行结构 描述。,Verilog程序结构,一个复杂电路系统的完整Verilog HDL模型是由若 干个Verilog HDL模块构成

8、的,每一个模块又可以由若干 个子模块构成。Verilog使用大约100个预定义的关键词定 义该语言的结构。,Verilog程序结构,用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型,也称为模块,是Verilog的基本描述单位。一般 来说一个模块可以是一个元件或者是一个更低层设计模块 的集合。模块是并行运行的,通常需要一个高层模块通过 调用其他模块的实例来定义一个封闭的系统,包括测试数 据和硬件描述。,Verilog程序结构,Verilog程序结构,Verilog结构位于module和endmodule声明语句之间, 每个Verilog程序包括端口定义、数据类型说明和

9、逻辑功能 定义部分。 是模块唯一的标识符;是由 模块各个输入、输出和双向端口组成的一张端口列表,这 些端口用来与其他模块进行通信;数据类型说明部分用来 指定模块内用到的数据对象为寄存器型、存储器型还是连 线型;逻辑功能定义部分通过使用逻辑功能语句来实现具 体的逻辑功能。,Verilog程序结构,每个Verilog HDL程序源文件都以.v作为文件扩展名。 Verilog HDL区分大小写,也就是说大小写不同的标识符 是不同的。此外,Verilog HDL程序的书写与C语言类似, 一行可以写多条语句,也可以一条语句分成多行书写,每 条语句以分号结束,endmodule语句后不加分号。白空 (新行

10、、制表符和空格)没有特殊意义,Verilog程序结构-模块声明,模块声明包括模块名字,模块的输入,输出端口类表。 模块的定义格式如下: module (port_name1,port_namen); . . . endmodule; 其中: module_name为模块名,是该模块的唯一标识。 port_name为端口名,这些端口名使用“,”分割。,Verilog程序结构-模块端口定义,端口是模块与外部其它模块进行信号传递的通道(信 号线),模块端口分为输入、输出或双向端口。端口的定 义格式为: 1input , .; 其中: input为关键字,用于声明后面的端口为输入口; input_po

11、rt_name为输入端口名字; other_inputs为用逗号分割的其它输入端口的名字;,Verilog程序结构-模块端口定义,2output ,.; 其中: output为关键字,用于声明后面的端口为输出端口; output_port_name为输出端口名字; other_outputs为逗号分割的其它输出端口的名字; 3inout ,.; 其中: inout为关键字,用于声明后面端口为输入/输出类型端口; other_inouts为输入/输出端口的名字; other_inouts为逗号分割的其它输入/输出端口的名字;,Verilog程序结构-模块端口定义,在声明端口的时候,除了声明其输入

12、/输出外,还需要 注意以下几点: 1在声明输入/输出时,还要声明其数据类型,是net 型还是reg型;默认的端口类型为net类型。端口可被显式 地指定为网络。 2输出或输入端口能够被重新声明为reg型寄存器。 无论是在网络说明还是寄存器说明中,网络或寄存器必须 与端口说明中指定的宽度相同。 3输入和双向端口不能声明为寄存器型。,Verilog程序结构-模块端口定义,【例3.1】端口说明实例 module addr(cout,sum,ina,inb,cin) input cin; input7:0 ina,inb; output7:0 sum; output cout; endmodule 注意

13、,在verilog中,也可以使用ANSI C风格进行端口 声明。这种风格的声明的优点是避免了端口名在端口列表 和端口声明语句中的重复。如果声明中未指明端口的数据 类型,那么默认端口具有wire数据类型。下面给出这种声 明的例子。,Verilog程序结构-模块端口定义,【例3.2】 ANSI C风格的端口说明实例 module fulladd4(output reg 3:0 sum, output reg c_out, input 3:0 a,b,input c_in); endmodule,Verilog程序结构-信号类型声明,对模块中所用到的所有信号(包括端口信号、节电信 号等)都必须进行数

14、据类型的定义。Verilog HDL语言提 供了各种信号类型,分别模拟实际电路中的各种物理连接 和物理实体。下面是定义信号数据类型的几个例子。 【例3.3】信号类型声明 reg cout; /定义信号cout的数据类型为reg reg7:0 out; /定义信号out的数据类型为8位reg wire A,B,C,D,F /定义信号A,B,C,D,F为wire(连线) 型,Verilog程序结构-逻辑功能定义,逻辑功能定义是Verilog程序结构中最重要的部分, 逻辑功能定义用于实现模块中的具体的功能。 主要的方法有: 1赋值语句实现逻辑定义 赋值语句是最简单的逻辑功能描述,用assign赋值语

15、 句定义: 【例3.4】赋值语句用于逻辑功能定义的例子。 assign F=(A,Verilog程序结构-逻辑功能定义,2模块调用 指从模块模板生成实际的电路结构对象的操作,这样 的电路结构对象被称为模块实例,模块调用也被称为实例 化。一个Verilog模块可以被任意多个其他模块调用。 在Verilog HDL语言中,模块不能被嵌套定义,但是却 可以包含其他模块的拷贝,即调用其他模块的实例。模块 的定义和模块的实例是两个不同的概念,在一个设计中, 只有通过模块调用(实例化)才能使用一个模块。,Verilog程序结构-逻辑功能定义,3在always过程赋值 always块经常用来描述逻辑功能,a

16、lways块经常用来 描述时序逻辑电路。 【例3.5】always过程实现计数器的过程。 always (posedge clk) begin if(reset) out=0; else out=out+1; end,Verilog程序结构-逻辑功能定义,4函数和任务调用 模块调用和函数调用非常相似,但是在本质上又有很 大差别:一个模块代表拥有特定功能的一个电路块,每当 一个模块在其他模块内被调用一次,被调用模块所表示的 电路结构就会在调用模块代表的电路内部被复制一次(即 生成被调用模块的一个实例);但是模块调用不能像函数 调用一样具有“退出调用”的操作,因为硬件电路结构不会随着时间而发生变化

17、,被复制的电路块将一直存在。后续章节会详细介绍函数和任务的声明和调用方法。,Verilog语言要素,1. 注释 在Verilog HDL中有两种形式的注释。其具体格式如下: /*第一种形式:可以扩展至多行* / /第二种形式:在本行结束。,Verilog语言要素,2间隔符 间隔符包括空格字符(b)、制表符(t)、换行符(n) 等。,Verilog语言要素,3标识符 Verilog HDL中的标识符(identifier)可以是任意一组字 母、数字、$符号和_(下划线)符号的组合,是赋予一个对 象唯一的名字。标识符的第一个字符必须是字母或者下 划线。另外,标识符是区分大小写的。标识符分为简单 标

18、识符、转义标识符、生成标志符、关键字。,Verilog语言要素,4关键字 Verilog HDL语言内部使用的词称为关键字或保留字, 保留字不能随便使用。所有的关键字都使用小写字母。 5运算符 Verilog提供了丰富的运算符,关于运算符的内容将在 后面详细介绍。,Verilog常量,在程序运行过程中,不能改变的量称为常量(constants) Verilog HDL中有三类常量: 整型; 实数型; 字符串型。,Verilog常量-整数型常量,整数型常量可以按如下两种方式描述: 1简单的十进制格式 这种形式的整数定义为带有一个可选的“+”(一元)或 “-”(一元)操作符的数字序列。 下面是这种

19、简易十进制形式整数的描述。 32 十进制数32 -15 十进制数-15,Verilog常量-整数型常量,2基数表示法 这种形式的整数格式为:; :定义以位计的常量的位长;它指定数的二进制位宽的参数。 :单引号是指定位宽格式表示法的固有字符,不能省略。 :是基于base的值的数字序列,由相应基数格式的数字串组成。值x和z以及十六进制中的a到f不区分大小写。,Verilog常量-整数型常量,【例3.6】下面给出基数表示的具体实例。 5O37 5位八进制数 4D2 4位十进制数 4B1x_01 4位二进制数 7Hx 7位x(扩展的x),即xxxxxxx 4hZ 4位z(扩展的z),即zzzz 4d-

20、4 非法,数值不能为负 8h2A 在位长和字符之间,以及基数和数值之间 允许出现空格 3 b001 非法,和基数b之间不允许出现空格 (2+3)b10 非法,位长不能够为表达式,Verilog常量-整数型常量,【例3.7】采用不同基数表示的例子 o721 9位八进制数 hAF 8位十六进制数 【例3.8】补零填充的例子 10b10,左边添0占位,0000000010 10bx0 x1,左边添x占位, xxxxxxx0 x1 【例3.9】数据被截断的例子 3b1001_0011与3b011相等 5H0FFF与5H1F相等,Verilog常量-实数型常量,实数可以用下列两种形式描述: 1十进制计数

21、法 【例3.10】十进制计数法表示实数常量的例子 2.0,5.678,11572.12,0.1 2.为非法,因为小数点两侧必须要有1位数字,Verilog常量-实数型常量,2科学计数法 【例3.11】科学计数法表示实数常量的例子 23_5.1e2其值为23510.0;忽略下划线 3.6E2其值为360.0e(与E相同) 5E-4其值为0.0005 Verilog语言定义了实数如何隐式地转换为整数。 实数通过四舍五入被转换为最相近的整数。,Verilog常量-实数型常量,【例3.12】对实数四舍五入后的表示 42.446,42.45转换为整数42 92.5,92.699转换为整数93 -15.6

22、2转换为整数-16 -26.22转换为整数-26,Verilog常量-字符串常量,字符串是双引号内的字符序列,用一串8位二进制 ASC码的形式表示,每一个8位二进制ASC码代表 一个字符。例如:字符串“ab”等价于16h5758。如果字 符串被用作Verilog表达式或复制语句的操作数,则字符 串被看做无符号整数序列。,Verilog常量-字符串常量,1字符串变量声明 字符串变量是寄存器型变量,它具有与字符串的字符 数乘以8相等的位宽。,Verilog常量-字符串常量,【例3.13】字符串变量的声明。 存储12个字符的字符串“Hello China!”需要8*12 (即96位)宽的寄存器。 r

23、eg 8*12:1 str1; initial begin str =“Hello China!”; end,Verilog常量-字符串常量,2字符串操作 可以使用Verilog HDL的操作符对字符串进行处理,被 操作符处理的数据是8位ASC码的序列。在操作过程中 ,如果声明的字符串变量位数大于字符串实际长度,则在 赋值操作后,字符串变量的左端(即高位)补0。,Verilog常量-字符串常量,【例3.14】字符串操作的例子 module string_test; reg8*14:1 stringvar; initial begin stringvar=“Hello China”; $disp

24、lay(“%s is stored as %h”,stringvar,stringvar); Stringvar=stringvar.“!”; $display(“%s is stored as %h”,stringvar,stringvar); end endmodule,Verilog常量-字符串常量,输出结果为: Hello China is stored as 00000048656c6c6f20776f726c64 Hello China! is stored as 48656c6c6f20776f726c64212121,Verilog常量-字符串常量,3特殊字符 在某些字符之前加

25、上一个引导性的字符(转移 字符),这些的字符只能用于字符串中。 表3.1列出了这些特殊字符的表示和意义。,Verilog常量-字符串常量,Verilog数据类型,Verilog HDL有下列四种基本的值: 1)0:逻辑0或“假”状态; 2)1:逻辑1或“真”状态; 3)x(X):未知状态,对大小写不敏感; 4)z(Z):高阻状态,对大小写不敏感。,网络和变量,在Verilog HDL中,根据赋值和对值保持方式不同, 可将数据类型主要分为两大类:网络(net)型和变 (Variable)型。这两类数据也代表了不同的硬件结构。,网络和变量 -net(网络)型,net表示器件之间的物理连接,需要门和

26、模块的驱动 。网络数据类型是指输出始终根据输入的变化而更新其值 的变量,它一般指的是硬件电路中的各种物理连接。 没有声明的net的默认类型为1位(标量)wire类型。 Verilog HDL禁止对已经声明过的网络、变量或参数再次 声明。,网络和变量 -net(网络)型,下面给出net声明的语法格式: range delay ,net_name; 其中: net_type:表示网络型数据数据的类型。 range:用来指定数据为标量或矢量。若该项默认,表示数据类型为1位的标量;反之,由该项指定数据的矢量形式。 delay:指定仿真延迟时间。 net_name:net名称,一次可定义多个net,用逗

27、号分开。,网络和变量 -net(网络)型,【例3.15】网络的声明 wand w; / 一个标量wand类型net tri 15: 0 bus; / 16位三态总线 wire 0: 31 w1, w2; / 两个32位wire,MSB为bit0,网络和变量 -net(网络)型,常用的net型变量,网络和变量 -net(网络)型,网络数据类型包含多种不同种类的网络子类型: wire型,tri型,wor型,trior型,wand型,triand型,trireg型,tri1型,tri0型,supply0型,supply1型。 简单的网络类型说明语法为: net_kindmsb:lsbnet1,net

28、2, . . . , netN;,网络和变量 -net(网络)型,网络型数据的默认初始化值为Z。带有驱动的网络 型数据应当为它们的驱动输出指定默认值。trireg网络 型数据时一个例外。它的默认初始值为x,而且在声明 语句中应当为其指定电荷量强度。,网络和变量 -net(网络)型,在一个网络型数据类型声明中,可以指定两类强度: 电荷量强度(charge strength) 驱动强度(drive strength)。,网络和变量 -net(网络)型,下面简要说明以下这两种强度的含义及其功能:,1)电荷量强度(charge strength) 一个trireg网络型数据用于模拟电荷存储。电荷量强度

29、可由下面的关键字来制定电容量的相对大小:small、medium、large。默认的电荷强度为medium。 一个trireg网络型数据能够模拟一个电荷存储节点,该节点的电荷量将随时间而逐渐衰减。对于一个trireg网络型数据在仿真时,其电荷衰减时间应当制定为延迟时间。,网络和变量 -net(网络)型,2)驱动强度(drive strength) 在一个网络型数据的声明语句中如果对数据对象进行了连续赋值,就可以为生命的数据对象指定驱动强度。,网络和变量 -net(网络)型,1wire和tri网络类型 用于连接单元的连线是最常见的网络类型。连线与三态线(tri)网语法和语义一致;三态线可以用于描

30、述多个驱动源驱动同一根线的网络类型;并且没有其他特殊的意义。如果多个驱动源驱动一个连线(或三态网络),网络的有效值由表3.3确定。,网络和变量 -net(网络)型,表3.3 网型数据类型wier和tri的真值表,常用的网络类型由关键词wire定义。wire型变量的定义格式如下: wire n-1:0 ,; 其中name1,namen表示wire型名字。,网络和变量 -net(网络)型,【例3.16】wire型变量的说明 wire L; /将上述电路的输出信号L声明为网络型变量 wire 7:0 data bus; /声明一个8bit宽的网络型总线变量,网络和变量 -net(网络)型,2wor和

31、trior网络类型 wor和trior用于连线型逻辑结构建模。当有多个驱动源驱动wor和trior型数据时,将产生线或结构。如果驱动源中任一个为1,那么网络型数据的值也为1。线或和三态线或(trior)在语法和功能上是一致的。如果多个驱动源驱动这类网,网的有效值由表3.4决定。,网络和变量 -net(网络)型,表3.4 wor和trior网络类型有效值,网络和变量 -net(网络)型,3wand和triand网络类型 线与(wand)网指如果某个驱动源为0,那么网络的值为0。当有多个驱动源驱动wand和triand型数据时,将产生线与结构。线与和三态线与(triand)网在语法和功能上是一致的

32、。如果这类网络存在多个驱动源,网络的有效值由表3.5决定。,网络和变量 -net(网络)型,表3.5 wand和triand网络类型有效值,网络和变量 -net(网络)型,4Trireg网络类型,一个trireg网络型数据可以处于驱动和电容性两种状态之一: 1)驱动状态:当至少被一个驱动源驱动时,trireg网型数据有一个值(1、0、x)。判决值被导入trireg型数据,也就是trireg型网络的驱动值。 2)电容性状态:如果所有驱动源都处于高阻状态 (z),trireg网络型数据则保持它最后的驱动值。高阻值不会从驱动源导入trireg网络型数据。,网络和变量 -net(网络)型,tri0(t

33、ri1)网络的特征是,若无驱动源驱动,它的值为0(tri1的值为1)。网络值的驱动强度都为pull。tri0相当于这样一个wire型网络:有一个强度为pull的0值连续驱动该wire。同样,tri1相当于这样一个wire型网络:有一个强度为pull的1值连续驱动该wire。,5tri0和tri1网络类型,网络和变量 -net(网络)型,表3.6给出在多个驱动源情况下tri0或tri1网的有效值。,网络和变量 -net(网络)型,6supply0和supply1网络类型,supply0用于对“地”建模,即低电平0;supply1网用于对电源建模,即高电平1。,【例3.17】supply0和sup

34、ply1网络类型描述 supply0 Gnd,ClkGnd; supply1 2:0 Vcc;,网络和变量 -net(网络)型,7未说明的网络 在Verilog HDL中,有可能不必声明某种网络类型。在这样的情况下,网络类型为1位网络。可以使用default_nettype编译器指令改变这一隐式网络说明方式。使用方法如下 default_nettypenet_kind 例如,带有下列编译器指令 default_nettype wand 任何未被说明的网默认为1位线与网。,网络和变量 -变量数据类型,1整型变量声明 整型变量常用于对循环控制变量的说明,在算术运算中被视为二进制补码形式的有符号数。

35、整型数据与32位的寄存器型数据在实际意义上相同,只是寄存器型数据被当做无符号数来处理。 【例3.18】整数变量的声明 integer i,j; integer31:0 D;,需要注意的是虽然interger有位宽度的声明,但是integer型变量不能作为位向量访问。D6和D16:0的声明都是非法的。在综合时,integer型变量的初始值是x。,网络和变量 -变量数据类型,2实数型变量声明 实数型数据在机器码表示法中是浮点型数值,可用于对延迟时间的计算。实数型变量是不可综合的。 3时间型变量声明 时间型变量与整型变量类似,只是它是64位的无符号数。时间型变量主要用于对仿真时间的存储与计算处理,常

36、与系统函数$time一起使用。,网络和变量 -变量数据类型,4寄存器型变量声明 寄存器型变量对应的是具有状态保持作用的硬件电路,如触发器。锁存器等。寄存器型变量与网络络数据的区别主要在于:寄存器型变量保持最后一次的赋值,而wire型数据需要有连续的驱动。寄存器型变量只能在initial或always内部被赋值。寄存器型变量声明的格式如下:,网络和变量 -变量数据类型, range , reg_name; 其中: reg_type为寄存器类型; range为矢量范围,MSB:LSB格式,只对reg类型 有效; reg_name为reg型变量的名字,一次可定义多个reg型 变量,使用逗号分开。,网

37、络和变量 -变量数据类型,【例3.19】寄存器型变量的声明及使用 module mult(clk, rst, A_IN, B_OUT); input clk,rst,A_IN; output B_OUT; reg arb_onebit = 1b0; always (posedge clk or posedge rst) begin if (rst) arb_onebit = 1b1; else arb_onebit = A_IN; end end B_OUT = arb_onebit; endmodule,参数,Verilog HDL中的参数(parameter)既不属于变量类型也不属于网络类

38、型范畴。参数不是变量,而是常量。用参数声明一个可变常量,常用于定义延时及宽度等参数。参数定义的格式: parameter par_name1=expression1,.,par_namen=expression; 其中: par_name1,.par_namen为参数的名字;expression1,.,expression为表达式。,参数,【例3.20】参数的声明及使用 parameter BUS_WIDTH=8; reg BUS_WIDTH-1:0 my_reg; 可一次定义多个参数,用逗号隔开。参数的定义是局部的,只在当前模块中有效。参数定义可使用以前定义的整数和实数参数。 参数值也可以在

39、编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值。,参数,【例3.21】参数的声明及使用 module lpm_reg (out, in, en, reset, clk); parameter SIZE=1; input in, en, reset, clk; output out; wire SIZE-1:0 in; reg SIZE-1:0 out; always (posedge clk or negedge reset) begin if (!reset) out=1b0; else if(en) out=in; else out = out; end e

40、ndmodule,向量,1向量说明 向量范围由常量表达式来说明(也就是通常所说的数组)。msb_constant_expression(最高位常量表达式)代表范围的左侧值,lsb_constant_expression(最低位常量表达式)代表范围的右侧值。右侧表达式的值可以大于、等于、小于左侧表达式的值。 net和reg型向量遵循以2为模(2n)的乘幂算术运算法则,此处的n值是向量的位宽。net和reg型向量如果没有被声明为有符号量或者链接到一个已声明为有符号的数据端口,那么该向量被隐含当做无符号的量。,向量,向量可以将已声明过类型的元素组合成多维的数据对象。向量声明时,应当在声明的数据标识符

41、后面指定元素的地址范围。每一个维度代表一个地址范围。数组可以是一维向量(一个地址范围)也可以是多维向量(多重地址范围)。向量的索引表达式应当是常量表达式,该常量表达式的值应当是整数。一个数组元素可以通过一条单独的赋值语句被赋值,但是整个向量或向量的一部分也不能为一个表达式赋值。要给一个向量元素赋值,需要为该向量元素指定索引。向量索引可以是一个表达式,这就为向量元素的选择提供了一种机制,即依靠对该向量索引表达式中其他的网络数据或变量值的运算结果来定位向量元素。,向量,【例3.22】多维向量的声明实例1 wire 7:0 array2 0:2550:15 该声明表示一个25616的wire型数据,

42、其中的每个数据是8位的宽度。只能在结构化描述的Verilog HDL中分配。 【例3.23】多维向量的声明实例2 reg 63:0 regarray2 255:07:0 该声明表示一个256x8的reg型数据,其中的每个数据是64位宽度。只能在行为化描述的Verilog HDL中分配。,向量,【例3.24】多维向量的声明实例3 wire 7:0 array3 0:150:2550:15 该声明表示一个三维的向量,表示16个256x16的wire型数据,每个数据8位宽度。只能在结构化描述的Verilog HDL中分配。,向量,2向量网络型数据的可访问性,vectored和scalared是矢量网

43、络型或矢量寄存器型数据声明中的可选择关键字。如果这些关键字被使用,那么矢量的某些操作就会受约束。如果使用关键字vectored,那么矢量的位选择或部分位选择以及强度指定就被禁止,而PLI就会认为数据对象未被展开。如果使用关键字scalared,那么矢量的位或部分位选择就被允许,PLI认为数据对象将被展开。下例是使用关键字vectored和scalared的例子。 【例3.25】关键字vectored和scalared tri scalared63:0 bus64; /一个将被展开的数据总线 tri vectored31:0 data; /一个未被展开的数据总线,向量,3.存储器 如果一个向量的

44、元素类型为reg型,那么这样的一维向量也称为存储器。存储器只用于ROM(只读存储器)、RAM(随机存取存储器)和寄存器组建模。向量中的每一个寄存器也叫做元素或字,并且是通过单一的索引来寻址的。一个n位的寄存器可以通过一条单独的赋值语句被赋值,但是整个存储器不能通过这样的一条语句被赋值。为了对存储器的某个字赋值,需要为该字指定数组索引。该索引可以是一个表达式,该表达式中含有其他的变量或网络数据,通过对该表达式的运算,得到一个结果值,从而定位存储器的字。,向量,【例3.26】存储器型的声明 reg7:0 mymemory1023:0; 上述声明定义了一个1024个存储单元的存储器变量mymemor

45、y,每个存储单元的字长为8位。在表达式中可以用下面的语句来使用存储器。 mymemory7=75; /存储器mymemory的第7个字被赋值75,Verilog名字空间,在Verilog HDL中有7类名字空间:其中两类为全局名字空间,其余5类为局部名字空间。,1.全局名字空间 全局名字空间包括定义和文本宏。 (1)定义名字空间包括所有module(模块)、marcomodule(宏模块)、primitive(基本元件)的定义。一旦某个名字被用于定义一个模块、宏模块或基本元件,那么它将不能再用于声明其他模块、宏模块或基本元件,也就是这个名字在定义名字空间具有唯一性。,Verilog名字空间,(

46、2)文本宏名字空间也是全局的。由于文本宏名由重音符号()引导,因此它与别的名字空间有明显的区别。文本宏名的定义逐行出现在设计单元源程序中,它可以被重复定义,也就是同一宏名后面的定义将覆盖其先前的定义。,Verilog名字空间,2.局部名字空间 局部名字空间包括:block(语句块)、module(模块)、port(端口)、specify block(延时说明块)和attribute(属性)。一旦某个名字在这5个名字空间中的任意一个空间内被定义。它就不能在该空间中被重复定义(即具有唯一性)。 (1)语句块名字空间包括:语句块名、函数名、任务名、参数名、事件名和变量类型声明。其中变量类型声明包括:

47、reg、integer、time、real和realtime声明。,Verilog名字空间,(2)模块名字空间包括:函数名、任务名、例化名(模块调用名)、参数名、事件名和网络类型声明与变量类型声明。 其中网络类型声明包括:wire、wor、wand、tri、trior、triand、tri0、tri1、trireg、supply0和supply1。,Verilog名字空间,(3)端口名字空间用于连接两个不同名字空间中的数据对象。连接可以是单向的或双向的。端口名字空间是模块名字空间与语句块名字空间的交集。从本质上说,端口名字空间规定了不同空间中两个名字的连接类型。端口的类型声明包括input、o

48、utput、inout。在端口名字空间中定义的端口名可以在模块名字空间中被再次引用,这只需要在模块名字空间中声明一个与端口名同名的变量或wire型数据就可以了。,Verilog名字空间,(4)延时说明块:用来说明模块内的时序信息。sprcparams用来声明延迟常数,很象模块内的一个普通的参数,但是不能被覆盖。延迟说明块以specify开头,以endspecify结束。 (5)属性是由符号(*)包括的语言结构。属性名只能在属性名字空间中被定义和使用,而其他任何名字都不能在属性名字空间中被定义。,Verilog 语言表达式,表达式是将操作数和操作符联合起来使用的一种Verilog HDL语言结构

49、,通过运算得到一个结果。表达式可以在出现数值的任何地方使用。,Verilog 语言表达式 -操作符,Verilog HDL中的操作符按功能可以分为下述类型:算术操作符、关系操作符、相等操作符、逻辑操作符、按位操作符、归约操作符、移位操作符、条件操作符、连接和复制操作符; 按运算符所带操作数的个数可分为三类:单目操作符、双目操作符和三目操作符。,Verilog 语言表达式 -操作符,表3.7给出了所有操作符的优先级和名称。操作符从最高优先级(顶行)到最低优先级(底行)排列。同一行中的操作符优先级相同。,表3.7 操作符的优先级,Verilog 语言表达式 -操作符,Verilog 语言表达式 -

50、延迟表达式,Verilog HDL中,延迟表达式的格式为用圆括号括起来的三个表达式,这三个表达式之间用冒号分隔开。三个表达式一次代表最小、典型、最大延迟时间值。下面举例说明延迟表达式的用法。 【例3.39】延迟表达式的使用。 (a:b:c)+(d:e:f) 表示最小延迟值为a+d的和,典型延迟值为b+e的和,最大延迟值为c+f的和,Verilog 语言表达式 -表达式的位宽,表达式位宽是由包含在表达式内的操作数和表达式所处的环境决定的。自主表达式的位宽由它自身单独决定,比如延迟表达式。环境决定型表达式的位宽由该表达式自己的位宽和它所处的环境来决定,比如一个赋值操作中右侧表达式的位宽由它自己的位

51、宽和赋值符左侧的位宽来决定。,表3.9 表达式位宽规则,Verilog 语言表达式 -有符号表达式,下面是表达式符号类型规则: 表达式的符号类型仅仅依靠操作数,与LHS(左侧)值无关。 简单十进制格式数值时有符号数。 基数格式数值是无符号数,除非符号(s)用于技术说明符。 无论操作数是何类型,其位选择结果为无符号型。 无论操作数是何类型,其部分位选择结果为无符号型,即使部分位选择指定了一个完整的矢量。,无论操作数是何类型,连接(或复制)操作的结果为无符号型。 无论操作数是何类型,比较操作的结果(1或0)为无符号型。 通过类型强制转换位整型的实数为有符号型。 任何自主操作数的符号和位宽由操作数自

52、己决定,而独立于表达式的其余部分。,Verilog 语言表达式 -有符号表达式,对于非自主操作数遵循下面的规则: 如果有任何操作数为实型,则结果为实型; 如果有任何操作数为无符号型,则结果为无符号型,而不论是什么操作符; 如果所有操作数为有符号型,则结果为有符号型,而不论是什么操作符。,Verilog 语言表达式 -有符号表达式,Verilog行为描述语句,模块的几种描述方式(或者叫做建模方式),包括行为级建模(RTL级建模也属于行为级建模)、结构级建模(包括门级建模和开关级建模)以及行为级和结构级的混合建模。当模块内部只包括过程块和连续赋值语句(assign),而不包含模块实例(模块调用)语

53、句和基本元件实例语句时,就称该模块采用的是行为级建模;当模块内部只包含模块实例和基本元件实例语句,而不包含过程块语句和连续赋值语句时,就称该模块采用的是结构级建模;当然在模块内部也可以采用这两种建模方式的结合,即混合建模方式。,过程语句,Verilog HDL中的多数过程模块都从属于以下两种过程语句: initial 语句 always语句 一个模块中可以包含任意多个initial或always语句。这些语句相互并行执行,即这些语句的执行顺序与其在模块中的顺序无关。一个initial语句或always语句的执行产生一个单独的控制流,所有的initial和always语句在0时刻开始并行执行。,

54、过程语句 -initial 语句,initial语句只执行一次。initial 语句在模拟开始时执行,即在0时刻开始执行。initial语句的语法如下: initial begin statement1; /描述语句1 statement2; /描述语句2 . end 顺序过程(begin.end)最常使用在进程语句中。,时序控制可以是时延控制,即等待一个确定的时间;或事件控制,即等待确定的事件发生或某一特定的条件为真。initial语句的各个进程语句仅执行一次。注意initial语句在模拟的0时刻开始执行。initial语句根据进程语句中出现的时间控制在以后的某个时间完成执行。Initial

55、语句通常用于仿真模块对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真过程的语句,不能被综合。,过程语句 -initial 语句,过程语句 -initial 语句,【例3.40】initial语句的描述 a; . initial a=2; 上述initial语句中包含无时延控制的过程赋值语句。initial语句在0时刻执行,促使a在0时刻被赋值为2。,过程语句 -initial 语句,【例3.41】带有时延控制的initial语句的描述 reg Curt; . initial #2a=1; 寄存器变量a在时刻2被赋值为1。initial语句在0时刻开始执行,在时刻2完成执行。,过程语

56、句 -initial 语句,【例3.42】带有顺序过程的initial语句例子 parameter SIZE = 1024; reg 7:0 RAM 0 :SIZE- 1 ; reg RibReg; initial begin: SEQ_BLK_A integer Index; RibReg = 0; for (Index = 0; Index SIZE; Index = Index + 1) RAM Index = 0; end,过程语句 -initial 语句,顺序过程由关键词begin.end定界,它包含顺序执行的进程语句,与C语言等高级编程语言相似。SEQ_BLK_A是顺序过程的标记;

57、如果过程中没有局部说明部分,不要求这一标记。例如,如果对Index的说明部分在initial语句之外,可不需要标记。整数型变量Index已在过程中声明。并且,顺序过程包含1个带循环语句的过程性赋值。这一initial语句在执行时将所有的内存初始化为0。,过程语句 -always语句,与initial语句相反,always语句重复执行。与initial语句类似,always语句语法如下: always (敏感信号表达式) begin /过程赋值 /if-else,case语句 /while,repeat,for循环语句 /task,function调用 end,过程语句 -always语句,al

58、ways语句有一个过程性赋值。因为always语句 重复执行,并且在此例中没有时延控制,过程语句 将在0时刻无限循环。因此,always语句的执行必须 带有某种时序控制。,过程语句 -always语句,1.敏感信号为组合逻辑的always语句描述 【例3.43】always语句用于4选1开关的Verilog HDL描述 module mux4 (sel, a, b, c, d, outmux); input 1:0 sel; input 1:0 a, b, c, d; output 1:0 outmux; reg 1:0 outmux; always (sel or a or b or c or d) begin case (sel) 2b00: outmux = a; 2b01: outmux = b; 2b10: outmux = c; default: outmux = d; endcase end endmodule,2敏感信号为时钟沿的always语句描述 【例3.44】敏感信号为时钟沿的a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论