资源描述
第二讲 Verilog语法的基本概念主要内容 Verilog 建模概述模块的基本概念模块的基本概念 简单示例简单示例 模块特点模块特点 模块结构模块结构 模块语法模块语法三种建模方式三种建模方式模块的测试模块的测试有关有关Verilog HDLVerilog HDL的几个重要基本概念的几个重要基本概念Verilog HDL是一种用于数字逻辑电路设计的语言:-用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。-Verilog HDL 既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:2.1 Verilog的建模概述Verilog的建模级别1 系统级(system):用高级语言结构实现设计模块的外部性能的模型.2 算法级(algorithmic):用高级语言结构实现设计算法的模型,不包含时序信息。3 RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何控制这些数据的模型。4 门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。5 开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。算法级是高级的建模,一般对特大型设计或有较复杂的算法时使用,特别是通讯方面的一些系统,通过算法级的建模来保证设计的系统性能,在算法级通过后,再把算法级用RTL级进行描述,门级一般对小型设计时使用。开关级一般在版图级进行。可综合的可综合的可综合的可综合的 Verilog HDL Verilog HDL Verilog HDL Verilog HDL 模型模型模型模型算法级算法级算法级算法级算法级算法级 (Algorithm Level)(Algorithm Level)(Algorithm Level)-部分可综合部分可综合部分可综合部分可综合部分可综合部分可综合寄存器传输级寄存器传输级寄存器传输级寄存器传输级寄存器传输级寄存器传输级(Register Transfer Level)(Register Transfer Level)(Register Transfer Level)-完全可综合完全可综合完全可综合完全可综合完全可综合完全可综合门级门级门级门级门级门级 (Gate Level)(Gate Level)(Gate Level)-完全可综合完全可综合完全可综合完全可综合完全可综合完全可综合开关级(开关级(开关级(开关级(开关级(开关级(Switch LevelSwitch LevelSwitch Level)-用于基本逻辑器件仿真模型的建库用于基本逻辑器件仿真模型的建库用于基本逻辑器件仿真模型的建库用于基本逻辑器件仿真模型的建库用于基本逻辑器件仿真模型的建库用于基本逻辑器件仿真模型的建库Verilog的功能1 1 可描述顺序执行或并行执行的程序结构。可描述顺序执行或并行执行的程序结构。2 2 用延迟表达式或事件表达式来明确地控制过程的启动时间。用延迟表达式或事件表达式来明确地控制过程的启动时间。3 3 通过命名的事件来触发其它过程里的激活行为或停止行为。通过命名的事件来触发其它过程里的激活行为或停止行为。4 4 提供了条件、提供了条件、if-elseif-else、casecase、循环程序结构。、循环程序结构。5 5 提供了可带参数且非零延续时间的任务提供了可带参数且非零延续时间的任务(task)(task)程序结构。程序结构。6 6 提供了可定义新的操作符的函数结构提供了可定义新的操作符的函数结构(function)(function)。7 提供了用于建立表达式的算术运算符、逻辑运算符、位运算提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。符。8 Verilog HDL语言作为一种结构化的语言也非常适合于门级语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。和开关级的模型设计。2.2 2.2 模块的基本概念模块的基本概念 模块(module)是Verilog 的基本描述单位,用于描述某个设计的功能或结构及与其他模块通信的外部端口。模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计数器、ALU、CPU)等,因此,一个模块可在另一个模块中调用。一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模方式。例2.1 二选一多路选择器(RTL级)module muxtwo(out,a,b,sl);input a,b,sl;output out;reg out;always (sl or a or b)if(!sl)out=a;elseout=b;endmodule例2.2二选一多路选择器(RTL级)module muxtwo(out,a,b,sl);input a,b,sl;output out;wire nsl,sela,selb;assign nsl=sl;assign sela=a&nsl;assign selb=b&nsl;assign out=sela|selb;endmodule例2.3二选一多路选择器(门级)module muxtwo(out,a,b,sl);input a,b,sl;output out;wire nsl,sela,selb;not u1(nsl,sl);and#1 u2(sela,a,nsl);and#1 u3(selb,b,sl);or#1 u4(out,sela,selb);endmodule/*一个名为一个名为adder的三位加法器的例子。的三位加法器的例子。*/module adder(count,sum,a,b,cin);/模块定义开始模块定义开始 input 2:0 a,b;/输入信号定义输入信号定义 input cin;/输出信号定义输出信号定义 output count;/输出信号定义输出信号定义 output 2:0 sum;/输出信号定义输出信号定义 assign count,sum=a+b+cin;/模块功能描述模块功能描述endmodule /模块定义结束模块定义结束例2.4 三位加法器例例2.52.5比较器比较器module compare(equal,a,b);output equal;/声明输出信号声明输出信号equal input 1:0 a,b;/声明输入信号声明输入信号a,b /*如果如果a、b 两个输入信号相等两个输入信号相等,输出为输出为1,否则,否则为为0*/assign equal=(a=b)?)?1:0;endmodule 这个程序描述了一个比较器这个程序描述了一个比较器.在这个程序中在这个程序中,/*.*/,/*.*/和和/./.表示注释部分表示注释部分,注注释只是为了方便程序员理解程序释只是为了方便程序员理解程序,对编译是不起对编译是不起作用的。作用的。例例2.6 三态门三态门module trist1(out,in,enable);output out;input in,enable;mytri tri_inst(out,in,enable);/调用由调用由mytri模块定义的模块定义的 实实例例 元件元件tri_instendmodulemodule mytri(out,in,enable);output out;input in,enable;assign out=enable?in:bz;endmodule例2.7 三态门module trist2(out,in,enable);output out;input in,enable;bufif1 mubuf(out,in,enable);/调用调用由门级原语实例由门级原语实例 bufif1endmodulemodule module sample(q,a,b,sel,clk,resetn);sample(q,a,b,sel,clk,resetn);/模块定义模块定义inputinputa,b,sel,clk,resetn;a,b,sel,clk,resetn;/输入信号定义输入信号定义outputoutput q;q;/输出信号定义输出信号定义wirewire c;c;/模块内信号线的定义模块内信号线的定义regreg q;q;/输出端子数型定义输出端子数型定义always always(posedgeposedge clk or clk or negedgenegedge resetn)resetn)begin begin /非同步复位的非同步复位的F/F if if(resetn=1b0)(resetn=1b0)q=1b0;q=1b0;elseelse q=c;q=c;end endassignassignc=(sel)?a:b;c=(sel)?a:b;/选择逻辑组合选择逻辑组合endmoduleendmodule选择输出的非同步复位触发器一个设计是由一个个模块构成的。一个模块的设计如下:1 模块内容是嵌套在module和endmodule两个语句之间。每个模块实现特定的功能,模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。2 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。模块的端口定义部分:如上例:module addr(a,b,cin,count,sum);其中module是模块的保留字,adddr时模块的名字,相当于器件名。()内是该模块的端口声明,定义了该模块的管脚名,是该模块与其它模块通讯的外部接口,相当于器件的pin。模块的内容,包括I/O说明,内部信号、调用模块等的声明 语句和功能定义语句。2.2.2 模块的概念 I/O说明如:input2:0a;input2:0b;input cin;output count;其中的input、output、input是保留字,定义了管脚信号的流向,n:0表示该信号的位宽(总线或单根信号线)。逻辑功能描述部分如:assign d_out=d_en?din:bz;Mytri u_mytri(din,d_en,d_out);功能描述用来产生各种逻辑(主要是组合逻辑和时序逻辑,可用多种方法进行描述)还可实例化一个器件,该器件可以时厂家的器件库也可以时我们自己用HDL设计的模块(相当于在原理输入时调用一个库元件)。在逻辑功能描述中,主要用到assign和always两个语句。3 对每个模块都要进行端口定义,并说明输入、输出口,然后对模块的功能进行逻辑描述,当然对测试模块,可以没有输入输出口4 Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。5 除了endmodule语句外,每个语句和数据定义的最后必须有分号表示语句结束。可以用/*.*/和/.对Verilog HDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。2.2.3语言的主要特点语言的主要特点module(模块模块)module能够表示:能够表示:物理块,如物理块,如IC或或ASIC单元单元逻辑块,如一个逻辑块,如一个CPU设计的设计的ALU部分部分整个系统整个系统每一个模块的描述从关键词每一个模块的描述从关键词module开始,有一个开始,有一个名称名称(如(如SN74LS74,DFF,ALU等等),由关键词等等),由关键词endmodule结束结束。module是层是层次化设计的基次化设计的基本构件本构件逻辑描述放在逻辑描述放在module内部内部语言的主要特点语言的主要特点模块端口模块端口(module ports)端口在模块名字端口在模块名字后的括号中列出后的括号中列出端口可以说明为端口可以说明为input,output及及inout端口等价于硬件端口等价于硬件的引脚的引脚(pin)module adder(cout,sum,a,b,cin);input 2:0 a,b;input cin;output cout;output 2:0 sum;assign cout,sum=a+b+cin;endmodule例设计三位全加器例设计三位全加器这个例子描述了一个三位的加法器。从例子中可以看出整个这个例子描述了一个三位的加法器。从例子中可以看出整个Verilog HDL程序是嵌套在程序是嵌套在module和和endmodule声明语句里声明语句里的,只出现了一个的,只出现了一个assign语句。语句。adderaddersum2:0a2:0a2:0b2:0b2:0cincincoutcout模块名模块名端口列表端口列表端口声明端口声明数据流语句数据流语句例例SR触发器模块触发器模块/SR 触发器触发器module SR_FF(Q,Q_n,S,R);output Q,Q_n;/端口声明端口声明input S,R;nand n1(Q,S,Q_n);nand n2(Q_n,R,Q);endmodule模块中的模块中的5个部分并没全部出现,只出现在个部分并没全部出现,只出现在低层次模块实例化低层次模块实例化nand为为verilog中的与非门门级中的与非门门级原语部件原语部件D D触发器模块触发器模块触发器模块触发器模块/D 触发器触发器module D_FF(d,clk,clr,q,qb);output q,qb;input d,clk,clr;reg q,qb;/输出端口输出端口q,qb值保存值保存always(posedge clk)beginif(clr)q=1b0;elseq=d;endAssign qb=q;endmodule 该模块内包括该模块内包括always行为块语句行为块语句always块行为描述语句块行为描述语句语言的主要特点语言的主要特点模块实例化模块实例化(module instances)module DFF(d,clk,clr,q,qb);.endmodulemodule REG4(d,clk,clr,q,qb);output 3:0 q,qb;input 3:0 d;input clk,clr;DFF d0(d 0,clk,clr,q 0,qb 0);DFF d1(d 1,clk,clr,q 1,qb 1);DFF d2(d 2,clk,clr,q 2,qb 2);DFF d3(d 3,clk,clr,q 3,qb 3);endmodule语言的主要特点语言的主要特点可以将模块的实例通过端口连接起来构成一个大的系统或元件。可以将模块的实例通过端口连接起来构成一个大的系统或元件。在上面的例子中,在上面的例子中,REG4有模块有模块DFF的四个实例。注意,每个的四个实例。注意,每个实例都有自己的名字实例都有自己的名字(d0,d1,d2,d3)。实例名是每个对象。实例名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。唯一的标记,通过这个标记可以查看每个实例的内部。实例中端口的次序与模块定义的次序相同。实例中端口的次序与模块定义的次序相同。模块实例化与调用程序不同。每个实例都是模块的一个完全的模块实例化与调用程序不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。拷贝,相互独立、并行。模块实例化模块实例化(module instances)端口与外部信号的连接端口与外部信号的连接在调用模块时,可以用在调用模块时,可以用顺序连接顺序连接和和按名连接按名连接把模块定义的端口把模块定义的端口与外部信号连接起来与外部信号连接起来顺序连接:需要连接的顺序连接:需要连接的信号信号需要与模块声明的端口列需要与模块声明的端口列表一致;表一致;按名连接:端口和外部信号按名字连接在一起按名连接:端口和外部信号按名字连接在一起.D_FF d0(d 0,clk,clr,q 0,qb 0);D_FF d1(d 1,clk,clr,q 1,qb 1);D_FF d2(d 2,clk,clr,q 2,qb 2);D_FF d3(d 3,clk,clr,q 3,qb 3);当设计大规模系统时,端口太多,记住端口顺序不大可能,当设计大规模系统时,端口太多,记住端口顺序不大可能,可以采用按名连接方法。可以采用按名连接方法。不需要连接的端口直接忽略掉即可不需要连接的端口直接忽略掉即可D_FF d0(.d d 0),.clk(clk),.clr(clr),.q(q 0),.qb(qb 0);D_FF d0(.d(d 0),.clk(clk),.clr(clr),.q(q 0);书写语法建议一个模块用一个文件;模块名与文件名要同名;一行一条语句。信号方向按输入、输出、双向顺序描述。设计模块时可考虑采用参数化,提供设计的重用。2.3 建模方式模块的功能定义可以用采用下面的模块的功能定义可以用采用下面的4种方式描述:种方式描述:1)数据流方式数据流方式;2)行为方式行为方式;3)结构方式结构方式;4)混合描述方式。混合描述方式。2.3.1数据流描述方式数据流描述方式 数据流的建模方式就是通过对数据流在设计中的具体行为的描述的来建模。最基本的机制就是用连续赋值语句。在连续赋值语句中,某个值被赋给某个线网变量(信号),语法如下:assign delay net_name=expression;如:assign#2 A=B;用连续赋值语句用连续赋值语句“assign”,只能描述组合逻辑。,只能描述组合逻辑。无论右边的操作数何时发生变化,右边表达式都重新计算,并且在指定的时延后赋给左边线网变量。如果没有定义时延值,缺省时延为0。在数据流描述方式中,还必须借助于HDL提供的一些运算符,如按位逻辑运算符:逻辑与(&),逻辑或(|)等。数据流描述举例1timescale 1ns/1nsmodule Decoder2x4(A,B,EN,Z);input A,B,EN;output 0:3 Z;wire Abar,Bbar;assign#1 Abar=A;assign#1 Bbar=B;。assign#2 Z0=(Abar&Bbar&EN);assign#2 Z1=(Abar&B&EN);assign#2 Z2=(A&Bbar&EN);assign#2 Z3=(A&B&EN);endmodule连续赋值语句是连续赋值语句是并发执行并发执行的,也就是说各语句的执行顺序与其在描述中的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。如上,当出现的顺序无关。如上,当A有变化时,有变化时,S1、T3、T1 将同时变化,将同时变化,S1的的变化又会造成变化又会造成Sum的变化。的变化。2-4解码器电路数据流描述举例2timescale 1ns/100psmodule FA_flow(A,B,Cin,Sum,Count)input A,B,Cin;output Sum,Count;wire S1,T1,T2,T3;assign#2 S1=A B;assign#2 Sum=S1 Cin;assign#2 T3=A&B;assign#2 T1=A&Cin;assign#2 T2=B&Cin;Endmodule如上,当A有个变化时,S1、T3、T1 将同时变化,S1的变化又会造成Sum的变化。2.3.2 行为描述方式行为描述方式 行为方式的建模是指采用对信号行为级的描述(不是结构级行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模,的描述)的方法来建模,在表示方面,类似数据流的建模方式,但一般是把用initial 块语句或always 块语句描述的归为行为建模方式。行为建模方式通常需要借助一些行为级的运算符如加法运算符(+),减法运算符(-)等1)initial语句:此语句只执行一次。语句:此语句只执行一次。2)always语句:此语句总是循环执行语句:此语句总是循环执行,或者说重复执行。或者说重复执行。只有寄存器类型数据能够在这两种语句中被赋值。只有寄存器类型数据能够在这两种语句中被赋值。所有的所有的initial语句和语句和always语句在语句在0时刻并发执行。时刻并发执行。行为描述举例用用always语句对语句对1位全加器电路建模位全加器电路建模module FA_Seq(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;reg Sum,Cout;reg T1,T2,T3;always (A or B or Cin)beginSum=(A B)Cin;T1=A&Cin;T2=B&Cin;T3=A&B;Cout=(T1|T2)|T3;endendmodule1位全加器电路一位全加器的行为建模module FA_behav2(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;reg Sum,Cout;always(A or B or Cin)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概念称为例化),并使用线网来连接各器件的描述方式。这里的器件包括Verilog HDL的内置门如与门and,异或门xor等,也可以是用户的一个设计。结构化的描述方式反映了一个设计的层次结构。在Verilog HDL中可使用如下方式描述结构:1)内置门原语内置门原语(在门级在门级);2)开关级原语(在晶体管级);3)用户定义的原语(在门级);4)模块实例模块实例(创建层次结构创建层次结构)。模块的结构化描述module FA_Str(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;wire S1,T1,T2,T3;xor X1(S1,A,B);xor X2(Sum,S1,Cin);and A1(T3,A,B);and A2(T2,B,Cin);and A3(T1,A,Cin);or O1(Cout,T1,T2,T3);Endmodule1位全加器电路该实例显示了一个全加器由两个异或门、三个与门、一个或门构成。S1、T1、T2、T3则是门与门之间的连线。代码显示了用纯结构的建模方式,其中xor、and、or 是Verilog HDL 内置的门器件。以 xor x1(S1,A,B)该例化语句为例:xor 表明调用一个内置的异或门,器件名称xor,代码实例化名x1(类似原理图输入方式)。括号内的S1,A,B 表明该器件管脚的实际连接线(信号)的名称,其中 A、B是输入,S1是输出。其他同。4位全加器可以使用位全加器可以使用4个个1位全加器模块描述位全加器模块描述module FourBitFA(FA,FB,FCin,FSum,FCout);input 3:0 FA,FB;output 3:0 FSuminput FCin;input FCout;wire 1:3 FTemp;FA_Str FA1(.A(FA1),.B(FB1),.Cin(FCin),.Sum(FSum1),.Cout(FTemp1);FA_Str FA2(.A(FA2),.B(FB2),.Cin(FTemp1),.Sum(FSum2),.Cout(FTemp2);FA_Str FA3(FA3,FB3,FTemp2,FSum3,FTemp3);FA_Str FA4(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语句。语句。module FA_Mix(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;reg Cout;reg T1,T2,T3;wire S1;xor X1(S1,A,B);/门实例语句。门实例语句。always (A or B or Cin)/always语句语句begin T1=A&Cin;T2=B&Cin;T3=A&B;Cout=(T1|T2)|T3;end assign Sum=S1 Cin;/连续赋值语句连续赋值语句endmodule只要只要A或或B上有事件发生,门实上有事件发生,门实例语句即被执行。例语句即被执行。只要只要A、B或或Cin上有事件发生,上有事件发生,就执行就执行always 语句。语句。只要只要S1或或Cin上有事件发生,就上有事件发生,就执行连续赋值语句。执行连续赋值语句。要点分析要点分析如果用如果用Verilog模块实现一定的功能,首先应该清楚模块实现一定的功能,首先应该清楚哪些是同哪些是同时发生的时发生的,哪些是顺序发生的哪些是顺序发生的。“assign”语句语句、实例元件实例元件和和“always”块块描述的逻辑描述的逻辑功能是同时执行的,也就是功能是同时执行的,也就是并发并发的,如果把这三项写的,如果把这三项写到一个到一个 VeriIog 模块文件中去,它们的次序不会影响逻模块文件中去,它们的次序不会影响逻辑实现的功能。辑实现的功能。在在“always”模块内,逻辑是按照指定的模块内,逻辑是按照指定的顺序执行顺序执行的。的。“always”块中的语句称为块中的语句称为“顺序语句顺序语句”。两个或更多的两个或更多的“always”模块也是同时执行的,但是模模块也是同时执行的,但是模块内部的语句是顺序执行的。块内部的语句是顺序执行的。注意 在实际的设计中,往往是多种设计模型的混合。一般地,对顶层设计,采用结构描述方式,对低层模块,可采用数据流、行为级或两者的结合。如上面的4bit 全加器,对顶层模块(Four_bit_FA)采用结构描述方式对低层进行例化,对低层模块(FA)可采用结构描述、数据流描述或行为级描述。举例写出二选一MUX功能模块的Verilog HDL的行为描述和结构描述数据流描述模块module mux_beh(out,a,b,sel);output out;inputa,b,sel;Assign out=(sel=0)?a:b;endmodule行为描述模块module muxtwo(out,a,b,sl);input a,b,sl;output out;reg out;always (sl or a or b)if(!sl)out=a;elseout=b;endmodule结构描述模块module mux_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 2.4 模块模块的的测试测试需要有测试激励信号输入到被测模块需要记录被测模块的输出信号需要把用功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合)。需要对已经转换为门级电路结构的逻辑 进行测试(门级电路仿真)。需要对布局布线后的电路结构进行测试。(布局布线后仿真)。模块的测试1测试平台(Test Bench)描述测试信号的变化和测试过程的模块叫测试平台我们可以通过观测被测模块的输出信号是否符号要求来验证逻辑系统的设计和结构是否正确,发现问题可及时修改2通常将需要测试的对象称之为DUT(Device Under Test)3 测试模块要调用DUT包含用于测试的激励信号源能够实施对输出信号的检测,并报告检测的结果测试平台测试平台测试平台是验证对象电路的工作状态是否正确的测试用模块。是验证对象电路的工作状态是否正确的测试用模块。测试平台的作用是对对象电路的输入信号加上测试平台的作用是对对象电路的输入信号加上测试图形测试图形,并通过,并通过观察输出信号观察输出信号来验证电路是否正常工作。来验证电路是否正常工作。Verilog HDL不仅提供描述设计的能力,而且提供对激励、控制、不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。存储响应和设计验证的建模能力。被测模块被测模块激激励励和和控控制制信号信号输输 出出 响响 应应和验证和验证测试平台Test Bench电路仿真所需要的数据电路仿真所需要的数据 被测电路的被测电路的HDL描述描述。测试平台的测试平台的HDL描述描述 HDL仿真器仿真器将测试平台中描述的激励信号按照所定时间提供给将测试平台中描述的激励信号按照所定时间提供给被测电路。被测电路。对被测电路进行仿真。对被测电路进行仿真。将仿真后被测电路产生的输出信号以部波形、数据将仿真后被测电路产生的输出信号以部波形、数据或文字的方式表示出来。或文字的方式表示出来。module t;reg;/被测模块输入/输出变量类型定义wire;/被测模块输入/输出变量类型定义initial begin;end /产生测试信号always#delay begin;end /产生测试信号Testedmd m(.in1(ina),.in2(inb),.out1(outa),.out2(outb);/被测模块的实例引用initial begin.;.;.end /记录输出和响应endmodule测试模块常见的形式:激励和控制可用初始化语句产生激励和控制可用初始化语句产生module t;module t;reg a,b,sel;wire out;/引用多路器实例 mux2_m(out,a,b,sel);/加入激励信号initial begin a=0;b=1;sel=0;#10 b=0;#10 b=1;sel=1;#10 a=1;#10$stop;end如何描述激励和控制信号如何描述激励和控制信号二选一MUX MUX的测试模块module test_for_mux;reg a,b,s;/调用DUTmux_strmux1(out,a,b,s);/产生测试激励信号initialbegina=0;b=1;s=0;#10 a=1;#10 b=0;#10 s=1;#10 b=1;#10 a=0;#10$finish;end/检测输出信号initial$monitor($time,“a=%b b=%b s=%b out=%b”,a,b,s,out);endmodule如何观察被测模块的响应如何观察被测模块的响应 在initial 块中,用系统任务$time 和$monitor$time 返回当前的仿真时刻$monitor 只要在其变量列表中有某一个或某几个变 量值发生变化,便在仿真单位时间结束时显示其变量列表中所有变量的值。例:例:initial begin$monitor($time,“out=%b,a=%b,sel=%b”,out,a,b,sel);end
展开阅读全文