第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页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

.,1,Verilog硬件描述语言VerilogHDL,主讲陈付,安徽师范大学2015,.,2,第3讲VerilogHDL常用建模方法,电路(开关级)级建模门级(逻辑级)建模数据流建模行为级(RTL级)建模,Verilog模型可以是实际电路不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:(1)系统级(system)(2)算法级(algorithmic)(3)RTL级(RegisterTransferLevel):(4)门级(gate-level):(5)开关级(switch-level),.,3,3.1电路级建模,.,4,电路级建模,能够描述基本MOS开关:nmos,pmos和cmos。理解双向传输开关、电源和地的建模方法。识别阻抗MOS开关。解释在基本MOS开关和双向传输开关上说明延迟的方法。在Verilog中,用所提供的开关建立基本开关级电路,.,5,3.1.1开关级建模元件MOS开关,可以用关键字nmos和pmos定义两种类型的MOS开关关键字nmos用于NMOS晶体管建模;关键字pmos用于PMOS晶体管建模。NMOS和PMOS开关的符号如下图所示。描述方式:,.,6,信号out的值由信号data和control的值确定。out的逻辑值如表11.1所示。信号data和control的不同组合导致这两个开关输出1,0或者z或x,逻辑值(如果不能确定输出为1或0,就有可能输出z值或x值)。符号L代表0或z,H代表1或z。因此,NMOS开关在control信号是1时导通。如果control信号是0,则输出为高阻态值。与此类似,如果control信号是0,则PMOS开关导通。具体的输入输出参见下表:,.,7,CMOS开关用关键字cmos声明。CMOS开关的符号如下图所示。CMOS开关实例的引用:CMOS门本质上是两个开关(NMOS和PMOS)的组合体可以用NMOS和PMOS器件来建立CMOS器件的模型。,.,8,NMOS,PMOS和CMOS门都是从漏极向源极导通,是单向的。在数字电路中,双向导通的器件很重要。对双向导通的器件而言,其两边的信号都可以是驱动信号。有三个关键字用来定义双向开关:tran,tranif0和tranif1。tran开关作为两个信号inout1和inout2之间的缓存。inout1或inout2都可以是驱动信号。仅当control信号是逻辑0时tranif0开关连接inout1和inout2两个信号。如果control信号是逻辑1,则没有驱动源的信号取高阻态值z。有驱动源的信号仍然从驱动源取值。如果control信号是逻辑1,则tranif1开关导通。实例引用如下:,.,9,电源和地,计晶体管级电路时需要源极(Vdd,逻辑1)和地极(Vss,逻辑0)。源极和地极用关键字supply1和supply0来定义。源极类型supply1相当于电路中的Vdd,并将逻辑1放在网表中。源极类型supply0相当于地或Vss,并将逻辑0放在网表中。在整个模拟过程中,supply1和supply0始终为网表提供逻辑1值和逻辑0值。源极supply1和supply0如下所示。,.,10,阻抗开关,前面所讨论的MOS,CMOS和双向开关可以用相应的阻抗器件建模。阻抗开关比一般的开关具有更高的源极到漏极的阻抗,且在通过它们传输时减少了信号强度。在相应的一般开关关键字前加带r前缀的关键字,即可声明阻抗开关。在一般开关和阻抗开关之间有两个主要区别:源极到漏极的阻抗和传输信号强度的方式。关于Verilog中的强度级别参见书中附录A。,.,11,开关中的延迟说明,MOS和CMOS开关可以为通过这些开关级元件的信号指定延迟。延迟是可选项,它只能紧跟在开关的关键字之后。延迟说明类似于Rise,Fall和Turn-off延迟。可以为开关指定0个、1个、2个或者3个延迟,如下所示。,.,12,双向传输开关双向传输开关的延迟说明需要稍做区别解释。这种开关在传输信号时没有延迟。但是,当开关值切换时有开(turn-on)和关(turn-off)延迟。可以给双向开关指定0个、1个或2个延迟,如下表所示。specify块也可以给使用开关设计的模块指定路径延迟(引脚到引脚的延迟)以及时序检查。用specify块可以描述路径延迟。在第10章中详细讨论了路径延迟说明,它在开关级模型中也完全适用。,.,13,3.1.2举例CMOS或非门(nor),.,14,二选一多路选择器,.,15,简单的CMOS锁存器,.,16,CMOS反向器,.,17,3.1.3小结,开关级建模处于很低的设计抽象层次。只在很少的情况下,比如在设计者需要定制自己的叶级元件(即最基本的元件)时,才使用开关级建模。随着电路复杂度的增加,这个级别的Verilog设计越来越少见;MOS,CMOS,双向开关和supply1,supply0源可用于设计任意的开关级电路。CMOS开关是MOS开关的一种组合;延迟对开关元件来说是可选的。对于不同的双向器件,有不同的延迟解释。,.,18,3.2门级建模,.,19,门级建模,当前的数字电路设计,绝大多数都是建立在门级或更高的抽象层次上的。在门级抽象层次上,电路是用表示门的术语来描述的,如用and(与门),nand(与非门)等来描述。这种设计方法对于具有数字逻辑设计基础知识的用户来说是很直观的,在Verilog描述和电路的逻辑图之间存在着一一对应的关系。,.,20,3.2.1门的类型,Verilog语言中常用的门包括如下几种(以二输入为例):,1.与/或门,.,21,在Verilog语言中,我们可以调用(实例引用)这些逻辑门来构造逻辑电路。在门的实例引用中,输入端口的数目可以超过两个,这时只需将输入端口全部排列在端口列表中即可,Verilog会根据输入端口的数目自动选择引用合适的逻辑门。注意,在门级原语实例引用的时候,我们可以不指定具体实例的名字,这一点为设计师编写需要实例引用几百个门的模块提供了方便。格式:,;,.,22,2.缓冲器/非门,与and/or门相反,buf/not门具有一个标量输入和多个标量输出。端口列表中的最后一个终端连接至输入端口,其他终端连接至输出端口。在这里,我们只讨论具有一个输入和一个输出的buf/not门,其原语和逻辑符号如下:Buf/not的引用实例如下:,.,23,带控制端的缓冲器/非门,除buf和not门之外,Verilog还提供了其他4个带有控制信号端口的buf/not门,这四种类型的门只有在控制信号有效的情况下才能传递数据;如果控制信号无效,则输出为高阻抗z。这些门的原语和逻辑符号如下:,.,24,在控制信号有效的情况下,这些门才能传递信号。在某些情况下,例如当一个信号由多个驱动源驱动时,我们可以这样来设计驱动源:让它们的控制信号的有效时间互相错开,从而避免一条信号线同时被两个源驱动。这时就需要使用带有控制端的缓冲器/非门来搭建电路。引用的实例如下:,.,25,3.实例数组,在许多情况下,我们需要对某种类型的门进行多次调用(实例引用),这些门实例之间的区别仅仅在于它们分别连接在不同的向量信号位上。为了简化,Verilog允许用户自己来定义门实例数组。如下例:,.,26,4.举例,门级多路选择器在本例中,我们设计一个带有两个控制信号的四选一多路选择器,并且假设控制信号s1和s0不能为x或z值。,.,27,采用Verilog门级描述,得到如下代码:,.,28,5.1门的类型举例(续),.,29,用门级结构描述D触发器,ndata,.,30,moduleflop(data,clock,clear,q,qb);inputdata,clock,clear;outputq,qb;wirea,b,c,d,e,f,ndata,nclock;nandnd1(a,data,clock,clear),nd2(b,ndata,clock),nd3(c,a,d),nd4(d,c,b,clear),nd5(e,c,nclock),nd6(f,d,nclock),nd7(q,e,qb),nd8(qb,q,f,clear);notiv1(ndata,data),iv2(nclock,clock);endmodule,.,31,由已经设计成的模块来构成更高一层的模块,.,32,modulehardreg(d,clk,clrb,q);inputclk,clrb;input3:0d;output3:0q;flopf1(d0,clk,clrb,q0,),f2(d1,clk,clrb,q1,),f3(d2,clk,clrb,q2,),f4(d3,clk,clrb,q3,);endmodule注意:当f1到f4实例引用已编模块flop时,由于不需要flop端口中的qb口,故在引用时把它省去,但逗号仍需要留着。,.,33,3.2.2门延迟1.上升、下降和关断延迟,上升延迟:在门的输入发生变化的情况下,门的输出从0,x,z变化为1所需的时间称为上升延迟。下降延迟:下降延迟是指门的输出从1,x,z变化为0所需的时间。关断延迟:关断延迟是指门的输出从0,1,x变化为高阻抗z所需的时间。,.,34,2.延迟声明,如果用户只指定了一个延迟值,那么对所有类型的延迟都使用这个延迟值如果用户指定了两个延迟值,则它们分别代表上升延迟和下降延迟,两者中的小者为关断延迟如果用户指定了三个延迟值,则它们分别代表上升延迟、下降延迟和关断延迟。如果未指定延迟值,那么默认延迟值为0。,.,35,最小/典型/最大延迟,最小值:设计者预期逻辑门所具有的最小延迟。典型值:设计者预期逻辑门所具有的典型延迟。最大值:设计者预期逻辑门所具有的最大延迟。,.,36,3.门延迟举例,考虑一个简单的例子,说明如何使用门延迟为逻辑电路建立时序模型。假设模块D实现逻辑功能:out=(ab)+c。模块D的逻辑图如下,其中包含了一个延迟时间为5个单位的与门和一个延迟时间为4个单位的或门。,.,37,.,38,.,39,习题1,利用双输入端的nand门,用Verilog编写自己的双输入端的与门、或门和非门,把它们分别命名为my_or,my_and和my_not,并通过激励模块验证这些门的功能。,.,40,modulemy_and(in1,in2,out);inputin1,in2;outputout;wireout1;nanda1(out,out1,out1);nanda2(out1,in1,in2);endmodule,modulemy_or(in1,in2,out);inputin1,in2;outputout;wireout1,out2;nando1(out,out1,out2);nando2(out1,in1,in1);nando3(out2,in2,in2);endmodule,modulemy_not(in,out);inputin;outputout;nandn1(out,in,in);endmodule,.,41,习题2,使用上题中完成的my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=xy+xy,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真。,.,42,modulemy_xor(in1,in2,out);inputin1,in2;outputout;wirenot_in1,not_in2,out_a1,out_a2;my_notmynot1(in1,not_in1);my_notmynot2(in2,not_in2);my_andmyand1(in1,not_in2,out_a1);my_andmyand2(in2,not_in1,out_a2);my_ormyor1(out_a1,out_a2,out);endmodule,.,43,moduletest52;regx,y;wirez;initialbeginx=0;y=0;#10 x=0;y=1;#10 x=1;y=0;#10 x=1;y=1;#10$stop;endinitial$monitor($time,“x=%b,y=%b,z=%b,x,y,z);my_xormyxor(x,y,z);endmodule,.,44,习题3,带有延迟的RS锁存器如下图所示,写出其带有延迟的Verilog门级描述。编写其激励模块,根据下面的输入-输出关系表对其功能进行验证。,.,45,modulemy_rs(reset,set,q,qbar);inputreset,set;outputq,qbar;nor#(1)nor1(q,reset,qbar);nor#(1)nor2(qbar,set,q);endmodule,moduletest54;regset,reset;wireq,qbar;initialbeginset=0;reset=1;#10set=0;reset=0;#10set=1;reset=0;#10set)、左移()。普通移位操作符的功能是将向量操作数向左或向右移动指定的位数,因此它的两个操作数分别是要进行移位的向量(操作符左侧)和移动的位数(操作符右侧)。当向量被移位之后,所产生的空余位使用0来填充,而不是循环(首尾相连)移位。算术移位操作符则根据表达式的内容来确定空余位的填充值。,.,66,拼接操作符,使用拼接操作符(,)可以将多个操作数拼接在一起,组成一个操作数。拼接操作符的每个操作数必须是有确定位宽的数,这是由于为了确定拼接结果的位宽,必须知道每个操作数的位宽,因此无位宽的数不能作为拼接操作符的操作数。拼接操作符的用法是将各个操作数用大括号括起来,之间用逗号隔开。操作数的类型可以是变量线网或寄存器、向量线网或寄存器、位选、域选和有确定位宽的常数。,.,67,重复操作符,如果需要多次拼接同一个操作数,则可以使用重复操作符;重复拼接的次数用常数来表示,该常数指定了其后大括号内变量的重复次数。,.,68,条件操作符,条件操作符(?:)带有三个操作数:语法:condition_expr?true_expr:false_expr;即,条件表达式?真表达式:假表达式;执行过程为:首先计算条件表达式(condition_expr),如果为真(即逻辑1),则计算“真表达式”(true_expr);如果为假(即逻辑0),则计算“假表达式”(false_expr);如果为不确定x,则两个表达式都进行计算,然后对两个结果进行逐位比较。如果相等,则结果中该位的值为操作数中该位的值;如果不相等,则结果中该位的值取x。,.,69,操作符的优先级,.,70,3.3.4部分实例四选一多路选择器,方法1:使用逻辑等式,.,71,方法2:使用条件操作符,.,72,四位全加器,方法1:数据流操作符在本节中,我们使用数据流级对其进行描述。,.,73,方法2:带超前进位的全加器,.,74,脉动进位计数器,四位脉动进位计数器的前面课程中已经设计过,它是由4个T触发器构成的,而T触发器由D触发器和反相门构成的,D触发器是由基本逻辑门构成的。我们按照自顶向下的顺序使用数据流语句写出Verilog描述。首先是顶层模块counter:,.,75,接下来设计T_FF模块,.,76,最后,使用数据流语句来定义底层的D_FF模块,.,77,.,78,3.3.5小结,连续赋值是数据流建模的主要语法结构。连续赋值总是处于有效(active)状态,即任一操作数的变化都会立即导致对表达式的重新计算。连续赋值语句的左侧值(赋值目标)必须是线网类型的变量或其连接。任何逻辑功能都能够使用连续赋值语句来完成。延迟值用于控制右侧变量的改变和语句左侧被赋予新值之间的时间间隔。线网的(赋值)延迟可以通过assign语句、隐式连续赋值和线网声明三种方法来实现。赋值语句包含表达式、操作符和操作数。操作符的类型包括算术、逻辑、关系、等价、按位、缩减、移位、拼接、重复和条件。单目、双目和三目操作符分别具有一个、两个和三个操作符,而拼接操作符可以具有任意多个操作符。条件操作符的功能类似硬件中的多路选择器或软件编程语言中的if-then-else语句。电路的数据流级描述要比门级描述简明。在第5章中讨论的四选一多路选择器和四位全加器同样可以用数据流语句来实现。在本章中,我们使用两种方法重新设计了这两个电路。此外我们还使用负沿触发的D触发器设计了一个四位脉动计数器。,.,79,3.4行为级建模,.,80,学习目标,结构化过程always和initial定义阻塞(blocking)和非阻塞(non-blocking)过程性赋值语句。理解行为级建模中基于延迟的时序控制机制。学习使用一般延迟、内嵌赋值延迟和零延迟。理解行为级建模中基于事件的时序控制机制。学习使用一般事件控制、命名事件控制和事件OR(或)控制。在行为级建模中使用电平敏感的时序控制机制。使用if和else解释条件语句。使用case,casex和casez语句讲解多路分支。理解while,for,repeat和forever等循环语句。定义顺序块和并行块语句。理解命名块和命名块的禁用。在设计实例中进行行为级建模。,.,81,3.4.1结构化过程语句,在Verilog中有两种结构化的过程语句:initial语句和always语句,它们是行为级建模的两种基本语句。其他所有的行为语句只能出现在这两种结构化过程语句里。与C语言不同,Verilog在本质上是并发而非顺序的。Verilog中的各个执行流程(进程)并发执行,而不是顺序执行的。每个initial语句和always语句代表一个独立的执行过程,每个执行过程从仿真时间0开始执行,并且这两种语句不能嵌套使用。,.,82,initial语句,所有在initial语句内的语句构成了一个initial块。initial块从仿真0时刻开始执行,在整个仿真过程中只执行一次。如果一个模块中包括了若干个initial块,则这些initial块从仿真0时刻开始并发执行,且每个块的执行是各自独立的。如果在块内包含了多条行为语句,那么需要将这些语句组成一组,一般是使用关键字begin和end将它们组合为一个块语句;如果块内只有一条语句,则不必使用begin和end。由于initial块语句在整个仿真期间只能执行一次,因此它一般被用于初始化、信号监视、生成仿真波形等目的。,.,83,.,84,在变量声明的同时进行初始化同时进行端口/数据声明和初始化,.,85,always语句,always语句包括的所有行为语句构成了一个always语句块。该always语句块从仿真0时刻开始顺序执行其中的行为语句;在最后一条执行完成后,再次开始执行其中的第一条语句,如此循环往复,直至整个仿真结束。always语句通常用于对数字电路中一组反复执行的活动进行建模。例如时钟信号发生器,每半个时钟周期时钟信号翻转一次。在现实电路中只要电源接通,时钟信号发生器从时刻0就有效,一直工作下去。,.,86,3.4.2过程赋值语句,过程赋值语句的更新对象是寄存器、整数、实数或时间变量。这些类型的变量在被赋值后,其值将保持不变,直到被其他过程赋值语句赋予新值。用法:过程赋值语句的左侧值可以是:1.reg,整型数、实型数、时间寄存器变量或存储器单元。2.上述各种类型的位选(例如,addr0)。3.上述各种类型的域选(例如,addr31:16)。上面三种类型的拼接。Verilog包括两种类型的过程赋值语句:阻塞赋值和非阻塞赋值语句,.,87,阻塞赋值语句,阻塞赋值语句使用“=”作为赋值符,在一个begin-end块中表现为串行行为。,1如果右侧表达式的位宽较宽,则将保留从最低位开始的右侧值,把超过左侧位宽的高位丢弃;2如果左侧位宽大于右侧位宽,则不足的高位补0;,.,88,非阻塞赋值使用“表示;判断事件是否发生使用符号来识别。,.,97,OR事件控制有时,多个信号或者事件中发生的任意一个变化都能够触发语句或语句块的执行。在Verilog语言中,可以使用“或”表达式来表示这种情况。由关键词“or”连接的多个事件名或者信号名组成的列表称为敏感列表。在跳变沿敏感的触发器中,也可以使用关键词“,”来代替“or”。,.,98,如果组合逻辑块语句的输入变量很多,那么编写敏感列表会很繁琐并且容易出错。针对这种情况,Verilog提供了另外两个特殊的符号:*和(*),它们都表示对其后语句块中的所有输入变量的变化是敏感的。,.,99,3.4.5电平敏感时序控制,Verilog同时也允许使用另外一种形式表示的电平敏感时序控制(即后面的语句和语句块需要等待某个条件为真才能执行)。Verilog语言用关键字wait来表示等待电平敏感的条件为真。仿真器连续监视count_enable的值。如果其值为0,则不执行后面的语句,仿真会停顿下来;如果其值为1,则在20个时间单位之后执行这条语句。如果count_enable始终为1,那么count将每20个时间单位加1。,.,100,3.4.6条件语句,条件语句用于根据某个条件来确定是否执行其后的语句,关键字if和else用于表示条件语句。Verilog语言共有三种类型的条件语句,用法如下:,.,101,.,102,3.4.7多路分支语句case,当条件语句中选项的数目很多时,使用if-else语句就会很不方便,这时可以使用case语句来解决这个问题。case语句使用关键字case,endcase和default来表示。语法如下:case语句中的每一条分支语句都可以是一条语句或一组语句。多条语句需要使用关键字begin和end组合为一个块语句。在执行时,首先计算条件表达式的值,然后按顺序将它和各个候选项进行比较,如果和全部候选项都不相等,则执行default_statement语句。注意,default_statement语句是可选的,而且在一条case语句中不允许有多条default_statement。另外,case语句可以嵌套使用。,.,103,case语句类似于多路选择器,下面使用case语句实现四选一多路选择器。,.,104,case语句逐位比较表达式的值和候选项的值,每一位的值可能是0,1,x或z。上例中只考虑0和1的情况,将x和z的情况归结为default。我们也可以将这部分进行单独的说明,如下:,.,105,casex/casez,case语句还有两个变形:casex和casez。casez语句将条件表达式或候选项表达式中的z作为无关值,所有值为z的位也可以用“?”来代表,即对非x的位置casex语句将条件表达式或候选项表达式中的x作为无关值。casex和casez的使用可以让我们在case表达式中只对非x或非z的位置进行比较。casez的使用与casex的使用类似。,.,106,3.4.7循环语句,Verilog语言中有四种类型的循环语句:while,for,repeat和forever。这些循环语句的语法与C语言中的循环语句相当类似。循环语句只能在always或initial块中使用,循环语句可以包含延迟表达式。while循环while循环使用关键字while来表示。while循环执行的中止条件是while表达式的值为假。如果遇到while语句时while表达式的值已经为假,那么循环语句一次也不执行。,.,107,for循环,for循环使用关键字for来表示,它由三个部分组成:1初始条件;2检查终止条件是否为真;3改变控制变量的过程赋值语句。for循环语句因此它的写法较while循环更为紧凑。但是要注意,while循环比for循环更为通用,并不是在所有情况下都能使用for循环来代替while循环。,.,108,repeat循环,关键字repeat用来表示这种循环。repeat的功能是执行固定次数的循环,它不能像while循环那样根据逻辑表达式来确定循环是否继续进行。repeat循环的次数必须是一个常量、一个变量或者一个信号。如果循环重复次数是变量或者信号,循环次数是循环开始执行时变量或者信号的值,而不是循环执行期间的值。,.,109,forever循环,关键字forever用来表示永久循环。在永久循环中不包含任何条件表达式,只执行无限的循环,直到遇到系统任务$finish为止。如果需要从forever循环中退出,可以使用disable语句。例1:时钟发生器例2:在每个时钟正跳变沿处使两个寄存器的值一致,.,110,3.4.8顺序块和并行块,块语句的作用是将多条语句合并成一组,使它们像一条语句那样。在前面的例子中,我们使用关键字begin和end将多条语句合并成一组。由于这些语句需要一条接一条地顺序执行,因此常称为顺序块。Verilog语言中的块语句类型有两种:顺序块和并行块。我们将讨论三种有特点的块语句:命名块、命名块的禁用以及嵌套的块。,.,111,块语句的类型顺序块,顺序块由关键字begin和end构成,用于将多条语句组成一个块,它的特点是:1顺序块中的语句是一条接一条按顺序执行的;只有前面的语句执行完成之后才能执行后面的语句(除了带有内嵌延迟控制的非阻塞赋值语句);2如果语句包括延迟或事件控制,那么延迟总是相对于前面那条语句执行完成的仿真时间的。顺序块的例子在前面学习中涉及很多,如,.,112,块语句的类型并行块,并行块由关键字fork和join声明,它具有以下特性:1并行块内的语句并发执行;2语句执行的顺序是由各自语句中的延迟或事件控制决定的;3语句中的延迟或事件控制是相对于块语句开始执行的时刻而言的。并行块与顺序块之间的根本区别在于:当控制转移到块语句的时刻,并行块中所有的语句同时开始执行,语句之间的先后顺序是无关紧要的。,.,113,并行块为我们提供了并行执行语句的机制。但是,在使用并行块时需要注意,如果两条语句在同一时刻对同一个变量产生影响,那么将会引起隐含的竞争。竞争结果取决于仿真器的具体实现方法。无法正确地处理竞争是目前所使用的仿真器的一个缺陷,这一缺陷并不是并行块所引起的。,如果x=1b0和y=1b1两条语句首先执行,那么最终变量z和w的值为1和2,如果z=x,y和w=y,x两条语句首先执行,那么最终变量z和w的值都是2bxx,.,114,块语句的特点,块语句具有的三个特点:嵌套块、命名块和命名块的禁用。嵌套块块可以嵌套使用,顺序块和并行块能够混合在一起使用。,.,115,命名块块可以具有自己的名字,我们称之为命名块。它的特点:1命名块中可以声明局部变量。2命名块是设计层次的一部分,命名块中声明的变量可以通过层次名引用进行访问。3命名块可以被禁用,例如停止其执行。,.,116,命名块的禁用使用关键字disable可以终止命名块执行。disable可以用来从循环中退出、处理错误条件以及根据控制信号来控制某些代码段是否被执行。对块语句的禁用导致紧接在块后面的那条语句被执行。,.,117,生成块,生成语句能够控制变量的声明、任务或函数的调用,还能对实例引用进行全面的控制。编写代码时必须在模块中说明生成的实例范围,关键字generate-endgenerate用来指定该范围。生成实例可以是模块、用户自定义原语、门级原语、连续赋值语句、initial和always块中的一种或多种。生成的实例具有惟一的标识名,因此可以用层次命名规则引用。Verilog语言允许在生成范围内声明下列数据类型:net(线网)和reg(寄存器)、integer(整型数)、real(实型数)、time(时间型)和realtime(实数时间型)、event(事件)。任务和函数的声明也允许出现在生成范围中,但不能出现在循环生成当中。不允许出现在生成范围中的模块项声明包括:参数、局部参数、输入、输出和输入/输出声明、指定块在Verilog中有三种创建生成语句的方法:循环生成、条件生成、case生成。,.,118,循环生成语句,循环生成语句允许使用者对变量声明、模块、用户自定义原语、门级原语、连续赋值语句、initial和always块进行多次实例引用。,.,119,在仿真开始前,仿真器会对生成块中的代码进行确立(展平),将生成块转换为展开的代码,然后对展开的代码进行仿真。因此,生成块的本质是使用循环内的一条语句来代替多条重复的Verilog语句,简化用户的编程;关键词genvar用于声明生成变量,生成变量只能用在生成块中;在确立后的仿真代码中,生成变量是不存在的;一个生成变量的值只能由循环生成语句来改变;循环生成语句可以嵌套使用。但是使用同一个生成变量作为索引的循环生成语句不能相互嵌套;xor_loop是赋予循环生成语句的名字,目的在于通过它对循环生成语句中的变量进行层次化引用。因此,循环生成语句中各个异或门的相对层次名分别为:xor_loop0.g1,xor_loop1.g1,xor_loop31.g1。,.,120,.,121,条件生成语句,条件生成语句类似于if-else-if的生成构造,该生成构造可以根据设计模块中表达式值的真假,决定是否调用相应的Verilog结构(模块、用户自定义原语、门级原语、连续赋值语句、initial或always块)。,.,122,case生成语句,与条件生成语句类似,只不过将其中的if-else形式改为case形式。case生成语句可以调

温馨提示

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

评论

0/150

提交评论