第3章.基本概念教学课件PPT.ppt
完整版教学课件完整版教学课件第3章.基本概念EDA技术与Verilog HDL语言第三章 基本概念Page 3本章学习目标本章学习目标 理解操作符、注释、空白符、数字、字符串和标识符的词法约定。理解操作符、注释、空白符、数字、字符串和标识符的词法约定。 定义逻辑值集合和数据类型,包括线网、寄存器、向量、数字、仿真时间、定义逻辑值集合和数据类型,包括线网、寄存器、向量、数字、仿真时间、数组、参数、存储器和字符串。数组、参数、存储器和字符串。 学习使用用于显示和监视信息、暂停和结束仿真的系统任务。学习使用用于显示和监视信息、暂停和结束仿真的系统任务。 学习用于宏定义、文件包含的基本编译指令。学习用于宏定义、文件包含的基本编译指令。Page 43.1 词法约定词法约定 Verilog中的基本词法约定与C语言类似。Verilog描述包含一个“单词”流,这里的单词可以是注释、分隔符、数字、字符串、标识符和关键字。Verilog是大小写相关的,其中的关键字全部为小写。列出如下: 空白符空白符 空白符由空格(b)、制表符(t)和换行符组成。除了字符串中的空白符,Verilog中的空白符仅仅用于分隔标识符,在编译阶段被忽略。 注释注释 有两种书写注释的方法:单行注释和多行注释。 单行注释以“/ ”开始,Verilog将忽略从此处到行尾的内容。 多行注释以“/*”开始,结束于“*/”。 多行注释不允许嵌套,但是单行注释可以嵌套在多行注释中。Page 53.1 词法约定(续)词法约定(续) 操作符操作符 操作符有三种类型:单目操作符、双目操作符和三目操作符,单目操作符的优先级高于操作数。三目操作符包括两个单独的操作符,用来分隔三个操作数。 数字声明数字声明 Verilog中包括两种数字声明:指明位数的数字和不指明位数的数字指明位数的数字和不指明位数的数字 指明位数的数字的表示形式为: 用于指明数字的位宽度,只能用十进制数表示。合法的基数格式包括十进制(d或D)、十六进制(h或H)、二进制(b或B)和八进制(o或O)。数字用连续的阿拉伯数字0,1,2,3,4,5,6,7,8,9,10,a,b,c,d,e,f来表示。但是,对于不同的基数,只能相应地使用其中的一部分,并且允许使用大写字母。 例如例如:4b1111,16h3a6f等 Page 63.1 词法约定(续)词法约定(续) 如果在数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽度,则默认的位宽度与仿真器和使用的计算机有关(最小为32位) X和和Z值值 Verilog用两个符号分别表示不确定值和高阻值,这两个符号在实际电路的建模中是非常重要的,不确定值用x表示,高阻值用z表示。在以十六进制为基数的表示中x或z代表4位,在八进制的情况下x或z代表3位,在二进制的情况下x或z代表1位。如果某数的最高位为0,x或z,Verilog语言约定将分别使用0,x或z自动对这个数进行扩展,以填满余下的更高位。 负数负数 对于常数,我们可以通过在表示位宽的数字前面增加一个减号来表示它是一个负数,因为表示大小的常数总是正的。将减号放在基数和数字之间是非法的。对于带符号的算术运算,可以增加一个可选的带符号说明符来表示负数 Page 73.1 词法约定(续)词法约定(续) 下划线符号和问号下划线符号和问号 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段将被忽略掉。如8b1101_1010 在Verilog语言约定的常数表示中,问号“?”是z的另一种表示。使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”(即高阻抗)表示“不必关心”的情况。 字符串字符串 字符串是由双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不能书写在多行中,即不能包含回车符。Page 83.1 词法约定(续)词法约定(续) 标识符和关键字标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中的关键字全部小写,附录C中列出了Verilog中的全部关键字的清单,包括关键字、系统任务和编译指令。 标识符是程序代码中对象的名字。Verilog中的标识符由字母数字字符、下划线_和美元符 $ 组成。标识符是区分大小写的。Verilog标识符的第一个字符必须是字母数字字符或下划线,不能以数字或美元符开始。以美元符开始的标识符是为系统函数保留的。 转义标识符转义标识符 转义标识符以反斜线“”开始,以空白符(空格、制表符和换行符)结束。Verilog将反斜线和空白符之间的字符逐个进行处理。所有的可打印字符均可包含在转义字符中,而反斜线和表示结束的空白符不作为标识符的一部分。 如:a+b-c /与a+b-c等同 Page 93.2 数据类型数据类型 3.2.1 值的种类值的种类 3.2.2 线网线网 3.2.3 寄存器寄存器 3.2.4 向量向量 3.2.5 整数、实数和时间寄存器数据类型整数、实数和时间寄存器数据类型 3.2.6 数组数组 3.2.7 存储器存储器 3.2.8 参数参数 3.2.9 字符串字符串Page 103.2.1 值的种类值的种类 Verilog使用四值逻辑和八种信号强度来对实际的硬件电路建模。Page 113.2.1 值的种类(续)值的种类(续) 逻辑值0和1可以拥有下表中列出的8种强度值Page 123.2.1 值的种类(续)值的种类(续) 如果两个具有不同强度的信号驱动同一个线网,则竞争结果值为高强度信号的值。例如,如果在两个强度分别为strong1和weak0的信号之间发生竞争,则结果值服从strong1 如果两个强度相同的信号之间发生竞争,则结果为不确定值。例如两个强度为strong1和strong0的信号之间发生竞争,则结果为x。 对于信号竞争、MOS器件、动态MOS和其他底层器件的精确建模,强度等级具有很大的作用。在各种类型的线网中,只有trireg类型的线网可以具有存储强度,强度分为large,medium和small三个等级。Page 133.2.2 线网线网 线网(net)表示硬件单元之间的连接。就像在真实的电路中一样,线网由其连接器件的输出端连续驱动。如下图所示,线网a连接到与门g1的输出端,它将连续地拥有与门g1的输出值:b & c 线网一般使用关键字wire进行声明。如果没有显式地说明为向量,则默认线网的位宽为1。线网的默认值为z(trireg类型的线网例外,其默认值为x)。线网的值由其驱动源确定,如果没有驱动源,则线网的值为z。Page 143.2.3 寄存器寄存器 寄存器用来表示存储元件,它保持原有的数值,直到被改写。寄存器数据类型一般通过使用关键字reg来声明,默认值为x。例3.1给出了如何使用寄存器的例子。 例3.1 寄存器的声明和使用 例3.2 带符号寄存器的声明Page 153.2.4 向量向量 线网和寄存器类型的数据均可以声明为向量(位宽大于1)。如果在声明中没有指定位宽,则默认为标量(1位)。 向量通过high# : low#或low# : high#进行说明,方括号中左边的数总是代表向量的最高有效位。 对向量,我们可以指定其中的一位或几位,如:Page 163.2.4 向量(续)向量(续) 除了用常量指定向量域以外,Verilog HDL还允许指定可变的向量域选择。这样就使得设计者可以通过for循环来动态地选取向量的各个域。下面是动态域选择的两个专用操作符: +: width:从起始位开始递增,位宽为width。 -: width:从起始位开始递减,位宽为width。Page 173.2.5 整数、实数和时间寄存器数据类型整数、实数和时间寄存器数据类型 除reg类型之外,Verilog还支持integer,real和time寄存器数据类型。 整数是一种通用的寄存器数据类型,用于对数量进行操作,使用关键字integer进行声明。注意,声明为reg类型的寄存器变量为无符号数,而整数类型的变量则为有符号数。如下所示 实常量和实数寄存器数据类型使用关键字real来声明,可以用十进制或科学记数法(例如3e6代表3 000 000)来表示。实数声明不能带有范围,其默认值为0。如果将一个实数赋给一个整数,那么实数将会被取整为最接近的整数。Page 183.2.5 整数、实数和时间寄存器数据类型(续)整数、实数和时间寄存器数据类型(续) 仿真是按照仿真时间进行的,Verilog使用一个特殊的时间寄存器数据类型来保存仿真时间。时间变量通过使用关键字time来声明,其宽度与具体实现有关,最小为64位。通过调用系统函数$time可以得到当前的仿真时间。Page 193.2.6 数组数组 在Verilog中允许声明reg,integer,time,real,realtime及其向量类型的数组,对数组的维数没有限制,即可以声明任意维数的数组。线网数组也可用于连接实例的端口,数组中的每个元素都可以作为一个标量或向量,以同样的方式来使用,形如。对于多维数组来讲,用户需要说明其每一维的索引。Page 203.2.6 数组(续)数组(续) 注意,不要将数组和线网或寄存器向量混淆起来。向量是一个单独的元件,它的位宽为n;数组由多个元件组成,其中的每个元件的位宽为n或1。Page 213.2.7 存储器存储器 在数字电路仿真中,人们常常需要对寄存器文件,RAM和ROM建模。在Verilog中,使用寄存器的一维数组来表示存储器。数组的每个元素称为一个元素或一个字(word),由一个数组索引来指定,每个字的位宽为1位或多位。注意,n个1位寄存器和一个n位寄存器是不同的。如果需要访问存储器中的一个特定的字,则可以通过将字的地址作为数组的下标来完成。Page 223.2.8 参数参数 Verilog允许使用关键字parameter在模块内定义常数。参数代表常数,不能像变量那样赋值,但是每个模块实例的参数值可以在编译阶段被重载。通过参数重载使得用户可以对模块实例进行定制。 Verilog中的局部参数使用关键字localparam来定义,其作用等同于参数,区别在于它的值不能改变,不能通过参数重载语句(defparam)或通过有序参数列表或命名参数赋值来直接修改。Page 233.2.9 字符串字符串 字符串保存在reg类型的变量中,每个字符占用8位(一个字节),因此寄存器变量的宽度应足够大,以保证容纳全部字符。如果寄存器变量的宽度大于字符串的大小(位),则Verilog使用0来填充左边的空余位;如果寄存器变量的宽度小于字符串的大小(位),则Verilog截去字符串最左边的位。因此,在声明保存字符串的reg变量时,其位宽应当比字符串的位长稍大。Page 243.2.9 字符串(续)字符串(续) 有一些特殊字符在显示字符串时具有特定的意义,例如换行符、制表符和显示参数的值。如果需要在字符串中显示这些特殊的字符,则必须加前缀转义字符。Page 253.3 系统任务和编译指令系统任务和编译指令 系统任务系统任务 Verilog为某些常用操作提供了标准的系统任务(也称系统函数),这些操作包括屏幕显示、线网值动态监视、暂停和结束仿真等。所有的系统任务都具有$的形式。常用系统任务如下 显示信息 $display,格式:$display (p1, p2, p3,pn); 监控信息 $monitor,格式:$monitor (p1, p2, p3,pn); 暂停仿真 $stop,格式:$stop; 结束仿真$finish,格式: $finish;Page 263.3 系统任务和编译指令系统任务和编译指令 编译指令编译指令 Verilog提供了一些编译指令供用户使用,其使用方式为。在这里我们只对两种最常用的编译指令进行介绍。 define 编译指令define用于定义Verilog中的文本宏。在编译阶段,当编译器遇到时,使用预定义的文本宏进行替换,它类似于C语言中的#define结构。在使用预定义的常数或文本宏时,在宏名前加上前缀号“”。 include 使用include可以在编译期间将一个Verilog源文件包含在另一个Verilog文件中,作用类似于C语言中的# include结构。该指令通常用于将内含全局或公用定义的头文件包含在设计文件中。Page 273.4 小结小结 在本章中,我们对Verilog中的一些基本概念进行了讨论,深入理解这些概念将为后续章节的学习提供必要的基础。 在语法上,Verilog与C语言十分相似;具有C语言基础的硬件设计者会发现Verilog学习起来很容易。 详细讨论了Verilog关于操作符、注释、空白符、数字、字符串和标识符的词法约定。 Verilog预定义了各种数据类型,包括线网、寄存器、向量、数字、仿真时间、数组、存储器、参数和字符串。在Verilog中采用四值逻辑,此外每个值还可以具有不同的强度等级。使用这些数据类型可以很精确地表示硬件中的各种元件。 Verilog为用户提供了诸如显示、监视、暂停和结束仿真等有用的系统任务。 编译指令define用于定义文本宏,include用于将其他Verilog源文件包含在该文件中