资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数字集成电路设计入门,-,从,HDL,到版图,于敦山,北大微电子学系,第四章 设计举例,进一步学习,Verilog,的结构描述和行为描述,Verilog,混合(抽象)级仿真,学习目标:,语言的主要特点,module(,模块,),module,能够表示:,物理块,如,IC,或,ASIC,单元,逻辑块,如一个,CPU,设计的,ALU,部分,整个系统,每一个模块的描述从关键词,module,开始,有一个,名称,(如,SN74LS74,,,DFF,,,ALU,等等),由关键词,endmodule,结束。,module,是层次化设计的基本构件,逻辑描述放在,module,内部,语言的主要特点,模块端口,(module ports),端口在模块名字后的括号中列出,端口可以说明为,input,output,及,inout,端口等价于硬件的引脚,(pin),注意模块的名称,DFF,,端口列表及说明,模块通过端口与外部通信,语言的主要特点,模块实例化,(module instances),module DFF(d,clk,clr,q,qb);,.,endmodule,module,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),一个完整的简单例子,test fixture,被测试器件,DUT,是一个二选一多路器。测试装置,(test fixture),提供测试激励及验证机制。,Test fixture,使用行为级描述,,DUT,采用门级描述。下面将给出,Test fixture,的描述、,DUT,的描述及如何进行混合仿真。,DUT,被测器件,(device under test),module MUX2_1(out,a,b,sel);,/Port declarations,output out;,input a,b,sel;,wire out,a,b,sel;,wire sel_,a1,b1;,/The netlist,not(sel_,sel);,and(a1,a,sel_);,and(b1,b,sel);,or(out,a1,b1);,endmodule,注释行,已定义的,Verilog,基本单元的实例,a,b,sel,是输入端口,,out,是输出端口。所有信号通过这些端口从模块输入,/,输出。,另一个模块可以通过模块名及端口说明使用多路器。实例化多路器时不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是门级,但并不影响高层次模块对它的使用。,多路器由关键词,module,和,endmodule,开始及结束。,Test Fixture,template,module testfixture;,/Data type declaration,/Instantiate modules,/Apply stimulus,/Display results,endmodule,为什么没,有端口?,由于,testfixture,是最顶层模块,不会被其它模块实例化。因此不需要有端口。,Test Fixture,如何说明实例,module testfixture;,/Data type declaration,/Instantiate modules,MUX2_1 mux(out,a,b,sel);,/Apply stimulus,/Display results,endmodule,多路器实例化语句,MUX,的实例化语句包括:,模块名字:与引用模块相同,实例名字:任意,但要符合标记命名规则,端口列表:与引用模块的次序相同,Test Fixture,过程,(procedural block),所有过程在时间,0,执行一次,过程之间是并行执行的,过程语句有两种:,initial,:只执行一次,always,:循环执行,Test Fixture,过程,(procedural block),通常采用过程语句进行行为级描述。,test fixture,的激励信号在一个过程语句中描述。,过程语句的活动与执行是有差别的,所有过程在时间,0,处于活动状态,并根据用户定义的条件等待执行;,所有过程并行执行,以描述硬件内在的并行性;,Test fixture,激励描述,module testfixture;,/Data type declaration,reg a,b,sel;,wire out;,/MUX instance,MUX2_1 mux(out,a,b,sel);,/Apply stimulus,initial,begin,a=0;b=1;sel=0;,#5 b=0;,#5 b=1;sel=1;,#5 a=1;,#5$finish;,end,/Display results,endmodule,Time Values,a b sel,0 0 1 0,5 0 0 0,10 0 1 1,15 1 1 1,例子中,,a,b,sel,说明为,reg,类数据。,reg,类数据是寄存器类数据信号,在重新赋值前一直保持当前数据。,#5,用于指示等待,5,个时间单位。,$,finish,是结束仿真的系统任务。,Test Fixture,响应产生,$time,系统函数,给出当前仿真时间,$monitor,系统任务,若参数列表中的参数值发生变化,则在时间单位末显示参数值。,$monitor(“format_specifiers”,);,例如:,$monitor($time,o,in1,in2);,$monitor($time,out,a,b,sel);,$monitor($time,“%b%h%d%o”,sig1,sig2,sig3,sig4);,Verilog,提供了一些系统任务和系统函数,包括:,注意不能有空格,Test Fixture,响应产生,$time,是一个系统函数,返回当前返回仿真时间。时间用,64,位整数表示。,$monitor,在,时间单位,末,若参数列表中的参数值发生变化则显示所列参数的值。由,$time,引起的变化不会显示。,$monitor,系统任务支持不同的数基。缺省数基是十进制。支持的数基还有二进制、八进制、十进制。,完整的,Test Fixture,module testfixture;,/Data type declaration,reg a,b,sel;,wire out;,/MUX instance,MUX2_1 mux(out,a,b,sel);,/Apply stimulus,initial begin,a=0;b=1;sel=0;,#5 b=0;#5 b=1;sel=1;,#5 a=1;,#5$finish;,end,/Display results,initial,$monitor($time,out=%b a=%b b=%b sel=%b,out,a,b,sel);,endmodule,0 out=0 a=0 b=1 sel=0,5 out=0 a=0 b=0 sel=0,10 out=1 a=0 b=1 sel=1,15 out=1 a=1 b=1 sel=1,结果输出,时间单位末的概念,timescale 1ns/1ns,module testfixture;,/Data type declaration,reg a,b,sel;,wire out;,/MUX instance,MUX2_1 mux(out,a,b,sel);,/Apply stimulus,initial begin,a=0;b=1;sel=0;,#5.7,b=0;#5 b=1;sel=1;,#5 a=1;#5$finish;,end,/Display results,initial,$monitor($time,out=%b a=%b b=%b sel=%b,out,a,b,sel);,endmodule,0 out=0 a=0 b=1 sel=0,6,out=0 a=0 b=0 sel=0,11,out=1 a=0 b=1 sel=1,16,out=1 a=1 b=1 sel=1,结果输出,VCD,数据库,Verilog,提供一系列系统任务用于记录信号值变化保存到标准的,VCD(Value Change Dump),格式数据库中。大多数波形显示工具支持,VCD,格式。,系统任务,功能,$dumpfile(file.dump);,$dumpvars();,$dumpflush;,$dumpoff;,$dumpon;,$dumplimit();,$dumpall;,打开一个,VCD,数据库用于记录,选择要记录的信号,将,VCD,数据保存到磁盘,停止记录,重新开始记录,限制,VCD,文件的大小,(,以字节为单位),记录所有指定的信号值,VCD,数据库,用户可以用,$dump*,系统任务打开一个数据库,保存信号并控制信号的保存。除,$dumpvars,外,其它任务的作用都比较直观。,$dumpvars,将在后面详细描述,。,必须首先使用,$dumpfile,系统任务,并且在一次仿真中只能打开一个,VCD,数据库。,在仿真前,(,时间,0,前,),必须先指定要观测的波形,这样才能看到信号完整的变化过程。,仿真时定期的将数据保存到磁盘是一个好的习惯,万一系统出现问题数据也不会全部丢失。,VCD,数据库不记录仿真结束时的数据。因此如果希望看到最后一次数据变化后的波形,必须在结束仿真前使用,$dumpall,。,VCD,数据库是仿真过程中数据信号变化的记录。它只记录用户指定的信号。,$dumpvars,$dumpvars(,*);,scope,可以是层次中的信号,实例或模块。,仿真时所有信号必须在同一时间下使用,$dumpvars,。,就是说可以使用多条,$dumpvars,语句,但必须从,同一时间,开始。如:,initial begin,$dumpfile(“verilog.dump”);,$dumpvars(0,testfixture.a);,#1$dumpvars(0,testfixture.b);,end,$dumpvars,语法:,此语句将引起一个警告信息并被忽略,$dumpvars,$dumpvars;/Dump,所有层次的信号,$dumpvars(1,top);/Dump top,模块中的所有信号,$dumpvars(2,top.u1);/Dump,实例,top.u1,及其下,一,层的信号,$dumpvars(0,top.u2,top.u1.u13.q);/Dump top.u2,及其以下所有信号,以及信号,top.u1.u13.q,。,$dumpvars(3,top.u2,top.u1);/Dump top.u1,和,top.u2,及其下两层中的所有信号。,用下面的代码可以代替前面,test fixture,的,$monitor,命令,:,initial,begin,$dumpfile(“verilog.dump”);,$dumpvars(0,testfixtur
展开阅读全文