verilog第二章简单的Verilog模块.ppt
《verilog第二章简单的Verilog模块.ppt》由会员分享,可在线阅读,更多相关《verilog第二章简单的Verilog模块.ppt(56页珍藏版)》请在装配图网上搜索。
第二讲Verilog语法的基本概念,主要内容Verilog建模概述模块的基本概念简单示例模块特点模块结构模块语法三种建模方式模块的测试有关VerilogHDL的几个重要基本概念,VerilogHDL是一种用于数字逻辑电路设计的语言:-用VerilogHDL描述的电路设计就是该电路的VerilogHDL模型。-VerilogHDL既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的VerilogHDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:,2.1Verilog的建模概述,Verilog的建模级别,1系统级(system):用高级语言结构实现设计模块的外部性能的模型.2算法级(algorithmic):用高级语言结构实现设计算法的模型,不包含时序信息。3RTL级(RegisterTransferLevel):描述数据在寄存器之间流动和如何控制这些数据的模型。4门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。5开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。算法级是高级的建模,一般对特大型设计或有较复杂的算法时使用,特别是通讯方面的一些系统,通过算法级的建模来保证设计的系统性能,在算法级通过后,再把算法级用RTL级进行描述,门级一般对小型设计时使用。开关级一般在版图级进行。,可综合的VerilogHDL模型,算法级(AlgorithmLevel)-部分可综合寄存器传输级(RegisterTransferLevel)-完全可综合门级(GateLevel)-完全可综合开关级(SwitchLevel)-用于基本逻辑器件仿真模型的建库,Verilog的功能,1可描述顺序执行或并行执行的程序结构。2用延迟表达式或事件表达式来明确地控制过程的启动时间。3通过命名的事件来触发其它过程里的激活行为或停止行为。4提供了条件、if-else、case、循环程序结构。5提供了可带参数且非零延续时间的任务(task)程序结构。6提供了可定义新的操作符的函数结构(function)。7提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。8VerilogHDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。,2.2模块的基本概念,模块(module)是Verilog的基本描述单位,用于描述某个设计的功能或结构及与其他模块通信的外部端口。模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计数器、ALU、CPU)等,因此,一个模块可在另一个模块中调用。一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模方式。,例2.1,modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;regout;always(sloraorb)if(!sl)out=a;elseout=b;endmodule,例2.2,modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;wirensl,sela,selb;assignnsl=sl;assignsela=aendmodule,例2.3,modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;wirensl,sela,selb;notu1(nsl,sl);and#1u2(sela,a,nsl);and#1u3(selb,b,sl);or#1u4(out,sela,selb);endmodule,/*一个名为adder的三位加法器的例子。*/moduleadder(count,sum,a,b,cin);/模块定义开始input2:0a,b;/输入信号定义inputcin;/输出信号定义outputcount;/输出信号定义output2:0sum;/输出信号定义assigncount,sum=a+b+cin;/模块功能描述endmodule/模块定义结束,例2.4,例2.5比较器modulecompare(equal,a,b);outputequal;/声明输出信号equalinput1:0a,b;/声明输入信号a,b/*如果a、b两个输入信号相等,输出为1,否则为0*/assignequal=(a=b)?1:0;endmodule这个程序描述了一个比较器.在这个程序中,/*.*/和/.表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。,例2.6三态门moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);/调用由mytri模块定义的实例元件tri_instendmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?in:bz;endmodule,例2.7三态门,moduletrist2(out,in,enable);outputout;inputin,enable;bufif1mubuf(out,in,enable);/调用由门级原语实例bufif1endmodule,modulesample(q,a,b,sel,clk,resetn);/模块定义inputa,b,sel,clk,resetn;/输入信号定义outputq;/输出信号定义wirec;/模块内信号线的定义regq;/输出端子数型定义always(posedgeclkornegedgeresetn)begin/非同步复位的F/Fif(resetn=1b0)q=1b0;elseq=c;endassignc=(sel)?a:b;/选择逻辑组合endmodule,选择输出的非同步复位触发器,一个设计是由一个个模块构成的。一个模块的设计如下:1模块内容是嵌套在module和endmodule两个语句之间。每个模块实现特定的功能,模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。2每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。模块的端口定义部分:如上例:moduleaddr(a,b,cin,count,sum);其中module是模块的保留字,adddr时模块的名字,相当于器件名。()内是该模块的端口声明,定义了该模块的管脚名,是该模块与其它模块通讯的外部接口,相当于器件的pin。模块的内容,包括I/O说明,内部信号、调用模块等的声明语句和功能定义语句。,2.2.2模块的概念,I/O说明如:input2:0a;input2:0b;inputcin;outputcount;其中的input、output、input是保留字,定义了管脚信号的流向,n:0表示该信号的位宽(总线或单根信号线)。逻辑功能描述部分如:assignd_out=d_en?din:bz;Mytriu_mytri(din,d_en,d_out);功能描述用来产生各种逻辑(主要是组合逻辑和时序逻辑,可用多种方法进行描述)还可实例化一个器件,该器件可以时厂家的器件库也可以时我们自己用HDL设计的模块(相当于在原理输入时调用一个库元件)。在逻辑功能描述中,主要用到assign和always两个语句。3对每个模块都要进行端口定义,并说明输入、输出口,然后对模块的功能进行逻辑描述,当然对测试模块,可以没有输入输出口4VerilogHDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。5除了endmodule语句外,每个语句和数据定义的最后必须有分号表示语句结束。可以用/*.*/和/.对VerilogHDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。,2.2.3语言的主要特点,module(模块),module能够表示:物理块,如IC或ASIC单元逻辑块,如一个CPU设计的ALU部分整个系统每一个模块的描述从关键词module开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词endmodule结束。,module是层次化设计的基本构件,逻辑描述放在module内部,语言的主要特点模块端口(moduleports),端口在模块名字后的括号中列出,端口可以说明为input,output及inout,端口等价于硬件的引脚(pin),moduleadder(cout,sum,a,b,cin);input2:0a,b;inputcin;outputcout;output2:0sum;assigncout,sum=a+b+cin;endmodule,例设计三位全加器,这个例子描述了一个三位的加法器。从例子中可以看出整个VerilogHDL程序是嵌套在module和endmodule声明语句里的,只出现了一个assign语句。,模块名,端口列表,端口声明,数据流语句,例SR触发器模块,/SR触发器moduleSR_FF(Q,Q_n,S,R);outputQ,Q_n;/端口声明inputS,R;nandn1(Q,S,Q_n);nandn2(Q_n,R,Q);endmodule,模块中的5个部分并没全部出现,只出现在低层次模块实例化,nand为verilog中的与非门门级原语部件,D触发器模块,/D触发器moduleD_FF(d,clk,clr,q,qb);outputq,qb;inputd,clk,clr;regq,qb;/输出端口q,qb值保存always(posedgeclk)beginif(clr)Q=1b0;elseQ=d;endAssignqb=q;endmodule,该模块内包括always行为块语句,always块行为描述语句,语言的主要特点,模块实例化(moduleinstances),moduleDFF(d,clk,clr,q,qb);.endmodulemoduleREG4(d,clk,clr,q,qb);output3:0q,qb;input3:0d;inputclk,clr;DFFd0(d0,clk,clr,q0,qb0);DFFd1(d1,clk,clr,q1,qb1);DFFd2(d2,clk,clr,q2,qb2);DFFd3(d3,clk,clr,q3,qb3);endmodule,语言的主要特点,可以将模块的实例通过端口连接起来构成一个大的系统或元件。在上面的例子中,REG4有模块DFF的四个实例。注意,每个实例都有自己的名字(d0,d1,d2,d3)。实例名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。实例中端口的次序与模块定义的次序相同。模块实例化与调用程序不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。,模块实例化(moduleinstances),端口与外部信号的连接,在调用模块时,可以用顺序连接和按名连接把模块定义的端口与外部信号连接起来顺序连接:需要连接的信号需要与模块声明的端口列表一致;按名连接:端口和外部信号按名字连接在一起.,D_FFd0(d0,clk,clr,q0,qb0);D_FFd1(d1,clk,clr,q1,qb1);D_FFd2(d2,clk,clr,q2,qb2);D_FFd3(d3,clk,clr,q3,qb3);,当设计大规模系统时,端口太多,记住端口顺序不大可能,可以采用按名连接方法。,不需要连接的端口直接忽略掉即可,D_FFd0(.dd0),.clk(clk),.clr(clr),.q(q0),.qb(qb0);,D_FFd0(.d(d0),.clk(clk),.clr(clr),.q(q0);,书写语法建议,一个模块用一个文件;模块名与文件名要同名;一行一条语句。信号方向按输入、输出、双向顺序描述。设计模块时可考虑采用参数化,提供设计的重用。,2.3建模方式,模块的功能定义可以用采用下面的4种方式描述:1)数据流方式;2)行为方式;3)结构方式;4)混合描述方式。,2.3.1数据流描述方式,数据流的建模方式就是通过对数据流在设计中的具体行为的描述的来建模。最基本的机制就是用连续赋值语句。在连续赋值语句中,某个值被赋给某个线网变量(信号),语法如下:assigndelaynet_name=expression;如:assign#2A=B;用连续赋值语句“assign”,只能描述组合逻辑。无论右边的操作数何时发生变化,右边表达式都重新计算,并且在指定的时延后赋给左边线网变量。如果没有定义时延值,缺省时延为0。在数据流描述方式中,还必须借助于HDL提供的一些运算符,如按位逻辑运算符:逻辑与(inputA,B,EN;output0:3Z;wireAbar,Bbar;assign#1Abar=A;assign#1Bbar=B;。assign#2Z0=(Abarendmodule连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。如上,当A有变化时,S1、T3、T1将同时变化,S1的变化又会造成Sum的变化。,2-4解码器电路,数据流描述举例2,timescale1ns/100psmoduleFA_flow(A,B,Cin,Sum,Count)inputA,B,Cin;outputSum,Count;wireS1,T1,T2,T3;assign#2S1=AB;assign#2Sum=S1Cin;assign#2T3=AEndmodule,如上,当A有个变化时,S1、T3、T1将同时变化,S1的变化又会造成Sum的变化。,2.3.2行为描述方式,行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模,在表示方面,类似数据流的建模方式,但一般是把用initial块语句或always块语句描述的归为行为建模方式。行为建模方式通常需要借助一些行为级的运算符如加法运算符(+),减法运算符(-)等1)initial语句:此语句只执行一次。2)always语句:此语句总是循环执行,或者说重复执行。只有寄存器类型数据能够在这两种语句中被赋值。所有的initial语句和always语句在0时刻并发执行。,行为描述举例,用always语句对1位全加器电路建模moduleFA_Seq(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;regSum,Cout;regT1,T2,T3;always(AorBorCin)beginSum=(AB)Cin;T1=Aendendmodule,1位全加器电路,一位全加器的行为建模,moduleFA_behav2(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;regSum,Cout;always(AorBorCin)Count,Sum=A+B+Cin;endmodule,在本例中,采用更加高级(更趋于行为级)描述方式,即直接采用“+”来描述加法。Count,Sum表示对位数的扩展,因为两个1bit相加,和有两位,低位放在Sum变量中,进位放在Count中。,需要先建立以下概念,1、只有寄存器类型的信号才可以在always和initial语句中进行赋值,类型定义通过reg语句实现。2、always语句是一直重复执行,由敏感表(always语句括号内的变量)中的变量触发。这意味着只要A、B或Cin上发生事件,即A、B或Cin之一的值发生变化,顺序过程就执行。3、always语句从0时刻开始。4、在begin和end之间的语句是顺序执行,属于串行语句。并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always语句再次等待A、B或Cin上发生的事件。,2.3.3结构化描述方式,结构化的建模方式就是通过对电路结构的描述来建模,即通过对器件的调用(HDL概念称为例化),并使用线网来连接各器件的描述方式。这里的器件包括VerilogHDL的内置门如与门and,异或门xor等,也可以是用户的一个设计。结构化的描述方式反映了一个设计的层次结构。在VerilogHDL中可使用如下方式描述结构:1)内置门原语(在门级);2)开关级原语(在晶体管级);3)用户定义的原语(在门级);4)模块实例(创建层次结构)。,模块的结构化描述,moduleFA_Str(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;wireS1,T1,T2,T3;xorX1(S1,A,B);xorX2(Sum,S1,Cin);andA1(T3,A,B);andA2(T2,B,Cin);andA3(T1,A,Cin);orO1(Cout,T1,T2,T3);Endmodule,1位全加器电路,该实例显示了一个全加器由两个异或门、三个与门、一个或门构成。S1、T1、T2、T3则是门与门之间的连线。代码显示了用纯结构的建模方式,其中xor、and、or是VerilogHDL内置的门器件。以xorx1(S1,A,B)该例化语句为例:xor表明调用一个内置的异或门,器件名称xor,代码实例化名x1(类似原理图输入方式)。括号内的S1,A,B表明该器件管脚的实际连接线(信号)的名称,其中A、B是输入,S1是输出。其他同。,4位全加器可以使用4个1位全加器模块描述moduleFourBitFA(FA,FB,FCin,FSum,FCout);input3:0FA,FB;output3:0FSuminputFCin;inputFCout;wire1:3FTemp;FA_StrFA1(.A(FA1),.B(FB1),.Cin(FCin),.Sum(FSum1),.Cout(FTemp1);FA_StrFA2(.A(FA2),.B(FB2),.Cin(FTemp1),.Sum(FSum2),.Cout(FTemp2);FA_StrFA3(FA3,FB3,FTemp2,FSum3,FTemp3);FA_StrFA4(FA4,FB4,FTemp3,FSum4,FCout);endmodule,模块实例用于建模4位全加器。在模块实例语句中,端口可以与名称或位置关联。前两个实例FA1和FA2使用命名关联方式,也就是说,端口的名称和它连接的线网被显式描述(每一个的形式都为“.port_name(net_name))。最后两个实例语句,实例FA3和FA4使用位置关联方式将端口与线网关联。这里关联的顺序很重要,例如,在实例FA4中,第一个FA4与FA_Str的端口A连接,第二个FB4与FA_Str的端口B连接,余下的由此类推。,混合描述方式,结构的和行为的描述自由混合。模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及always语句。moduleFA_Mix(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;regCout;regT1,T2,T3;wireS1;xorX1(S1,A,B);/门实例语句。always(AorBorCin)/always语句beginT1=A/连续赋值语句endmodule,只要A或B上有事件发生,门实例语句即被执行。只要A、B或Cin上有事件发生,就执行always语句。只要S1或Cin上有事件发生,就执行连续赋值语句。,要点分析,如果用Verilog模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。“assign”语句、实例元件和“always”块描述的逻辑功能是同时执行的,也就是并发的,如果把这三项写到一个VeriIog模块文件中去,它们的次序不会影响逻辑实现的功能。在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”。两个或更多的“always”模块也是同时执行的,但是模块内部的语句是顺序执行的。,注意,在实际的设计中,往往是多种设计模型的混合。一般地,对顶层设计,采用结构描述方式,对低层模块,可采用数据流、行为级或两者的结合。如上面的4bit全加器,对顶层模块(Four_bit_FA)采用结构描述方式对低层进行例化,对低层模块(FA)可采用结构描述、数据流描述或行为级描述。,举例,写出二选一MUX功能模块的VerilogHDL的行为描述和结构描述数据流描述模块modulemux_beh(out,a,b,sel);outputout;inputa,b,sel;Assignout=(sel=0)?a:b;endmodule,行为描述模块,modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;regout;always(sloraorb)if(!sl)out=a;elseout=b;endmodule,结构描述模块,modulemux_str(out,a,b,sel);outputout;inputa,b,sel;notgate1(net1,sel);andgate2(net2,a,net1);andgate3(net3,b,sel);orgate4(out,net2,net3);endmodule,全加器的门级描述,全加器的行为级描述,2.4模块的测试,需要有测试激励信号输入到被测模块需要记录被测模块的输出信号需要把用功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合)。需要对已经转换为门级电路结构的逻辑进行测试(门级电路仿真)。需要对布局布线后的电路结构进行测试。(布局布线后仿真)。,模块的测试,1测试平台(TestBench)在输入端口加入测试信号,从输出端口检测其输出结果是否正确2通常将需要测试的对象称之为DUT(DeviceUnderTest)3测试模块要调用DUT包含用于测试的激励信号源能够实施对输出信号的检测,并报告检测的结果,测试平台,测试平台是验证对象电路的工作状态是否正确的测试用模块。测试平台的作用是对对象电路的输入信号加上测试图形,并通过观察输出信号来验证电路是否正常工作。VerilogHDL不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。,测试平台TestBench,电路仿真所需要的数据被测电路的HDL描述。测试平台的HDL描述HDL仿真器将测试平台中描述的激励信号按照所定时间提供给被测电路。对被测电路进行仿真。将仿真后被测电路产生的输出信号以部波形、数据或文字的方式表示出来。,modulet;reg;/被测模块输入/输出变量类型定义wire;/被测模块输入/输出变量类型定义initialbegin;end/产生测试信号always#delaybegin;end/产生测试信号Testedmdm(.in1(ina),.in2(inb),.out1(outa),.out2(outb);/被测模块的实例引用initialbegin.;.;.end/记录输出和响应endmodule,测试模块常见的形式:,激励和控制可用初始化语句产生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,如何描述激励和控制信号,二选一MUXMUX的测试模块,moduletest_for_mux;rega,b,s;/调用DUTmux_strmux1(out,a,b,s);/产生测试激励信号initialbegina=0;b=1;s=0;#10a=1;#10b=0;#10s=1;#10b=1;#10a=0;#10$finish;end/检测输出信号initial$monitor($time,“a=%bb=%bs=%bout=%b”,a,b,s,out);endmodule,如何观察被测模块的响应,在initial块中,用系统任务$time和$monitor$time返回当前的仿真时刻$monitor只要在其变量列表中有某一个或某几个变量值发生变化,便在仿真单位时间结束时显示其变量列表中所有变量的值。例:initialbegin$monitor($time,“out=%b,a=%b,sel=%b”,out,a,b,sel);end,时间单位末的概念,timescale1ns/1nsmoduletestfixture;/Datatypedeclarationrega,b,sel;wireout;/MUXinstanceMUX2_1mux(out,a,b,sel);/Applystimulusinitialbegina=0;b=1;sel=0;#5.7b=0;#5b=1;sel=1;#5a=1;#5$finish;end/Displayresultsinitial$monitor($time,out=%ba=%bb=%bsel=%b,out,a,b,sel);endmodule,0out=0a=0b=1sel=06out=0a=0b=0sel=011out=1a=0b=1sel=116out=1a=1b=1sel=1,结果输出,- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verilog 第二 简单 模块
装配图网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文