Verilog基础知识.pdf
一个简洁的verlog 语言教程,或许不是最好的,但肯定是最简洁的目前版木的 Verilog hDl和VHDL在行为级扣象建模的覆盖范围方面也有所不同般认为 crilog HDL在系统抽象方面比VHDL强一些。 Verilog hDI较为适合算法级( Alogrithen)、寄存器传瑜级(RTL)、逻辑级(Logi)、门级(Gate)、没计。而ⅤHDL更为适合特大型的系统级( System)设计Verilog hdl设计锍租及设计方法简介1、设计流程(见图1)总体方案设计编程软件仿真综合网表硬件仿真图1: Verilog hdl设计流程注:1、总体方案是芯片级的2、软件仿真用来检测程序上的逻辑错误3、硬件仿真要根据需要褡成硬件电路,检査逻辑和时庶上的错误。使用FGA现场可编程门阵列)速度比正常慢10倍以上,而且只能检杏逻辑错误,不能检查时序错误2、设计方法L.自下而上的设计方法自下而上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的,设计树最末枝上的单元要么是己经制造出的单元,要么是其他项目已开发好的单元或者是可外购得到的单元。这种设计方法与只用硬件在模拟实验板上建立一个系统的步骤有密切联系。优点·设计人员对于用这种方法进行设计比较熟悉·实现各个子块电路所需的时间短缺点;般来讲,对系统的整体功能把握不足。·实现整亼系统的功能所嚅的时间长,因为必须先将各个小模抉完成。使用这种方法对设计人员之问相互进行协作有比较高的要求。I.自上而下(TDp-Down)的改计方法自上而下的设计是从系统级开始,把系统划分为基本单元,然后再把每个基木单元划分为下一层次的基本单元,一直这样做下去,直到可以直接用EDA元件库中的元件来实现为止优点在设计周期伊始就做好了系统分析。由于设计的主要仿真和调试过程是在高层次完成的,所以能够早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑仿真的工作量。自顶向下的设计方法方便了从系统划分和管理整个项目,使得几十万门甚至几百万门规模的复杂数字电路的设计成为可能。并可减少设计人员,避免不必要的重复设计,提高了设计的一次成功率。缺点·得到的最小单元不标准。·制造成本高。IL综合设计方法复杂数字逻辑电路和系统的设计过程通常是以上两种设计方法的结合。设计时需要考虑多个目标的综合平衡。在高层系统用自上而下的设计方法来实现,而在低层系统使用自下而上的方法从庠元件或数据库中调用已有的单元设计。这种方法兼有两种设计方法的优点,而且可以使用矢量测试库进行测试。更件描语言新的墩昃当前EDA工具所需解决的问题是如何大幅度提高设计能力,为此出现了一系列对HDL语言的扩展OO-VHDL( Object-Orieted VHDL),即面向对象的ⅤIDL。主要是引入了新的语言对象 Entityobject.此外,OOⅤHDL中的Eni!y和 Architecture具备了继承机制,不同的Entily objecl之间可以用消息来通信。因而 OO-VHDL通过引入Enti! oBject作为抽象、封装和模块性的基本单元解决了VHDL在抽象性的不足和在封装性上能力不强等问题,也通过其承杋制解决了实际设计中的一些问题。且由于O冂VHDL模型的代码比ⅤHDL模型短30%-50%,开发时问缩短,提高了设计效率。杜克大学发展的DE-VHDL( Duke extendedⅤHDL)通过增加3条语句,使设计者可以在ⅤHDL描述中调用不可综合的子系统(包括连接该子系统和激活相应功能)。杜克大学用DF-ⅤHDL进行一些多芯片系统的设计,极大地提高了设计能力。1998年将通过得Ⅴ erilog Hdl新标准,将把Ⅴ erilog HDL-A并入Ⅴ erilog HDL设计中,使其不仅支持数字逻揖电路的描述,还攴持模拟电路的描述,因而在混令信号电路设计中,将会得到广泛的应用。在亚微米和深亚微米ASC及高密度HPGA中,Ⅴ erilog hDl的发展前录很大1.2程序结构作为高级语言的一种, Verilog语言以模块集合的形式来描述数字系统,其中毎一个模块都有接口部分,用来描述与其它模决之间的连接。一般说来,一个文件就是一个模块,但并不绝对如此。这些模块是并行运行的,但通常用一个高层模块来定义一个封闭的系统,包括测试数据和硬件描述。这一高层模块将调用其它模块的实例。模块代表硬件上的逻辑实体,其范围可以从简单的门到整个大的系统,比如,一个计数器、一个存储子系统、一个微处理器等。模块可以裉据描述方法的不同定义成行为型或结构型(或者是二者的组合)。行为型模块通过传统的编程语言结构定义欻字系统(模块的状态,如使用i条件语勹、赋值语勹等。结枃型模块将数字系统(模块)的次态表达为具有层次概念的互相连接的子模块。其最底层的元件必须是基元或已定义过的行为型模块。Verilog的基元包括门电路,如与非门,和传输二极管(开关)模块的结构如下:nodule<模块名>(<端口列表>)定义><模块条目>endmodule其中,<模块名>是模块唯一性的标识符;κ端口列表>是瑜λ、输岀和双向端口的列表这些端口用来与其它模抉进行连接;≮定义>一段程序用来指定欻据对象为寄存器型、存储器型、线型以及过程决,诸如函数块和任务块;而<模块条目>可以是iil结构、 always结构、连续赋值或模块实例。下面是一个NAND与非模块的行为型描述,输出out是输入inl和in2相与后求反的结果∥与非门的行为型描述module nand(inl, in2, out);input in l, in2output out;连续赋值语句assign out=-(inl in2)endmoduleinl、i2和ou端口指定为线型的εasi连续赋值语句不间断地监视等式右端变量一旦其发生变化,右端表达式被重新赋值后结果传给等式左端进行输岀连续赋值语句用来描述纽合电路,一旦其输入发生变动,输岀也随之而改变下例所示是一与门模块的结构型描述,这一与门是通过将一个NAND的输出连到另NAND的两个输入上得到的。/由两个NAND生成的与门的结构型描述module and(inl, in2, out);input inl, in2:output out;wire wI∥两个NAND模块实例NAND NANDI(inl, in2, wl)NAND NAND2(Wl, wl, out);cndmodulc这个模块含有两个NAND模块实例,分别是NAND1和NAND2,通过内部连线w1连接起来。调用模块实例的一般形式为<模块名><参数列表><实例名>(端口列表>)在此,<参数列表>是传瑜到模块实例的参数值,参数传递的典型应用是定义门级延迟在1.7.1小节将有详细的说明。下面是一个高层模块的例子,在这一模决中设置了测忒数据并对变量进行监测。J测试以上两个模块的高层模块module test andgwire outl. oul2initial begin∥测试数据a=0;b=0;#1a=1;#1b=1;H1a=0:endinitial begin/设置监测功能Monitor("Timc=%0d a=%ob b=%b out1=%b out2=%b", Stimc, a, b, out1, out2)∥模块AND和NAND实例AND gate(a, b, out2)NAND gate2(a, b, outl)cndmodulc应注意的是a和b的值要保持一定的时间,因此,使用了1位的寄存器。寄存器型变量存储过程赋值的最终结果〔同传统的命令式编程话言相关似)。线型变量则没有存储能力,它们需要被持续驱动,比如用连续赋值语句或由一个模块的输出进行驱动,若线型输入的左端悬空,其值为未知的ⅹ连续赋值使用关键词 assign,而过程赋值的形弌是<寄存器变量>≡<表达弌>,其中<等存器变量>必须是寄存器型或夺储器型变量。过程赋值只允许岀现在iil和 always结构决中。前者 initial结构块中的语句顺序执行,一些话句没定了延迟并1,表示一个仿真时间单位的延迟ε always结构块与 initial结构块功能相同,但它是无限循环的过程(直到仿真停止)。initial和 always结构多用来描述时序逻辑〔即有限状态自动控制)Ⅴ chiloe语言中,过程赋值和 assign连续赋值之间区别很大。过程赋值改变一个寄存器的状态,即时序逻辑;而迮续赋值用来描述鉏合逻辑。连续赋值话勹驱动线型变量,输入操作数的值一发生变化,就重新计算并更新它所驱动的变量。掌握这一区别很有必要。将这三个模块放到一个文件中,仿真后将产生如下的结果Time=0 a=0b=0 out1=1 out2=0Time-1 a=1b=0 out1=1 out2-0Time=2 a=l b=l outl=0 out2=1Time 3a=0b=l out1=l out2=0在此无循环操作,仿真器执行所有的事件后自行停止,因此不需要指定仿真结束时间Ⅴ erilog语言的三和描述方法●结构型描述是通过实例进行描述的方法。将Ⅴeilg预定义的基元实例嵌入到浯言中,监控实例的输入,一旦其中任何一个发生变化,便重新运算并输出。数据流型描述是一种描述组合功能的方法,用 assign连续赋值语句来实现。连续赋值语勹完成如下的组合功能:等式右边的所有变量受持续监控,毎当这些变量中有任何一个发生变化,整亼表达式被重新赋值并送给等式左端。这种描述方法只能用来实现组合功能。●行为型描述是一种使用高级语言的方法,它和用软件编程语言描述没有什么不同。具冇很强的通用性和有效性。它是通过行为实例来实现的,关键词是 always,其含义是,一旦赋值给定,仿真器便等待变量的下一次变化,有无限循环之意使用Ⅴ erilog进行简单设计的实例程序如下;module mux21(out,a,b,sel);∥/端口定义output outinput a. b, sel/输入输出列表not(sel, sel);and(a1, a, scl )and(bl, b, sel)or(out, al, b1)结构描述endmodule对应硬件电路如图2所示albl图2:MUX21模块电路示意图a,b和sel是设备的输入端口,out是输出端口,所有信号都从这些端口流入和输出。andor,not是 Verilog中预定义好的基元实例,在结构型描述中使用。关键词 module和 endmodule之间包含完整的二选一多路选择器的设计实现。当在其它模块中用到这一多路选择器的模决时只需使用其模块名和所定义的端口名,不需要知道其内部的具体实现。这是至上而下没计方法的一个主要特征,因为一个模块的实现方法可以从行为级转换到门级,而对使月它的高层模块不产生任何影响1.3词法习俗Verilog HDL的源文本文件是由一串词法标识符构成的,一个词法标识符匈含一个或若千个字符。源文件中这些标识符的拌放格式很自由,也就是说,在句法上间隔和挨行只是将这些标识符分隔开来,并不具冇重要意义,转意( escaped)标识符(见后面的详细说明)Verilog语言中词法标识符的类型有以下几种:间隔符注释符算子一数值字符串标识符一关键词接下来对这些标识符一一进行说明。l、间隔符间隔符包括空格字符、制表符、换行以及换页符,这些字符除了起到与其饣词法标识符相分隔的作用外可以被忽略,但是在字符串中空白和制表符会被认为是有意义的字符释Verilog HDL有两种注释形式,单行注释和段注释(多行)。单行注释以两个字符“起始,以新的一行作为结束;而段注释则是以γ起始,以*结束。段注释不允许嵌套。在段注释中单行注释标识符/没有任何特殊意义。3、算子算子是由单个、两个或三个字符组成的序列串,它用在表达式中,在第节讲述了表达式中算子的使用一元算子放在操作数的左侧,二元算子的位置在两个操作数之间,条件算子有两个算子字符分隔三个操作数。4、数值Verilog hdi的数值集合由以下四个基本的值组成:0一代表逻辑0或假状态一代表逻辑1或真状态x一逻辑不定态z—高阻态常数按照其数值类型可以划分为整数和实数两种Verilog hdl的整数可以是十进制、十六进制、八进制或二进制的,格式为:位宽><基数><数值>●位宽:描述常量所含位欻的十进削整数,是可选项,如果没有这-项,可以从常量的值推断出●基数:可选项,可以是b,B,d,D,o,O,h或H,分别表示二进制、八进制、十进制和十六进制。基数缺省默认为十进制数。数值:是由基数所决定的表示常量真实值的一串ASCⅡ码。如果基数定义为b或B,数值可以是0,1,x,Ⅹ,z或Z。若基数是σ或O,数值还可以是2,3,4,5,6,7;若基数是h或H,数值还可以是8,9,a,A,b,B,c,C,d,D,e,Ef,F。对于基数为d或D的情况,数值符可以是任何的十进制数,0到9但不可以是X或Z。举例如下15(十进制15)h15(十进制21,十六进制15)5b10011(十进制19,二进制10011)2hOIF(十进制31,十六进制0b01X(无十进制值,二进制01x)a、数值常量中的下划线""是为了增加可读性,可以忽略,如;8"b1000001是8位二进制数b、在给寄存器型数据赋值时,有大小的负数并不使用符号扩展的方法生成。、数值常量中的“?”表示高阻状态,如:2B1?表示2位的二进制数,其中的一位是高阻状态Verilog中实数用双精度浮点型数据来描述。实数既可以用小数〔如12.79)也可以用科学计数法的方式(如247,表示24乘以10的7次方)来表达。带小数点的实数在小效点两侧都必须至少有一位数字。例如1.20.5128.74961丌E8(指数符号可以是e或E)57.6e-30.1c-0123.374286e-9(下划线忽略)下面的儿个例子是无效的格式257.E实数可以转化为整敖,根据四舍五入的原则,而不是戳断原则。当将实数赋给一个整数时,这和转化会自行发生。例如,在转化成整数时,实数25.5和25.8都变成26,而25.2则变成25。5、字符串字符串常量是一行上写在双引号之间的字符序列串,在表达式和赋值语句中字符串用作算子,且要转换成无符号整型常量,用一串8位二进制ASCⅡ码的形式表示,每一个8位二进制ASCⅡ码代表一个字符。例如:字符串“ab”等价于16h5758字符串变量是寄存器型变量,它具有与字符串的字符数乘以8相等的位宽例如存储12个字符的字符串“ Hello china!”需要8*12,即96位宽的寄存器reg [8*12: 1] strlnstr=“ hello china!end使用Ⅴ erilog HDl的操作符可以对字符串进行处理,被操作符处理的欻据是8位ASCⅡI码的顺序Verilog支持C语言中的转意符,如t,Ⅶn,},"和%%等,标识符、关键字和系统名称标识符是赋给对象的唯一的名字,用这个标识符来提及相应的对象。标识符可以是字母、数字、$符和下划线()字符的任意组合序列,但它必须以字母(大小写)或下划线开头,不能是数字或$符。标识符是区分大小写的。例如: atack del, clk in1,shif,oS284等。非法命名如下:34net,a"bnet逃逸标识符( Escaped identifiers)以反斜衽""开始,以空格结束,这种命名可以包含任何可印刷的ASCⅡ字符,反斜杠和空格不属于名称的一部分。如:}#sel,{A,B}, Abusatindex等关键字是预先定义的非逃逸标识符,用来定义语言结构,所有的关键字都是用小写方式定义的,附录A给出了所有已定义的关键字列表。系统任务标识符:S< identifier,其中$表示引入一个语言结构,其后所跟的标识符是系统任务或系统函数的名称。 Identifier>系统任务或系统函数标识符可以在三处进行定义:S< identifier>系统任务和函数的标准集合一使用PLI( Programming language Interface)定义附加的< identifier>系统任务和函数通过软件工具定义附加的< Identifier>系统任务和函数系统功能可以执行不同的操作实时显示当前仿真时间($timc)一显示/嗌视信号的值($ display.,$ monitor)一暂停仿真( Sstop)结束仿真( Finish)151: Monitor(Stime, "a=%b, b=%oh", a, b);每次a或b信号的值发生变化,这一系统任务的调用负责显示当前仿真时间、二进制格式的a信号和十六进制格式的b信号4数据类型Ⅴ erilog HDL的数据类型集合表示在硬件数字电路中数据进行夺储和传输的要素。Verilog语言支持抽象数据类型,如整型、实型等;冋时乜支持物理数据类型,可代表真实的硬件。按物理数据类型分Verily中变量的物理数据类型分为线型和寄存器型两种,这两种类型的变量在定义时要设置位宽,缺省值为一位。变量的毎一位可以是0,1,Ⅹ或Z。Ⅹ代表一个未被预置初始状态的变量或是由于两个或更多个驱动装置试图将之设定为不同的值而引起的冲突型线
用户评论