




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北航夏宇闻verilog讲稿--语法第一页,共190页。第一部分课程简介目的:简单介绍VerilogHDL语言和仿真工具介绍讲课计划介绍如何不断地学习新的有关知识第二页,共190页。讲座中关于VerilogHDL的主要内容讲课内容主要包括:Verilog的应用Verilog语言的组成部件结构级的建模与仿真行为级的建模与仿真延迟参数的表示Verilog的测试平台:怎样产生激励信号和控制信号输出响应的产生、记录和验证任务和函数用户定义的元器件(primitives)可综合风格的Verilog建模第三页,共190页。讲座中关于Verilog仿真工具的主要内容讲课内容主要包括:如何对所做的设计进行编译和仿真如何使用元器件库如何用Verilog-XL命令行界面调试代码如何用图形用户界面(GUI)延迟的计算和标记仿真性能建模循环多次仿真第四页,共190页。目的:了解用HDL语言设计数字逻辑的优点了解Verilog主要应用领域了解Verilog的发展历史了解电路系统的不同层次的Verilog抽象第二部分:Verilog的应用第五页,共190页。VerilogHDL是一种用于数字逻辑电路设计的语言:-用VerilogHDL描述的电路设计就是该电路的VerilogHDL模型。-VerilogHDL既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的VerilogHDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:
Verilog的应用第六页,共190页。Verilog的应用系统级(system):用高级语言结构实现设计模块的外部性能的模
算法级(algorithmic):用高级语言结构实现设计算法的模型。
RTL级(RegisterTransferLevel):描述数据在寄存器之间流动和如何处理这些数据的模型。门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。第七页,共190页。Verilog的应用一个复杂电路的完整VerilogHDL模型是由若个VerilogHDL模块构成的,每一个模块又可以由若干个子模块构成。
利用VerilogHDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。VerilogHDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下八项功能:第八页,共190页。Verilog的应用可描述顺序执行或并行执行的程序结构。用延迟表达式或事件表达式来明确地控制过程的启动时间。通过命名的事件来触发其它过程里的激活行为或停止行为。提供了条件、if-else、case、循环程序结构。提供了可带参数且非零延续时间的任务(task)程序结构。提供了可定义新的操作符的函数结构(function)。第九页,共190页。Verilog的应用提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。VerilogHDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。VerilogHDL的构造性语句可以精确地建立信号的模型。这是因为在VerilogHDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。第十页,共190页。Verilog的应用
VerilogHDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中有许多语句如:if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习VerilogHDL并不困难,我们只要对VerilogHDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对VerilogHDL中的基本语法逐一加以介绍。第十一页,共190页。模块的抽象技术指标:用文字表示用算法表示用高级行为的Verilog模块表示RTL/功能级:用可综合的Verilog模块表示门级/结构级:用实例引用的Verilog模块表示版图布局/物理级:用几何形状来表示
行为综合逻辑综合综合前仿真综合后仿真布局布线第十二页,共190页。第三部分.简单的VerilogHDL模块目的:通过简单的例子了解Verilog模块的基本构成了解Verilog模块的层次结构和行为模块了解Verilog模块的测试第十三页,共190页。简单的VerilogHDL模块下面先介绍几个简单的VerilogHDL程序,然后从中分析VerilogHDL程序的特性。例[2.1.1]:
moduleadder(count,sum,a,b,cin);input[2:0]a,b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule
这个例子描述了一个三位的加法器。从例子中可以看出整个VerilogHDL程序是嵌套在module和endmodule声明语句里的。第十四页,共190页。简单的VerilogHDL模块例[2.1.2]:modulecompare(equal,a,b);outputequal;//声明输出信号equalinput[1:0]a,b;//声明输入信号a,bassignequal=(a==b)?1:0;
/*如果两个输入信号相等,输出为1。否则为0*/endmodule这个程序描述了一个比较器.在这个程序中,/*........*/和//.........表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。第十五页,共190页。简单的VerilogHDL模块例[2.1.3]:moduletrist2(out,in,enable);outputout;inputin,enable;bufif1mybuf(out,in,enable);endmodule这个程序描述了一个三态驱动器。程序通过调用一个实例元件bufif1来实现其功能。第十六页,共190页。简单的VerilogHDL模块例[2.1.4]:
moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?In:'bz;endmodule第十七页,共190页。简单的VerilogHDL模块上述程序例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块:模块trist1调用模块mytri的实例元件tri_inst。模块trist1是上层模块。模块mytri则被称为子模块。通过这种结构性模块构造可构成特大型模块。第十八页,共190页。简单的VerilogHDL模块通过上面的例子可以看到:VerilogHDL程序是由模块构成的。模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。VerilogHDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。除了endmodule语句外,每个语句和数据定义的最后必须有分号可以用/*.....*/和//...对VerilogHDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。第十九页,共190页。模块的结构Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的:一)描述接口;二)描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:第二十页,共190页。模块的结构从上面的例子可以看出:-Verilog模块结构完全嵌在module和endmodule声明语句之间;-每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。第二十一页,共190页。模块的测试如何检查上述例子其功能是否正确?需要有测试激励信号输入到被测模块需要记录被测模块的输出信号需要把用功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合)。需要对已经转换为门级电路结构的逻辑进行测试(门级电路仿真)。需要对布局布线后的电路结构进行测试。(布局布线后仿真)。第二十二页,共190页。模块的测试
被测模块激励和控制信号输出响应和验证第二十三页,共190页。模块的测试测试模块常见的形式:modulet;reg…;//被测模块输入/输出变量类型定义wire…;//被测模块输入/输出变量类型定义initialbegin…;…;…;end……//产生测试信号always#delaybegin…;end……//产生测试信号Testedmdm(.in1(ina),.in2(inb),.out1(outa),.out2(outb));//被测模块的实例引用initialbegin….;….;….end//记录输出和响应endmodule第二十四页,共190页。模块的测试测试模块中常用的过程块:initialalways所有的过程块都在0时刻同时启动;它们是并行的,在模块中不分前后。initial块只执行一次。always块只要符合触发条件可以循环执行。第二十五页,共190页。模块的测试如何描述激励信号:modulet;rega,b,sel;wireout;//引用多路器实例
mux2_m(out,a,b,sel);//加入激励信号initialbegina=0;b=1;sel=0;#10b=0;#10b=1;sel=1;#10a=1;#10$stop;end第二十六页,共190页。模块的测试如何观察被测模块的响应:
在initial块中,用系统任务$time和$monitor$time返回当前的仿真时刻$monitor只要在其变量列表中有某一个或某几个变量值发生变化,便在仿真单位时间结束时显示其变量列表中所有变量的值。例:
initialbegin$monitor($time,,“out=%ba=%bsel=%b”,out,a,b,sel);end第二十七页,共190页。模块的测试如何把被测模块的输出变化记录到数据库文件中?(文件格式为VCD,大多数的波形显示工具都能读取该格式)可用以下七个系统任务:$dumpfile(“”);//打开记录数据变化的数据文件$dumpvars();//选择需要记录的变量$dumpflush;//把记录在数据文件中的资料转送到硬盘保存$dumpoff;//停止记录数据变化$dumpon;//重新开始记录数据变化$dumplimit(<>);//规定数据文件的大小(字节)$dumpall;//记录所有指定信号的变化值到数据文件中第二十八页,共190页。模块的测试如何把被测模块的响应变化记录到数据库文件中?举例说明:$dumpvars;//记录各层次模块中所有信号的变化$dumpvars(1,top);//只记录模块top中所有信号的变化$dumpvars(2,top.u1);//记录top模块中实例u1和它以下一层子模块所有信号的变化$dumpvars(0,top.u2,top.u1.u13.q);//记录top模块中实例u2和它本层所有信号的变化,还有top.u1.u13.q信号的变化。$dumpvars(3,top.u2,top.u1);//记录top模块中u2和u1所有信号的变化(包括其两层以下子模块的信号变化)。第二十九页,共190页。模块的测试如何把被测模块的响应变化记录到数据库文件中?举例说明:下面的Verilog代码段可以代替测试文件中的系统任务$monitor
initialbegin$dumpfile(“vlog.dump”);$dumpvars(0,top);end第三十页,共190页。语法详细讲解
第四部分.
Verilog语法要点目标:理解Verilog语言的一些重要规定.学会认识一些有关的重要语言符号.掌握Verilog中如何规定时间单位第三十一页,共190页。语法详细讲解
Verilog与C的主要不同点
Verilog有许多语法规则与C语言一致。但与C语言有根本的区别:-并行性-块的含义:initial块和always块两种赋值语句:阻塞赋值“=”非阻塞赋值“〈=”第三十二页,共190页。语法详细讲解
空格和注释
Verilog是一种格式很自由的语言。空格在文本中起一个分离符的作用,别的没有其他用处。单行注释符用//*********与C语言一致多行注释符用/*-------------------------*/与C语言一致第三十三页,共190页。语法详细讲解
整数和实常数
Verilog语言中常数可以是整数或实数:整数可以标明位数也可以不标明位数,表示方法:《位数》‘《基数》《值》其中《位数》表明该数用二进制的几位来表示《基数》可以是二(b)、八(O)、十(d)或十六(h)进制《数值》可以是所选基数的任何合法的值包括不定值x位和高阻值z。如:64‘hff018’b1101_0001‘h83a实常数可以用十进制表示也可以用科学浮点数表示,如:32e-4(表示0.0032)4.1E3(表示4100)第三十四页,共190页。语法详细讲解
字符串
Verilog语言中,字符串常常用于表示命令内需要显示的信息。用“”括起来的一行字符串,换新一行用“\n”字符,与C语言一致。在字符串中可以用C语言中的各种格式控制符,如\t,\”,\\…在字符串中可以用C语言中的各种数值型式控制符(有些不同),如:%b(二进制),%o(八进制),%d(十进制),%h(十六进制),%t(时间类型),%s(字符串类型)…第三十五页,共190页。语法详细讲解
标识符所谓标识别符就是用户为程序描述中的Verilog对象所起的名字。标识符必须以英语字母(a-z,A-Z)起头,或者用下横线符(_)起头。其中可以包含数字、$符和下横线符。标识符最长可以达到1023个字符。模块名、端口名和实例名都是标识符。Verilog语言是大小写敏感的,因此sel和SEL是两个不同的标识符。第三十六页,共190页。语法详细讲解
合法和非法标识符合法的:shift_reg_a
busa_index
bus263
非法的:34net//不能用数字开头a*b_net//不能含有非字母符号*n@263//不能含有非字母符号@Verilog是大小写敏感的。所有的Verilog关键词都是小写的。第三十七页,共190页。语法详细讲解
特别的标识符特别标识符是用“\”符开始,以空格符结束的标识符。它可以包含任何可打印的ASCII字符。但“\”符和空格并不算是标识符的一部分。特别标识符往往是由RTL级源代码或电路图类型的设计输入经过综合器自动综合生成的网表结构型Verilog语句中的标识符。举例说明:\~#@sel,\bus+index,\{A,B},Top.\31,//在层次模块中的标识名第三十八页,共190页。语法详细讲解
系统任务和函数
$<标识符>‘$’符号表示Verilog的系统任务和函数常用的系统任务和函数有下面几种:$time//找到当前的仿真时间$display,$monitor//显示和监视信号值的变化$stop//暂停仿真$finish//结束仿真-------------------------------------------------------例:initial$monitor($time,,”a=%b,b=%b”,a,b);//每当a或b值变化时该系统任务都显示当前的仿真时刻并分别用二进制和十六进制显示信号a和b的值第三十九页,共190页。语法详细讲解
特殊符号“#”特殊符号“#”常用来表示延迟:在过程赋值语句时表示延迟。例:initialbegin#10rst=1;#50rst=0;end在门级实例引用时表示延迟。例:not#1not1(nsel,sel);and#2and2(a1,a,nsel);在模块实例引用时表示参数传递
介绍参数类型变量时再讲。。。。第四十页,共190页。语法详细讲解
编译引导语句编译引导语句用主键盘左上角小写键“`”起头用于指导仿真编译器在编译时采取一些特殊处理编译引导语句一直保持有效,直到被取消或重写`resetall编译引导语句把所有设置的编译引导恢复到缺省状态常用的编译引导有:`define`include`timescale`uselib`resetall……..第四十一页,共190页。语法详细讲解
编译引导语句使用`define编译引导能提供简单的文本替代功能
`define<宏名><宏文本>在编译时会用宏文本来替代源代码中的宏名。合理地使用`define可以提高程序的可读性举例说明:`defineon1’b1`defineoff1’b0`defineand_delay#3在程序中可以用有含义的文字来表示没有意思的数码提高了程序的可读性,在程序中可以用`on,`off,`and_delay分别表示1,0,和#3。第四十二页,共190页。语法详细讲解
编译引导语句使用`include编译引导,在编译时能把其指定的整个文件包括进来一起处理举例说明:`include“global.v”`include“parts/counter.v”`include“../../library/mux.v”合理地使用`include
可以使程序简洁、清晰、条理清楚、易于查错。第四十三页,共190页。语法详细讲解
编译引导语句
`timescale用于说明程序中的时间单位和仿真精度举例说明:
`timescale1ns/100ps`timescale语句必须放在模块边界前面举例说明:
`timescale1ns/100psmoduleMUX2_1(out,a,b,sel);……not#1not1(nsel,sel);and#2and1(a1,a,nsel);……endmodule尽可能地使精度与时间单位接近,只要满足设计的实际需要就行。举例说明:在上例中所有的时间单位都是1ns的整数倍第四十四页,共190页。语法详细讲解
编译引导语句仿真步长即仿真单位(STU)是所有参加仿真模块中由`timescale指定的精度中最高(即时间最短)的那个决定的:(STU=100fs)举例:
`timescale1ns/10psmoduleM1(….);not#1.23not1(nsel,sel);//1.23ns中共有12300个STU(100fs)endmodule`timescale100ns/1nsmoduleM2(….);not#1.23not1(nsel,sel);//123ns中共有1230000个STU(100fs)endmodule`timescale1ps/100fsmoduleM3(….);not#1.23not1(nsel,sel);//1.23ps中共有12个STU(100fs)endmodule第四十五页,共190页。语法详细讲解
编译引导语句时间单位:
fs(呼秒)femptoseconds:1.0E-15秒ps(皮秒)picoseconds:1.0E-12秒ns(纳秒)nonoseconds:1.0E-9秒us(微秒)microseconds:1.0E-6秒ms(毫秒)milliseconds:1.0E-3秒s(秒)seconds:1.0秒第四十六页,共190页。语法详细讲解
编译引导语句
`uselib编译引导语句:
用于定义仿真器到哪里去找库元件如果该引导语句启动的话,它就一直有效直到遇到另外一个`uselib的定义或`resetall语句
比其他配置库搜索路径的命令选项作用大
如果仿真器在`uselib定义的地点找不到器件库,它不会转向由编译命令行-v和-y选项指定的器件库去找。第四十七页,共190页。语法详细讲解
编译引导语句使用`uselib的语法:
`uselib
器件库1的地点器件库2的地点。。。上面的器件库地点可用以下两种方法表示:1)file=库文件名的路径2)dir=库目录名的路径libext=.文件扩展例如:`uselibdir=/lib/FAST_lib/`uselibdir=/lib/TTL_lib/libext=.vfile=/libs/TTL_U/udp.lib第四十八页,共190页。语法详细讲解
第五部分
Verilog的数据类型和逻辑值目的:掌握Verilog不同逻辑值的含义学习Verilog不同的数据类型理解如何使用和在什么场合下使用不同的数据类型学习声明数据类型的语法第四十九页,共190页。语法详细讲解
Verilog的四种逻辑值0、低、伪、逻辑低、地、VSS、负插入01XZ0bufbufbufbufif11、高、真、逻辑高、电源、VDD、正插入X、不确定:逻辑冲突无法确定其逻辑值HiZ、高阻抗、三态、无驱动源第五十页,共190页。语法详细讲解
主要的数据类型Verilog有三种主要的数据类型:
Nets
表示器件之间的物理连接,称为网络连接类型Register
表示抽象的储存单元,称为寄存器/变量类型Parameter
表示运行时的常数,称为参数类型第五十一页,共190页。语法详细讲解
主要的数据类型Nets(网络连线):由模块或门驱动的连线。驱动端信号的改变会立刻传递到输出的连线上。例如:右图上,selb的改变,会自动地立刻影响或门的输出。netsabslselbselanslout第五十二页,共190页。语法详细讲解
主要的数据类型连接(Nets)类型变量的种类:在为不同工艺的基本元件建立库模型的时候,常常需要用不同的连接类型来与之对应,使其行为与实际器件一致。常见的有以下几种。
类型功能wire,tri
对应于标准的互连线(缺省)
supply1,supply2
对应于电源线或接地线
wor,trior
对应于有多个驱动源的线或逻辑连接wand,triand
对应于有多个驱动源的线与逻辑连接trireg
对应于有电容存在能暂时存储电平的连接tri1,tri0
对应于需要上拉或下拉的连接如果不明确地说明连接是何种类型,应该是指wire类型。第五十三页,共190页。语法详细讲解
主要的数据类型
寄存器(register)类型变量
register型变量能保持其值,直到它被赋于新的值。register型变量常用于行为建模,产生测试的激励信号。常用行为语句结构来给寄存器类型的变量赋值。abslselbselansloutreg_areg_selreg_b第五十四页,共190页。语法详细讲解
主要的数据类型
寄存器(register)类型变量的数据类型
寄存器类型变量共有四种数据类型:类型功能.
reg无符号整数变量,可以选择不同的位宽。integer有符号整数变量,32位宽,算术运算可产生2的补码。real有符号的浮点数,双精度。time无符号整数变量,64位宽(Verilog-XL仿真工具用64位的正数来记录仿真时刻)第五十五页,共190页。语法详细讲解
主要的数据类型
如何选择正确的数据类型?输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输出口(output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输入/输出口(inout)只可以由网络连接驱动,但它本身只能驱动网络连接。如果信号变量是在过程块(initial块或always块)中被赋值的,必须把它声明为寄存器类型变量
第五十六页,共190页。语法详细讲解
主要的数据类型举例说明数据类型的选择moduletop;wirey;rega,b;DUTu1(y,a,b);initialbegina=0;b=0;#10a=1;….endendmodule模块DUT的边界输入口输出口输出/入口netnetnet/registernetnet/registernetinoutmoduleDUT(Y,A,B_);outputY;inputA,B:wireY,A,B;and(Y,A,B);endmodule第五十七页,共190页。语法详细讲解
主要的数据类型
选择数据类型时常犯的错误在过程块中对变量赋值时,忘了把它定义为寄存器类型(reg)或已把它定义为连接类型了(wire)把实例的输出连接出去时,把它定义为寄存器类型了把模块的输入信号定义为寄存器类型了。这是经常犯的三个错误!!!第五十八页,共190页。语法详细讲解
主要的数据类型
参数(parameters)类型常用参数来声明运行时的常数。可用字符串表示的任何地方,都可以用定义的参数来代替。参数是本地的,其定义只在本模块内有效。举例说明:modulemd1(out,in1,in2);…..parametercycle=20,prop_del=3,setup=cycle/2-prop_del,p1=8,x_word=16’bx,file=“/user1/jmdong/design/mem_file.dat”;wire[p1:0]w1;//用参数来说明wire的位宽….
initialbegin$open(file);…….#20000display(“%s”,file);$stopend….endmodule第五十九页,共190页。语法详细讲解
主要的数据类型
参数值的改写(方法之一)举例说明:modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…modmk(out,ina,inb);defparammk.cycle=6,mk.file=“../my_mem.dat”;…endmodule
第六十页,共190页。语法详细讲解
主要的数据类型
参数值的改写(方法之二)举例说明:modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…mod#(5,3.20,“../my_mem.dat”)mk(out,ina,inb);…endmodule
第六十一页,共190页。语法详细讲解
寄存器阵列
Verilog语言支持寄存器阵列的声明:举例说明:integerNUMS[7:0];//8个整型变量的寄存器阵列timet_vals[3:0];//4个时间变量的寄存器阵列数据类型为reg的阵列常称为存储器(即memory):reg[15:0]MEM[0:1023];//1Kx16位的存储器reg[7:0]PREP[‘hfffe:‘hffff];//2x8位的存储器可以用参数来表示存储器的大小:parameterwordsize=16;parametermemsize=1024;reg[wordsize-1:0]MEM3[memsize-1:0];第六十二页,共190页。语法详细讲解
第十一部分用文本接口的调试目的:在本节中我们将学习如何用Verilog-XL提供的TUI(用户文本接口)来调试所设计的模块进入交互方式的仿真模式控制和观察仿真浏览设计的各个层次设置仿真的检查断点、退出仿真第六十三页,共190页。语法详细讲解
第六十四页,共190页。语法详细讲解
第六十五页,共190页。语法详细讲解
第十四部分Verilog测试模块的编写目的:
复习如何编写较复杂的测试文件,对所做的设计进行完整的测试和验证。掌握组织模块测试的常用方法;学会编写常用的测试代码。第六十六页,共190页。语法详细讲解
用Verilog设计的步骤
注:虚线表示编译器能检查输入文件的可读性和是否存在以及是否允许生成输出文件include文件设计文件厂家元件库文件输入文件:激励和期望的输出信号输出文件:激励和实际输出的信号编译器仿真器仿真器第六十七页,共190页。语法详细讲解
测试平台的组成
激励信号需要验证的设计激励信号和用于验证的结果数据需要验证的设计简单的测试平台复杂的测试平台第六十八页,共190页。语法详细讲解
并行块在测试块中常用到fork…join块。用并行块能表示以同一个时间起点算起的多个事件的运行,并行地执行复杂的过程结构,如循环或任务。举例说明如下:moduleinline_tb;reg[7:0]data_bus;initialforkdata_bus=8’b00;#10data_bus=8’h45;#20repeat(10)#10data_bus=data_bus+1;#25repeat(5)#20data_bus=data_bus<<1;#140data_bua=8’h0f;joinendmodule//这两个repeat开始执行时间不同,但能同时运行。第六十九页,共190页。语法详细讲解
并行块时间
data_bus08’b0000_0000108’b0100_0101308’b0100_0110408’b0100_0111458’b1000_1110508’b1000_1111608’b1001_0000658’b0010_0000708’b0010_0001时间
data_bus808’b0010_0010858’b0100_0100908’b0100_01011008’b0010_00011058’b0100_01101108’b1000_11001208’b1000_11101258’b0001_11001408’b0000_1111上面模块的仿真输出如下:第七十页,共190页。语法详细讲解
第七十一页,共190页。语法详细讲解
强制激励在一个过程块中,可以用两种不同的方式对信号变量或表达式进行连续赋值。过程连续赋值往往是不可以综合的,通常用在测试模块中。两种方式都有各自配套的命令来停止赋值过程。两种不同方式均不允许赋值语句间的时间控制。assign和deassign适用于对寄存器类型的信号(例如:RTL级上的节点或测试模块中在多个地方被赋值的信号)进行赋值。
initialbegin#10assigntop.dut.fsml.state_reg=`init_state;第七十二页,共190页。#20deassigntop.dut.fsml.state_reg;endforce和release用于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。initialbegin#10forcetop.dut.counter.scan_reg.q=0;#20releasetop.dut.counter.scan_reg.q;end在以上两个例子中,在10到20这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。force的赋值优先级高于assign。如果先使用assign,再使用force对同一信号赋值,则信号的值为force所赋的值,
语法详细讲解
强制激励语法详细讲解
字符串语法详细讲解
强制激励
第七十三页,共190页。语法详细讲解
强制激励
当执行release后,则信号的值为assign所赋的值。如果用force对同一个信号赋了几次值,再执行release,则所有赋的值均不再存在。可以对信号的某(确定)位、某些(确定)位或拼接的信号,使用force和release赋值;但不能对信号的可变位使用force和release来赋值。不能对寄存器类型的信号某位或某些位使用assign和deassign来赋值。 语法详细讲解
强制激励
第七十四页,共190页。语法详细讲解
建立时钟
虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。下面三个例子分别说明如何在门级和行为级建立不同波形的时钟模型。[例1]简单的对称方波时钟:语法详细讲解
建立时钟
regclk;alwaysbegin#period/2clk=0;#period/2clk=1;endreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period/2)go=1;end注:在有些仿真器中,如果设计所用的时钟是由与其相同抽象级别的时钟模型产生的,则仿真器的性能就能得到提高。第七十五页,共190页。[例2]简单的带延迟的对称方波时钟:语法详细讲解
建立时钟
regclk;initialbeginclk=0;#(period)forever#(period/2)clk=!clkendreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period)go=1;end注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平,而门级描述的模型开始延迟有半个周期是不确定的。第七十六页,共190页。语法详细讲解
建立时钟
[例3].带延迟、头一个脉冲不规则的、占空比不为1的时钟:语法详细讲解
建立时钟
regclk;initialbegin#(period+1)clk=1;#(period/2-1)foreverbegin#(period/4)clk=0;#(3*period/4)clk=1;endendreggo;wireclk;nand#(3*period/4,period/4)ul(clk,clk,go);initialbegin#(period/4+1)go=0;#(5*period/4-1)go=1;end注:这两个时钟模型也有些不同,行为描述的模型一开始就有确定的电平,而门级描述的模型有延迟,开始时电平是不确定的。第七十七页,共190页。语法详细讲解
怎样使用任务举例说明如何使用任务:modulebus_ctrl_tb;reg[7:0]data;regdata_valid,data_rd;cpuul(data_valid,data,data_rd);initialbegincpu_driver(8’b0000_0000);cpu_driver(8’b1010_1010);cpu_driver(8’b0101_0101);end语法详细讲解
怎样使用任务
第七十八页,共190页。语法详细讲解
怎样使用任务taskcpu_driver;input[7:0]data_in;begin#30data_valid=1;wait(data_rd==1);#20data=data_in;wait(data_rd==0);#20data=8’hzz;#30data_valid=0;endendtaskendmodule语法详细讲解
怎样使用任务
第七十九页,共190页。语法详细讲解
怎样使用任务在测试模块中使用任务可以提高程序代码的效率,可以用任务把多次重复的操作包装起来。语法详细讲解
怎样使用任务
waitwaitwaitwaitdata1data2data3data4cpu_dataclkdata_validdata_rdread_cpu_state第八十页,共190页。语法详细讲解
存储建模目标学会如何用Verilog对存储器建模。学会如何用Verilog中对双向(即输入/输出)端口,(inout)建模。语法详细讲解
第十五部分存储器建模
第八十一页,共190页。存储器建模必须注意以下两个方面的问题:声明存储器容量的大小。明确对存储器访问操作的权限。例如:指出可以对存储器做以下哪几种操作:1)只读2)读写3)同步读写4)多次读,同时进行一次写5)多次同步读写,同时提供一些方法保证一致性语法详细讲解
存储器建模第八十二页,共190页。`timescale1ns/10psmodulemyrom(read_data,addr,read_en_);inputread_en_;input[3:0]addr;output[3:0]read_data;reg[3:0]read_data;reg[3:0]mem[0:15];initial$readmemb(“my_rom_data”,mem);always@(addrorread_en_)if(!read_en_)read_data=mem[addr];endmodule语法详细讲解
简单ROM建模my_rom_data0000010111000011110100100011111110001001100000011101101000011101ROM的数据存储在另外的一个独立的文件中第八十三页,共190页。语法详细讲解
简单ROM建模上页所示的ROM模型说明:如何在Verilog中用二维的寄存器组来定义存储器。ROM中的数据保存在一个独立的文件中,如上页的右边的虚线方框所示。这是一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。第八十四页,共190页。语法详细讲解
简单RAM建模`timescale1ns/1nsmodulemymem(data,addr,read,write);inout[3:0]data;inout[3:0]addr;inputread,write;reg[3:0]memory[0:15];//4bits,16words//从存储器读出到总线上assigndata=read?memory[addr]:4’bz;//从总线写入存储器always@(posedgewrite)memory[addr]=data;endmodule第八十五页,共190页。语法详细讲解
简单RAM建模RAM模型比ROM模型稍微复杂:它必须具有读写能力;进行读写时通常使用相同的数据总线;需要新技术来处理双向总线;当读信号无效时,RAM模型与总线脱离,如果此时写信号也无效,总线无驱动源,则总线进入高阻状态,这就避免了RAM中的读写竞争。上页的RAM模块是可综合的,但综合出来是一大堆寄存器,占比较大的面积,经济上不太合算。第八十六页,共190页。例:modulescalable_ROM(mem_word,address);parameteraddr_bits=8;//sizeofaddressbusparameterwordsize=8;//widthofawordparameterwords=(1<<addr_bits);//sizeofmemoutput[wordsize:1]mem_word;//wordofmemoryinput[addr_bits:1]address;//addressbus
reg[wordsize:1]mem[0:words-1];//memdeclaration//outputonewordofmemorywire[wordsize:1]mem_word=mem[address];endmodule语法详细讲解
存储量可变的只读存储器建模第八十七页,共190页。语法详细讲解
存储量可变的只读存储器建模上述的例子演示了怎样通过设置字长和地址位数来编写只读存储器的行为模块。[注意]!!在上例中,存储字的范围从0开始的,而不是从1开始,这是因为存储单元是直接通过地址线寻址定位的。同样地,也可以用下面的方法来定义存储器和寻址:reg[wordsize:1]mem[1:words];//存储器地址从1开始//地址一个一个地增加直到包含了每个地址对应的存储器wire[wordsize:1]mem_word=mem[address+1];第八十八页,共190页。可以在初始化块中用一个循环或系统任务把初始数据存入存储器的每个单元。
使用循环把值赋给存储器数组。
for(i=0;i<memsize;i=i+i)//initializememory
mema[i]={wordsize{1’b1}};调用$readmem系统任务。//从文件mem_中,把初始数据存入存储器(mem)的每个单元$readmemb(“mem_”,mem);注意:上面两项必须写在initial块中,加载这些初始化数据不需要时间。
语法详细讲解
存储器的加载第八十九页,共190页。语法详细讲解
怎样使用双向口使用inout关键字声明端口为双向口。
inout[7:0]databus;使用双向口必需遵循下面的规则:inout口只能声明为网络连接类型,不允许把它声明为寄存器类型。(所以仿真器能确定多个驱动源的最终值。)在设计中,每次只能从一个方向来驱动inout口。
例如:当使用总线读RAM中的数据时,如果同时又向RAM模型的双向数据总线写数据,就会产生逻辑竞争,导致总线数据无法确定。所以必须为inout口设计控制逻辑,只有这样才能保证正确的操作。第九十页,共190页。语法详细讲解
怎样使用双向口[注意]:声明一个inout口,可以用来输入或输出数据。inout口默认为网络连接类型。不允许在过程块(initial或always块)中对网络连接类型的数据进行过程赋值;但可以在过程块外把一个寄存器数据类型通过连续赋值语句赋给它(inout口),或者把它与用户定义的源语(UDP)相连。必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口作为输入口时,必须通过控制逻辑禁止输出到inout口。第九十一页,共190页。使用Verilog中的基本元件(bufif1)为双向口建模:语法详细讲解
双向口建模b2b1en_a_ben_b_abus_abus_bmodulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;bufiflb1(bus_b,bus_a,en_a_b);bufiflb2(bus_a,bus_b,en_b_a);//结构模块逻辑endmodule当en_a_b=1时,元器件b1激活,bus_a的值传到bus_b上当en_b_a=1时,元器件b1激活,bus_b的值传到bus_a上第九十二页,共190页。语法详细讲解
双向口建模[注意]:
在上页的例子中,使用en_a_b和en_b_a来控制元器件bufifl,如果控制信号同时有效,则结果无法确定。所以必须把控制信号en_a_b和en_b_a在时间上分开。第九十三页,共190页。使用连续赋值为双向口建模:en_a_ben_b_abus_abus_bmodulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;assignbus_b=en_a_b?bus_a:’bz;assignbus_a=en_b_a?bus_b:’bz;//结构模块逻辑endmodule当en_a_b=1时,bus_a的值传到bus_b上当en_b_a=1时,bus_b的值传到bus_a上语法详细讲解
双向口建模b2b1第九十四页,共190页。[注意]:在assign语句中,通过en_a_b和en_b_a控制bus_a与bus_b之间的数据交换。如果控制信号同时有效,则结果不能确定。所以必须把控制信号en_a_b和en_b_a在时间上分开。语法详细讲解
双向口建模第九十五页,共190页。存储器的端口建模:语法详细讲解
双向口建模moduleram_cell(databus,rd.wr);inoutdatabus;inputrd,wr;regdatareg;assigndatabus=rd?datareg:’bz;always@(negedgewr)datareg<=databus;endmodule当rd等于1时datareg的值被赋给databus当wr的下降沿到达时,databus的值被写入datareg测试模块RAM单元数据总线数据寄存器rdwr第九十六页,共190页。[注意]:上页中存储单元在wr的下降沿到达时存入数据。上页模块在wr处于高电平时,通过数据总线写入数据,但必须保证wr的高电平维持时间长于数据的写入时间。在rd处于高电平时,上述存储单元通过数据总线读出数据。由于此模型为单口存储模型,因此wr变低电平时,rd不能同时为高电平,否则就无法确定存储器的读出/写入的结果。语法详细讲解
双向口建模第九十七页,共190页。目标:学会怎样定义或调用任务和函数。学会怎样使用命名块。学会怎样禁止命名块和任务。理解有限状态机的作用,学会如何显式地为有限状态机建模。语法详细讲解
第十六部分Verilog中的高级结构第九十八页,共190页。通过把代码分成小的模块或者使用任务和函数,可把一项任务分成许多较小的、易于管理的部分,从而提高代码的可读性、可维护性和可重用性。任务一般用于编写测试模块,或者行为描述的模块。其中可以包含时间控制(如:#delays,@,wait);
也可以包含input,output、inout端口定义和参数;也可以调用其他的任务或函数函数一般用于计算,或者用来代替组合逻辑。不能包含任何延迟;函数在零时间执行。函数只有input变量,虽然没有output变量,但可以通过函数名返回一个值。可以调用其他的函数,但不可以调用任务语法详细讲解
Verilog中的高级结构第九十九页,共190页。[注意]:只能调用本模块内的任务和函数。在任务和函数中不能声明网络连接类型的变量。所有的输入和输出变量实际上都是本地寄存器。只有当任务或函数调用并执行完后,才能有返回值。[举例说明]:若任务或函数中包含一个forever循环时,永远无法执行完,就不可能有返回值。语法详细讲解
Verilog中的高级结构第一百页,共190页。语法详细讲解
Verilog任务下面模块中的任务含有定时控制和一个输入,并且引用了一个本模块的变量,但是没有输出,也没有双向总线和内部变量,不显示任何内容。用于定时控制的信号,例如clk,绝对不能作为任务的输入,这是因为输入值只向任务内部传递一次。
moduletop;regclk,a,b;DUTu1(out,a,b,clk);always#5clk=!clk;
第一百零一页,共190页。语法详细讲解
整数和实常数
taskneg_clocks;input[31:0]number_of_edges;repeat(number_of_edges)@(negedgeclk);endtaskinitialbeginclk=0;a=1;b=1;neg_clocks(3);//任务调用a=0;neg_clocks(5);b=0;endendmodule语法详细讲解
Verilog任务第一百零二页,共190页。要点:任务调用是通过在Verilog模块中写入任务名来实现的。任务中可以包含input,output和inout端口变量的声明。传递给任务的变量与任务I/O端口变量的声明次序相同。虽然传递给任务的变量名可以和任务内声明的I/O端口变量名相同,但是为了使任务成为一个独立的可共用的任务块,建议不要使用与任务内声明的I/O端口变量名相同的变量名,最好给传递到任务的变量起新的不同的名字。在任务中可以使用时间控制。任务使Verilog有更广阔的适用范围。关键字disable可以用来禁止任务的执行。语法详细讲解
Verilog任务第一百零三页,共190页。[注意]:
不要在程序的不同部分同时调用同一个任务。这是因为任务只有一组本地变量,同一时刻调用两次相同的任务将会导致错误。这种情况常发生在使用定时控制的任务中。
在任务或函数中,引用父模块中声明的变量时要特别注意(即注意变量的层次命名规则)。若想在其它模块中调用任务或函数,该任务和函数中所使用的变量必须全都包含在输入/输出口列表中。语法详细讲解
Verilog任务第一百零四页,共190页。下面模块中的任务只含有一个双向总线(inout)端口和一个内部变量,没有其它输入端口、输出端口和定时控制,没有引用模块变量,不显示任何内容。
在任务调用时,任务的输入变量(端口)在任务内部被当作寄存器类型变量处理。
parameterMAX_BITS=8;reg[MAX_BITS:1]D;taskreverse_bits;inout[7:0]data;//双向总线端口被当作寄存器类型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 实务操作能力保安证试题及答案
- 保安证应试策略的重要性试题及答案
- 2025保安证预测考试试题及答案
- 2025保安证考试热点解析试题及答案
- 深入解读保安证考试题及答案
- 产业园区发展
- 2025年保安证考试笔试要点与试题及答案
- 内蒙古民族幼儿师范高等专科学校《烹饪卫生与安全》2023-2024学年第二学期期末试卷
- 2025届新疆维吾尔自治区库尔勒市新疆兵团第二师华山中学高三下学期期中检测试题物理试题含解析
- 海南工商职业学院《水资源利用》2023-2024学年第二学期期末试卷
- 《商场用电安全培训》课件
- 《ROHS知识培训》课件
- 法人授权投标委托书
- 《焊工培训课件》课件
- 上海迪士尼乐园
- 显微根管治疗操作指南
- 违法建筑课件教学课件
- 重大火灾隐患判定方法知识培训
- 三人股权合同模板
- 2024版抗菌药物DDD值速查表
- 装配式部分包覆钢-混凝土组合结构技术规程
评论
0/150
提交评论