华侨大学IC设计中心数模混合信号集成电路设计第三讲Verilog基本概念和仿真工具使用华侨大学·电子与信息工程学院电子工程系杨骁凌朝东xiaoyanghqu@hqu.edu.cn华侨大学IC设计中心Ch.1概述2硬件描述语言HDL硬件描述语言利用计算机的巨大能力对用HDL建模的复杂数字逻辑进行仿真,然后再自动综合以生成符合要求且在电路结构上可以实现的数字逻辑网表(Netlist),根据网表和某种工艺的器件自动生成具体电路然后生成该工艺条件下这种具体电路的延时模型。仿真验证无误后用于制造ASIC芯片或写入CPLD和FPGA器件中。华侨大学IC设计中心Ch.1概述3VerilogHDLVerilogHDL是硬件描述语言的一种,用于数字电子系统设计。设计者可用它进行各种级别的逻辑设计,可用它进行数字逻辑系统的仿真验证、时序分析、逻辑综合。它是目前应用最广泛的一种硬件描述语言。VerilogHDL语言于1990年被推向公众领域,于1995年成为IEEE标准,称为IEEEStd1364-1995。VerilogHDL在2001年做了一次重要更新,对IEEEStd1364-1995进行了诸多改进,该版本称为Verilog2001。华侨大学IC设计中心Ch.1概述4Verilog基本概念模块module()module是层次化设计的基本构件逻辑描述放在module内部模块由关键词:module模块名,endmodule构成华侨大学IC设计中心Ch.1概述5Verilog基本概念模块的结构由在module和endmodule关键词之间的四个主要部分组成:1、端口定义2、端口声明3、内部信号声明4、功能定义华侨大学IC设计中心Ch.1概述6Verilog基本概念端口在模块名字后的括号中列出端口可以说明为input,output及inout端口等价于硬件的引脚(pin)注意模块的名称DFF,端口列表及说明模块通过端口与外部通信华侨大学IC设计中心Ch.1概述7Verilog基本概念模块的端口定义module模块名(口1,口2,口3,口4,………);端口声明输入端口:input[信号位宽-1:0]端口名1;input[信号位宽-1:0]端口名2;输出端口:output[信号位宽-1:0]端口名1;output[信号位宽-1:0]端口名2;输入出端口:inout[信号位宽-1:0]端口名1;inout[信号位宽-1:0]端口名2;华侨大学IC设计中心Ch.1概述8Verilog基本概念端口说明也可以写在端口声明语句里。其格式如下:modulemodule_name(inputport1,inputport2,…outputport1,outputport2…);华侨大学IC设计中心Ch.1概述9Verilog基本概念内部信号声明:在模块内用到的和与端口有关的wire和reg变量的声明。如:reg[width-1:0]R变量1,R变量2…;wire[width-1:0]W变量1,W变量2…;华侨大学IC设计中心Ch.1概述10Verilog主要有两类数据类型:wire(线网):线网类型主要表示VerilogHDL中结构化元件之间的物理连线,其数值由驱动元件决定。如果没有驱动元件接到线网上,则其默认值为高阻z。Verilog程序模块中输入输出信号类型缺省时自动定义为wire型register(寄存器):寄存器类型主要表示数据的存储单元,其默认值为不定x,寄存器只能在always语句和initial语句中赋值。二者最大的区别在于:寄存器类型数据保持最后一次的赋值,而线网类型数据则需要持续的驱动。华侨大学IC设计中心Ch.1概述11Verilog基本概念功能定义:模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。用assign语句(数据流描述):assigna=b&c;-用实例元件(结构化描述):and2and_inst(q,a,b);-用“always”块(行为描述):always@(posedgeclkorposedgeclr)beginif(clr)q=0;elseif(en)q=d;end华侨大学IC设计中心Ch.1概述12理解要点如在模块中逻辑功能由下面三个语句块组成:assigncs=(a0&~a1&~a2);//-----1and2and_inst(qout,a,b);//-----2always@(posedgeclkorposedgeclr)//-----3beginif(clr)q=0;elseif(en)q=d;end三条语句是并行的,它们产生独立的逻辑电路;而在always块中:begin与end之间是顺序执行的。华侨大学IC设计中心Ch.1概述13举例moduleMUX2_1(out,a,b,sel);//Portdeclarationsoutputout;inputa,b,sel;wireout,a,b,sel;wiresel_,a1,b1;//Thenetlistnot(sel_,sel);and(a1,a,sel_);and(b1,b,sel);or(out,a1,b1);endmodule注释行已定义的Verilog基本单元的实例a,b,sel是输入端口,out是输出端口。所有信号通过这些端口从模块输入/输出。另一个模块可以通过模块名及端口说明使用多路器。实例化多路器时不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是门级,但并不影响高层次模块对它的使用。多路器由关键词module和endmodule开始及结束。华侨大学IC设计中心Ch.1概述14Verilog主要有两类数据类型:wire(线网):线网类型主要表示VerilogHDL中结构化元件之间的物理连线,其数值由驱动元件决定。如果没有驱动元件接到线网上,则其默认值为高阻z。Verilog程序模块中输入输出信号类型缺省时自动定义为wire型register(寄存器):寄存器类型主要表示数据的存储单元,其默认值为不定x,寄存器只能在always语句和initial语句中赋值。二者最大的区别在于:寄存器类型数据保持最后一次的赋值,而线网类型数据则需要持续的驱动。华侨大学IC设计中心Ch.1概述15如何选择正确的数据类型?输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输出口(output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输入/输出口(inout)只可以由网络连接驱动,它本身也只能驱动网络连接。如果信号变量是在过程块(initial块或always块)中被赋值的,必须把它声明为寄存器类型变量华侨大学IC设计中心Ch.1概述16选择正确的数据类型moduletop;wirey;rega,b;DUTu1(y,a,b);initialbegina=0;b=0;#5a=1;endendmodulemoduleDUT(Y,A,B);outputY;inputA,B;wireY,A,B;and(Y,A,B);endmodule输入端口可以由net/register驱动,但输入端口只能是net输出端口可以是net/register类型,输出端口只能驱动net在过程块中只能给register类型赋值若Y,A,B说明为reg则会产生错误。in1in2OABY双向端口输入/输出只能是net类型华侨大学IC设计中心Ch.1概述17选择数据类型时常犯的错误举例修改前:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;regc,d;rego2andu1(o2,c,d);always@(aorb)if(a)o1=b;elseo1=0;endmodule修改后:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;//regc,d;//rego2rego1;andu1(o2,c,d);always@(aorb)if(a)o1=b;elseo1=0;endmoduleexample.v华侨大学IC设计中心Ch.1概述18选择数据类型时常犯的错误举例Compilingsourcefileexample.vError!Illegalleft-hand-sideassignment[Verilog-ILHSA]example.v,11:o1=b;Error!Illegalleft-hand-sideassignment[Verilog-ILHSA]example.v,12:o1=0;2errors第一次编译信息verilog–cexample.v第二次编译信息Compilingsourcefileexample.vError!Incompatibledeclaration,(c)definedasinputatline2[Verilog-IDDIL]example.v,5:Error!Incompatibledeclaration,(d)definedasinputatline2[Verilog-IDDIL]example.v,5:Error!Gate(u1)hasillegaloutputspecification[Verilog-GHIOS]example.v,8:3errors华侨大学IC设计中心Ch.1概述19一个完整的简单例子testbench被测试器件DUT是一个二选一多路器。测试装置(testbench)提供测试激励及验证机制。Testbench使用行为级描述,DUT采用门级描述。下面将给出Testbench的描述、DUT的描述及如何进行混合仿真。华侨大学IC设计中心Ch.1概述20被测器件(deviceundertest)moduleMUX2_1(out,a,b,sel);//Portdeclarationsoutputout;inputa,b,sel;wireout,a,b,sel;wiresel_,a1,b1;//Thenetlistnot(sel_,sel);and(a1,a,sel_);and(b1,b,sel);or(out,a1,b1);endmodule注释行已定义的Verilog基本单元的实例多路器由关键词module和endmodule开始及结束。华侨大学IC设计中心Ch.1概述21Testbench模板moduletestbench;//Datatypedeclaration//Instantiatemodules//Applystimulus//Displayresultsendmodule为什么没有端口?由于testbench是最顶层模块,不会被其它模块实例化。因此不需要有端口。华侨大学IC设计中心Ch.1概述22MUX的实例化语句包括:•模块名字:与引用模块相同•实例名字:任意,但要符合标记命名规则•端口列表:有两种方法,(1)采用位置关联,即端口列表与引用模块的次序相同;(2)采用名字关联,用”.”来关联。TestBench—如何说明实例moduletestbench;//Datatypedeclaration//InstantiatemodulesMUX2_1mux(out,a,b,sel);//Applystimulus//Displayresultsendmodule多路器实例化语句华侨大学IC设计中心Ch.1概述23MUX的实例化语句包括:•模块名字:与引用模块相同•实例名字:任意,但要符合标记命名规则•端口列表:有两种方法,(1)采用位置关联,即端口列表与引用模块的次序相同;(2)采用名字关联,用”.”来关联。TestBench—如何说明实例moduletestbench;//Datatypedeclaration//InstantiatemodulesMUX2_1mux(.a(c),.b(d),.sel(e),.out(f));//Applystimulus//Di