1、现代数字系统设计现代数字系统设计 基于基于Verilog HDLImportant PointsqVerilog HDL模块的结构模块的结构qVerilog HDL语言要素语言要素q数据类型、运算符数据类型、运算符q常量、变量常量、变量q寄存器和存储器寄存器和存储器Verilog HDL发展历史发展历史n什么是什么是Verilog HDL?qVerilog是一种硬件描述语言,可以在算法级、门级到开关级的多种抽是一种硬件描述语言,可以在算法级、门级到开关级的多种抽象层次上对数字系统建模象层次上对数字系统建模q语法结构上,继承和借鉴了许多语法结构上,继承和借鉴了许多C语言特性语言特性n版本演变版本
2、演变p1983年,年,Gateway Automation公司创建(公司创建(Philip Moorby)p19841986年,第一个年,第一个Verilog HDL仿真器(仿真器(Moorby)p1987年,年,Synopsys公司将公司将Verilog作为综合工具的输入作为综合工具的输入p1989年,年,Cadence收购收购Gateway,于,于1990年公开发布年公开发布Verilog HDLpIEEE 1364-1995pIEEE 1076-2001pIEEE 1076-2005Top-down结构化设计思想结构化设计思想n一个系统由总设计师先进行系统描述,将系统划分为若干模块,编写
3、模块一个系统由总设计师先进行系统描述,将系统划分为若干模块,编写模块模型模型( (一般为行为级一般为行为级) ),仿真验证后,再把这些模块分配给下一层的设计师,仿真验证后,再把这些模块分配给下一层的设计师,由他们完成模块的具体设计,而总设计师负责各模块的接口定义由他们完成模块的具体设计,而总设计师负责各模块的接口定义Verilog HDL建模的概念建模的概念qVerilog建模与建模与Top-Down结构化层次设计思想十分吻合结构化层次设计思想十分吻合qVerilog采用模块(采用模块(Module)的概念来描述一个基本的)的概念来描述一个基本的功能块功能块q模块(模块(Module)通过接口
4、(输入、输出或双向)被更)通过接口(输入、输出或双向)被更高层模块调用,但隐藏内部实现细节,便于修改与维高层模块调用,但隐藏内部实现细节,便于修改与维护护q与数字电路对应关系与数字电路对应关系n数字电路归结为数字电路归结为“线线”与与“器件器件”n线:器件之间的物理连接,对应线:器件之间的物理连接,对应Verilog的的wire等等n器件:完成特定逻辑功能的物理实体,对应器件:完成特定逻辑功能的物理实体,对应Verilog的的moduleqVerilog建模实质就是如何利用建模实质就是如何利用HDL语言对数字电路的语言对数字电路的线和器件以及相互关系进行描述的过程线和器件以及相互关系进行描述的
5、过程Top-Down结构化设计原则结构化设计原则n底层的模块应适合表达底层的模块应适合表达q对于原理图方式设计输入,可以分解到门、触发器和宏单元级对于原理图方式设计输入,可以分解到门、触发器和宏单元级q对于对于HDL设计输入,可以分解到算法级设计输入,可以分解到算法级n应有利于提高模块设计的复用率(共享)应有利于提高模块设计的复用率(共享)q相似的功能应设计成共享的基本模块,供高级模块调用,减少模块数相似的功能应设计成共享的基本模块,供高级模块调用,减少模块数量、改善结构化特性量、改善结构化特性n模块接口信号线力求最少模块接口信号线力求最少q复杂的接口信号会增加综合布局布线的复杂度,增加设计的
6、错误风险复杂的接口信号会增加综合布局布线的复杂度,增加设计的错误风险q在达到相同逻辑功能的前提下,以最少的信号线进行信号与数据交换在达到相同逻辑功能的前提下,以最少的信号线进行信号与数据交换为最佳方案为最佳方案n模块划分应力求结构均称模块划分应力求结构均称q同一层模块之间的设计复杂度、资源消耗等不能有太大的悬殊同一层模块之间的设计复杂度、资源消耗等不能有太大的悬殊n模块设计通用性好,易于移植模块设计通用性好,易于移植q模块的设计应与器件无关,便于升级与移植模块的设计应与器件无关,便于升级与移植Verilog模块的定义模块的定义q语法:语法:nmodule (端口列表端口列表);q ;q ;ne
7、ndmoduleq注解:注解: nmodule关键字声明模块开始关键字声明模块开始n是模块惟一的标识符是模块惟一的标识符n用于与其他模块的连接(相当于器件的引脚)用于与其他模块的连接(相当于器件的引脚)n定义数据对象的类型(信号、端口等)定义数据对象的类型(信号、端口等)n定义模块(器件)的逻辑功能定义模块(器件)的逻辑功能nendmodule关键字标识模块结束关键字标识模块结束模块定义:一个简单的例子模块定义:一个简单的例子n4位全加器位全加器Verilog代码代码qmodule adder4 (a, b, cin, sum, cout);ninput 3:0 a,b;/加数加数,位宽位宽4
8、位位,输入输入ninput cin;/低位进位低位进位,输入输入noutput 3:0 sum;/和和,输出输出noutput cout;/高位进位高位进位,输出输出nassign cout, sum= a+b+cin;/逻辑功能定义逻辑功能定义qendmoduleq说明:说明:n模块名称模块名称:adder4n端口列表端口列表:a, b, cin, sum, coutn端口定义端口定义:input 3:0 a,b; output 3:0 sum; input cin;n功能描述功能描述:assign cout, sum=a+b+cin;综合与仿真综合与仿真n4位全加器位全加器Quartus
9、II综合结果综合结果综合与仿真综合与仿真n4位全加器位全加器Quartus II综合结果综合结果综合与仿真综合与仿真nadder4仿真测试向量文件仿真测试向量文件ntimescale 1ns/1nsnmodule adder4_tb ; n n wire 3:0 sum ; n reg 3:0 a ; n reg cin ; n reg 3:0 b ; n wire cout ; n integer i,j;n adder4 n DUT ( n .sum (sum ) ,n .a (a ) ,n .cin (cin ) ,n .b (b ) ,n .cout (cout ) ); nalway
10、s #5 cin=!cin;ninitial beginn a=0;b=0;cin=0;n for (i=1;i16;i=i+1)n #10 a=i;nendninitial beginn for (j=1;j16;j=j+1)n #10 b=j;nendninitial begin $monitor($time,%d+%d+%b=%b,%d,a,b,cin,cout,sum);n #200 $stop;nend nendmoduleModelsim功能仿真结果功能仿真结果Verilog模块基本结构模块基本结构q四个部分:四个部分:模块声明、端口定义、信号说明、逻辑功能描述模块声明、端口定义、
11、信号说明、逻辑功能描述。q1. 模块声明模块声明n包括模块名称、输入、输出端口列表包括模块名称、输入、输出端口列表n语法:语法:qmodule 模块名称模块名称 (端口端口1, 端口端口2, , 端口端口n);q/模块描述模块描述qendmoduleq2. 模块端口定义模块端口定义n说明模块端口的输入、输出类别说明模块端口的输入、输出类别n语法:语法:qinput n-1:0 端口端口1, 端口端口2, , 端口端口n; /输入端口输入端口qoutput n-1:0 端口端口1, 端口端口2, , 端口端口n; /输出端口输出端口qinout n-1:0 端口端口1, 端口端口2, , 端口端
12、口n; /双向端口双向端口q信号位宽信号位宽n-1:0若不指定,则缺省位若不指定,则缺省位1位。位。Verilog模块基本结构模块基本结构q3. 信号类型说明信号类型说明n对模块的所有信号(端口、节点信号)进行数据类型说明;对模块的所有信号(端口、节点信号)进行数据类型说明;nVerilog提供了各种信号数据类型,用于模拟实际电路中的物提供了各种信号数据类型,用于模拟实际电路中的物理连接与物理实体(详见后续章节);理连接与物理实体(详见后续章节);n语法:语法:q信号类型信号类型 n-1:0 信号名称信号名称;n举例:举例:qreg cout; /定义定义cout信号为寄存器类型,位宽位信号为
13、寄存器类型,位宽位1位;位;qreg 3:0 sum; /定义定义sum信号位寄存器类型,位宽为信号位寄存器类型,位宽为4位;位;qwire A, B, C, D; /定义定义A, B, C, D四个信号为四个信号为wire(连线)型,默(连线)型,默认位宽位认位宽位1位。位。n缺省:缺省:q未指定数据类型的信号,缺省数据类型为未指定数据类型的信号,缺省数据类型为wire型。型。Verilog模块基本结构模块基本结构n4. 逻辑功能描述逻辑功能描述q对模块的逻辑功能进行定义,是模块的核心部分;对模块的逻辑功能进行定义,是模块的核心部分;q逻辑功能描述形式上多种多样,包括调用逻辑功能描述形式上多
14、种多样,包括调用“函数(函数(function)”和和“任务(任务(task)”。q基本描述方法:基本描述方法:n(1) assign持续赋值持续赋值,一般用于组合逻辑描述,一般用于组合逻辑描述q如:如:assign a=c & d; /信号信号a为信号为信号c与与d的与,相当于一个与门的与,相当于一个与门n(2) 元件例化元件例化,调用,调用Verilog内置元件或用户已经定义好的模块,一般内置元件或用户已经定义好的模块,一般用于结构描述用于结构描述q如:如:and a2(out, a, b)/调用调用2输入与门输入与门, 详见后续章节详见后续章节n(3) always过程块赋值过程块赋值,
15、一般用于时序逻辑的行为描述,一般用于时序逻辑的行为描述qalways (posedge clk)qbeginif (reset) out=0;else out=out+1;qendVerilog模块的模板模块的模板nmodule ();qoutput 输出端口列表输出端口列表; / 输出端口声明输出端口声明qinput 输入端口列表输入端口列表; / 输入端口声明输入端口声明q/* 定义数据定义数据, 信号的类型信号的类型, 函数声明函数声明, 用用关键字关键字wire, reg, task, funtion等定义等定义 */qwire 信号名信号名;qreg 信号名信号名;q/ 逻辑功能定义
16、逻辑功能定义q/ 用用assign语句定义逻辑功能语句定义逻辑功能 qassign = ;q/ 用用always块描述逻辑功能块描述逻辑功能qalways ()qbeginq / 过程赋值过程赋值q / if-else,case语句语句q / while,repeat,for循环语句循环语句q / task,function调用调用qend q/ 调用其他模块调用其他模块q ();q/ 门元件例化门元件例化q门元件关键字门元件关键字 ();nendmodulen【小测试小测试】q利用利用Verilog描述一个描述一个42的乘法器的乘法器qmodule mult42(a, b, re);ninp
17、ut 3:0 a;ninput 1:0 b;noutput 5:0 re;nassign re=a*b;qendmoduleVerilog语言要素语言要素n注释语句注释语句(Comments)q用于提高程序可读性,帮助程序员阅读、修改和理解代码的非执用于提高程序可读性,帮助程序员阅读、修改和理解代码的非执行语句行语句q为代码添加注释是一个优秀程序员必备的良好习惯为代码添加注释是一个优秀程序员必备的良好习惯qVerilog注释书写形式注释书写形式n1. 单行注释单行注释q用用“/”开头,从此符号开始到本行结束都被认为是注释开头,从此符号开始到本行结束都被认为是注释q只能注释到本行结束只能注释到本
18、行结束q如:如:reg a, b; /定义两个寄存器型信号定义两个寄存器型信号n2. 多行注释多行注释q从符号从符号“/*”开始,到符号开始,到符号“*/”结束都被认为是注释结束都被认为是注释q可以跨越多行可以跨越多行q如:如:and gate1(a,b,out); /*元件元件2输入与门输入与门and例化,与门输入通例化,与门输入通q 过过a,b两个信号提供,与门输出送给信号两个信号提供,与门输出送给信号out.*/Verilog语言要素语言要素n标识符与关键字标识符与关键字q标识符(标识符(Identifier)n由字母、数字以及符号由字母、数字以及符号“$”和和“_”组成的符号序列组成的
19、符号序列n第一个字符只能是字母或下划线第一个字符只能是字母或下划线n大小写敏感大小写敏感n如:如:qcount, COUNT, Count, _A1_d2, R56_9q30count, out*q关键字(关键字(Keywords)nVerilog语言内部已经使用的词,又称保留字语言内部已经使用的词,又称保留字n关键字用户不能作为标识符使用关键字用户不能作为标识符使用n所有关键字都为小写,如:所有关键字都为小写,如:qfor, always, if, reg, wire, qFOR, ALWAYS, Verilog语言要素语言要素q参数声明参数声明n模块中某些数值(如延迟时间、信号位宽等)在例
20、化时可能模块中某些数值(如延迟时间、信号位宽等)在例化时可能需要改变,此时可以通过参数声明加以解决需要改变,此时可以通过参数声明加以解决n参数一经声明,就视其为一常量参数一经声明,就视其为一常量n语法:语法:qparameter WIDTH=4, DELY=50, period=10.4qparameter BIT=1, BYTE=8, PI=3.14;qparameter STROBE_DELAY=(BYTE+BIT)/2;q预处理指令预处理指令n以单反引号以单反引号“”开始的某些标识符开始的某些标识符n用于指示编译器执行某些操作用于指示编译器执行某些操作ndefine, undefifde
21、f, else, endifincludentimescaleresetallVerilog 数据类型数据类型n数据类型数据类型q常量常量n四种基本取值:四种基本取值:0, 1, x, zn整型常量整型常量q十进制格式十进制格式带有正负号的数字序列,代表一个有符号数带有正负号的数字序列,代表一个有符号数如:如:10, -45, q基数格式基数格式三个部分:三个部分:sizebase value,位宽位宽基数基数 取值取值size: 位宽,可选项位宽,可选项base: 基数,常量的进制:基数,常量的进制:o/O, b/B, d/D, h/Hvalue: 数字序列,与基数数字序列,与基数base相
22、符的数字序列相符的数字序列, x, z以及以及16进制进制的的AF不区分大小写;不区分大小写;“?”可以代替可以代替z。如如:5O37, 4hz, 8h2A; 10b10, 10bx0 x1; 3b1001_0011; 4 hBVerilog 数据类型数据类型n实型常量实型常量q用于浮点数的表示用于浮点数的表示q十进制格式十进制格式由数字和小数点构成由数字和小数点构成, 且必须有小数点且必须有小数点, 小数点后必须由数字小数点后必须由数字如:如:2.0, 5.678, 0.1, 2.q指数格式指数格式由数字和字符由数字和字符e(或(或E)构成,)构成,e(E)的前面必须由数字且后)的前面必须由
23、数字且后面必须为整数面必须为整数如:如:23_5.1e2, 3.6E2, 5e-4n字符串常量字符串常量q由一对双引号括起来的字符序列,双引号中的任何字符都被认为由一对双引号括起来的字符序列,双引号中的任何字符都被认为是字符串的一部分是字符串的一部分q如:如:“This is a Verilog test!”, “Begin function simulation”q存储:一个字符采用存储:一个字符采用8位二进制位二进制ASCII存储存储Verilog 数据类型数据类型q变量变量n线网型线网型q表示元件之间的物理连线,没有存储功能表示元件之间的物理连线,没有存储功能q线网是线网是“被驱动被驱动
24、”的,可连续赋值或连接到元件的输出的,可连续赋值或连接到元件的输出qVerilog共提供共提供11种线网类型种线网类型wire, tri, wor, trior, wand, triand, trireg, tril, tri0, supply0, supply1(斜体为可综合的线网类型)(斜体为可综合的线网类型)q语法:语法:net_type msb:lsb net1, net2, net_type为线网类型;为线网类型;msb:lsb定义线网位宽及最高与最低位,定义线网位宽及最高与最低位,可选;可选;如:如:wire Rdy, Start;/Rdy, Start为两个为两个1位连线位连线w
25、and 2:0 Addr;/Addr为为3位线与型线网类型位线与型线网类型qwire是最常用的线网类型,为信号的默认类型,可作为任何表达是最常用的线网类型,为信号的默认类型,可作为任何表达式的输入,也可作为式的输入,也可作为assign语句和例化元件的输出。语句和例化元件的输出。Verilog 数据类型数据类型n寄存器型(寄存器型(reg)q对应具有对应具有状态保持功能状态保持功能的电路元件,表示一个抽象的数据存储单的电路元件,表示一个抽象的数据存储单元,可通过赋值语句改变其存储内容元,可通过赋值语句改变其存储内容q只能在只能在always和和initial语句中赋值,在未被赋值之前,寄存器的
26、语句中赋值,在未被赋值之前,寄存器的缺省值为缺省值为xq在在always和和initial过程语句中赋值的变量必须定义为过程语句中赋值的变量必须定义为reg型型q5种类型种类型reg, integer, time, real, realtimeqreg寄存器型寄存器型最常用的寄存器类型,但只能存储最常用的寄存器类型,但只能存储无符号数无符号数语法:语法:reg msb:lsb varn upper:lower, msb:lsb为位宽,缺省为为位宽,缺省为1upper:lower为存储器深度,缺省为为存储器深度,缺省为1,用于定义存储器。,用于定义存储器。reg 1:4 comb;comb =
27、5;comb = -2;Verilog 数据类型数据类型qinteger寄存器型寄存器型用于存储整数值的变量数据类型,可以存储用于存储整数值的变量数据类型,可以存储有符号数有符号数语法:语法:integer var1, var2, , varnmsb:lsb;msb:lsb用于定义整型数组的边界,可选项用于定义整型数组的边界,可选项如:如:integer A, B, C;/声明三个整型寄存器声明三个整型寄存器integer Hist3:6; /声明一个整型寄存器数组,下标声明一个整型寄存器数组,下标36说明:说明:整型寄存器可以存储一个整型寄存器可以存储一个32位的数,但不能直接进行按位访位的
28、数,但不能直接进行按位访问,而需要将问,而需要将integer赋给赋给reg类型,然后进行按位访问类型,然后进行按位访问如:如:reg 31:0 Areg;integer Aint;Areg=Aint;通过通过Aregi进行按位访问。进行按位访问。Verilog 数据类型数据类型qinteger寄存器型寄存器型又如:又如:integer J;reg 3:0 Bcq;J = 6;Bcq = J;Bcq = 4b0101;J = Bcq;J = -6;Bcq = J;结论:结论: 赋值总是从最低位赋值总是从最低位 (最右侧最右侧) 向最高位向最高位 (最左侧最左侧) 进行,任进行,任何多余的位都会
29、被截断。何多余的位都会被截断。qtime, real, realtime寄存器类型寄存器类型Verilog 运算符运算符qVerilog提供了丰富的运算符,以支持其强大的建模能提供了丰富的运算符,以支持其强大的建模能力力q分类分类n算术运算符:算术运算符: +, -, *, /, %n关系运算符:关系运算符:, =, , , =, 45;528hxFF;qb1000=b01110;q相等运算符(相等运算符(=, !=, =, !=)n与关系运算符类似,结果为真与关系运算符类似,结果为真“1”或假或假“0”n分为两组:分为两组:=, != 和和 =, !=,与前者不同,后者以按位比较的方,与前者
30、不同,后者以按位比较的方式进行式进行n如:如:qData = b11x0; Addr=b11x0;则则qData = Addr; Data = Addr; 再如:再如:2b10 = 4b0010Verilog 运算符运算符q逻辑运算符(逻辑运算符(&, |, !)n对操作数进行与、或、非等运算对操作数进行与、或、非等运算n逻辑运算符的操作只能是逻辑运算符的操作只能是0或或1n如果操作数为向量,则非如果操作数为向量,则非0的向量当作的向量当作1n如果任何一个操作数含有如果任何一个操作数含有x,则结果为,则结果为xn如如:qA_Bus = b0110; B_Bus = b1000;则则qA_Bus
31、 & B_Bus,A_Bus | B_Bus, !A_Busq按位逻辑(按位逻辑(&, |, , , )n对操作数进行按位与、或、非等运算对操作数进行按位与、或、非等运算n除除“” 外,其余都为二元运算符外,其余都为二元运算符n如:如:qA = b0110; B = b0100; 则则qA & B; A | B; A;Verilog 运算符运算符q移位运算符(移位运算符(, )n实现对操作数的左移实现对操作数的左移/右移操作右移操作n语法:语法:q操作数操作数 )移位次数移位次数q两个操作数,分布于操作符两侧两个操作数,分布于操作符两侧左侧操作数为要执行移位操作的数左侧操作数为要执行移位操作的
32、数右侧操作数为移位的次数右侧操作数为移位的次数n移位产生的空位补移位产生的空位补0q条件操作符条件操作符n根据条件表达式的值执行不同的表达式根据条件表达式的值执行不同的表达式n语法:语法:qcond_expr? expr1:expr2;cond_expr结果为真,则执行结果为真,则执行expr1,反之执行,反之执行expr2。Verilog 运算符运算符q规约运算符(规约运算符(&, &, |, |, , )n此类运算符的操作数只有此类运算符的操作数只有1个,结果只有个,结果只有1位位q&:如果操作数含有:如果操作数含有0位,则结果为位,则结果为0;如果含有;如果含有x或或z位,则结果位,则结
33、果为为x;否则为;否则为1;q&:与:与&相反相反q| :如果操作数含有:如果操作数含有1位,则结果为位,则结果为1;如果含有;如果含有x或或z位,则结果位,则结果为为x;否则为;否则为0q|:与:与 | 相反相反q:如果操作数含有:如果操作数含有x或或z位,则结果为位,则结果为x;如果含有偶数个;如果含有偶数个1,则,则结果为结果为0;否则结果为;否则结果为1q|:与:与相反相反q如:如:A=b0110; 则则&A=? |A=? A=?Verilog 运算符运算符q连接运算符连接运算符 , , , , n将位于大括号将位于大括号中的两个或两个以上的用逗号中的两个或两个以上的用逗号,分隔的表达
34、式分隔的表达式进行按位拼接,得到一个长表达式进行按位拼接,得到一个长表达式n语法:语法:qexpr1, expr2, expr3, , exprNq如,设:如,设:wire 7:0 Dbus;wire 11:0 Abus;则则assign Dbus7:4=Dbus0, Dbus1, Dbus2, Dbus3;或或assign Dbus=Dbus3:0, Dbus7:4;q非定长常数不能连接非定长常数不能连接如:如:Dbus, 5; /非法非法低低4位反转赋高位反转赋高4位位高低高低4位交换位交换Verilog 运算符运算符q复制运算符复制运算符n用于按指定次数重复执行连接操作用于按指定次数重复
35、执行连接操作n语法语法qrepetition_numberexpr1, expr2, , exprN;reprtition_number为赋值次数为赋值次数内层大括号内层大括号为待重复的连接操作为待重复的连接操作q如:如:Abus=34b1011;/3次连接次连接, Abus=12b1011_1011_101131b1; /结果为结果为 3b1113Ack; /结果与结果与Ack, Ack, Ack;相同(相同(Ack为已定义变量)为已定义变量)Abus=4Dbus7, Dbus;/结果为结果为Dbus7, Dbus7, Dbus7, Dbus7, DbusSummary of Important PointsnVerilog HDL模块的结构模块的结构nVerilog HDL语言要素语言要素n数据类型、运算符数据类型、运算符n常量、变量常量、变量n寄存器和存储器寄存器和存储器