仿真验证与TESTBENCH编写课件

上传人:29 文档编号:242763230 上传时间:2024-09-03 格式:PPT 页数:132 大小:1.20MB
返回 下载 相关 举报
仿真验证与TESTBENCH编写课件_第1页
第1页 / 共132页
仿真验证与TESTBENCH编写课件_第2页
第2页 / 共132页
仿真验证与TESTBENCH编写课件_第3页
第3页 / 共132页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,Microelectronics School Xidian University,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,Microelectronics School Xidian University,第五章,仿真验证与,Testbench,编写,9/3/2024,1,Microelectronics School Xidian University,第五章 仿真验证与Testbench编写9/10/2023,5.1 Verilog HDL,电路仿真和验证概述,仿真,也叫模拟,是通过使用,EDA,仿真工具,通过输入测试信号,比对输出信号(波形、文本或者,VCD,文件)和期望值,来确认是否得到与期望所一致的正确的设计结果,验证设计的正确性。,验证是一个证明设计思路如何实现,保证设计在功能上正确的一个过程。,验证在,Verilog HDL,设计的整个流程中分为,4,个阶段:,阶段,1:,功能验证,;,阶段,2:,综合后验证,;,阶段,3:,时序验证,;,阶段,4:,板级验证。,9/3/2024,2,Microelectronics School Xidian University,5.1 Verilog HDL电路仿真和验证概述,5.2 Verilog HDL,测试程序设计基础,5.2.1 Testbench,及其结构,在仿真的时候,Testbench,用来产生测试激励给待验证设计(,Design Under Verification,,,DUV,),或者称为待测设计(,Design Under Test,,,DUT,)。,Testbench,平台结构,5.2 Verilog HDL测试程序设计基础5.2.1 T,测试程序的一般结构,由于,Testbench,是一个测试平台,信号集成在模块内部,没有输入输出。,在,Testbench,模块内,例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对待测系统提供测试激励。,例,5.2-1 T,触发器测试程序示例,module Tflipflop_tb; /,数据类型声明,reg clk, rst_n,T;,wire data_out;,TFF U1 (.data_out(data_out),.T(T),.clk(clk),.rst_n(rst_n);,/ /,对被测模块实例化,always,/,产生测试激励,#5 clk=clk;,Initial begin,clk=0;,#3 rst_n=0; #5 rst_n=1;,T=1; #30 T=0; #20 T=1;,end,Initial,/,对输出响应进行收集,begin,$monitor($time, T= %b, clk= %b, rst_n= %b, data_out= %b, T, clk, rst_n, data_out);,end,endmodule,例5.2-1 T触发器测试程序示例,T,触发器的仿真波形和部分文本输出结果,:,部分文本输出结果:,0T= x, clk= 0, rst_n= x, data_out= x,3T= x, clk= 0, rst_n= 0, data_out= 0,5T= x, clk= 1, rst_n= 0, data_out= 0,8T= 1, clk= 1, rst_n= 1, data_out= 1,10T= 1, clk= 0, rst_n= 1, data_out= 1,T触发器的仿真波形和部分文本输出结果 :部分文本输出结果:,从图中可以清晰地看出,Testbench,的主要功能:,(,1,)为,DUT,提供激励信号。,(,2,)正确实例化,DUT,。,(,3,)将仿真数据显示在终端或者存为文件,也可以显示在波形窗口中以供分析检查。,(,4,)复杂设计可以使用,EDA,工具,或者通过用户接口自动比较仿真结果与理想值,实现结果的自动检查。,从图中可以清晰地看出Testbench的主要功能:,在编写,Testbench,时需要注意的问题,:,(,1,),testbench,代码不需要可综合,Testbench,代码只是硬件行为描述不是硬件设计 。,(,2,)行为级描述效率高,Verilog HDL,语言具备,5,个描述层次,分别为开关级、门级、,RTL,级、算法级和系统级。,(,3,)掌握结构化、程式化的描述方式,结构化的描述有利于设计维护,可通过,initial,、,always,以及,assign,语句将不同的测试激励划分开来。,一般不要将所有的测试都放在一个语句块中。,在编写Testbench时需要注意的问题 :,5.2.2,测试平台举例,DUT,的仿真平台,测试平台需要产生时钟信号、复位信号和一系列的仿真向量,观察,DUT,的响应,确认仿真结果。,5.2.2测试平台举例DUT的仿真平台 测试平台需要产生时钟,(,1,)组合逻辑电路仿真环境的搭建,module adder1(a,b,ci,so,co);,input a,b,ci;,output so,co;,assignco,so=a+b+ci;,endmodule,根据全加器的真值表(表,5.2-1,)编写的全加器测试程序如下:,module adder1_tb;,wire so,co;,reg a,b,ci;,adder1 U1(a,b,ci,so,co);/,模块例化,initial /,测试信号产生,begin,a=0;b=0;ci=0;,#20 a=0;b=0;ci=1;,#20 a=0;b=1;ci=0;,#20 a=0;b=1;ci=1;,#20 a=1;b=0;ci=0;,#20 a=1;b=0;ci=1;,#20 a=1;b=1;ci=0;,#20 a=1;b=1;ci=1;,#200 $finish;,end,endmodule,(1)组合逻辑电路仿真环境的搭建module adder1(,全加器的输入,a,、,b,和,ci,定义为,reg,型变量,;,把输出,so,和,co,定义为,wire,型变量,用模块例化语句,“,adder1 U1(a,b,ci,so,co);”,把全加器设计电路例化到测试仿真环境中,;,用,initial,块语句改变输入的变化并生成测试条件,,,输入的变化语句完全根据全加器的真值表编写,仿真结果 :,全加器的输入a、b和ci定义为reg型变量;把输出so和co,(,2,)时序逻辑电路仿真环境的搭建,在于时序逻辑电路仿真环境中,需要考虑时序、定时信息和全局复位、置位等信号要求,并定义这些信号。,用,Verilog HDL,编写的十进制加法计数器源程序代码是:,module cnt10(clk,rst,ena,q,cout);,input clk,rst,ena;,output 3:0 q;,output cout;,reg 3:0 q;,always (posedge clk or posedge rst),begin,if(rst)q=4b0000;,else if(ena),begin,if(q %b %b,a, b, ci, so, co);,endmodule,其输出的结果是:,0 0 0 0 - 0 0,20 0 0 1 - 1 0,40 0 1 0 - 1 0,60 0 1 1 - 0 1,80 1 0 0 - 1 0,系统任务打印任务 :,$display,,直接输出到标准输出设备;,$monitor,,监控参数的变化;,$fdisplay,,输出到文件等,(2)打印文本输出法module adder1_tb;其输出,(,3,)自动检查仿真结果,自动检查仿真结果是通过在设计代码中的关键节点添加断言监控器,形成对电路逻辑综合的注释或是对设计特点的说明,以提高设计模块的观察性。,(,4,)使用,VCD,文件,Verilog HDL,提供一系列系统任务用于记录信号值变化保存到标准的,VCD(Value Change Dump),格式数据库中。,VCD,文件是一种标准格式的波形记录文件,只记录发生变化的波形。,VCD,文件将在第,5.3.7,小节中详细讲述。,(3)自动检查仿真结果,5.2.4 Verilog HDL,仿真效率,因为要通过串行软件代码完成并行语义的转化,,Verilog HDL,行为级仿真代码的执行时间比较长。,提高,Verilog HDL,代码的仿真代码执行时间:,(,1,)减小层次结构,仿真代码的层次越少,执行时间就越短。,(,2,)减少门级代码的使用,由于门级建模属于结构级建模,建议仿真代码尽量使用行为级语句,建模层次越抽象,执行时间就越短。,5.2.4 Verilog HDL仿真效率因为要通过串行软件,(,3,)仿真精度越高,效率越低,计时单位值与计时精度值的差距越大,则模拟时间越长。,timescale,仿真时间标度将在第,5.9.3,小节中详细讲述。,(,4,)进程越少,效率越高,代码中的语句块越少仿真越快,这是因为仿真器在不同进程之间进行切换也需要时间。,(,5,)减少仿真器的输出显示,Verilog HDL,语言包含一些系统任务,可以在仿真器的控制台显示窗口输出一些提示信息 ,但会降低仿真器的执行效率。,(3)仿真精度越高,效率越低,5.3,与仿真相关的系统任务,5.3.1 $display,和,$write,语法格式如下:,$display(“”, );,$write(“”, );,“,”,通常称为“格式控制”,“,”,则为“信号输出列表”,$display,自动地在输出后进行换行,$write,输出特定信息时不自动换行,5.3与仿真相关的系统任务5.3.1 $display和$w,输出格式说明,由“,%”,和格式字符组成,其作用是将输出的数据转换成指定的格式输出。,常用的几种输出格式如右表。,输出格式,说明,%h,或,%H,以十六进制数的形式输出,%d,或,%D,以十进制数的形式输出,%o,或,%O,以八进制数的形式输出,%b,或,%B,以二进制数的形式输出,%c,或,%C,以,ASCII,码字符的形式输出,%v,或,%V,输出网络型数据信号强度,%m,或,%M,输出等级层次的名字,%s,或,%S,以字符串的形式输出,%t,或,%T,以当前的时间格式输出,%e,或,%E,以指数的形式输出实型数,%f,或,%F,以十进制数的形式输出实型数,%g,或,%G,以指数或十进制数的形式输出实型数,输出格式说明,由“%”和格式字符组成,其作用是将输出的数据转,一些特殊的字符可以通过表中的转换序列来输出。,换码序列,功能,n,换行,t,横向跳格,(,即跳到下一个输出区,),反斜杠字符,双引号字符,o,1,到,3,位八进制数代表的字符,%,百分符号,%,一些特殊的字符可以通过表中的转换序列来输出。换码序列功能n,例,5.3-1,:,$display,和,$write,语句,module disp_tb;,reg31:0 rval;,pulldown(pd);,initial,begin,rval=101;,$display(t%n123);,$display(rval=%h hex %d decimal, rval, rval);,$display(rval=%o otal %b binary, rval, rval);,$display(rval has %c ascii character value,rval);,$display(pd strength value is %v,pd);,$display(current scope is %m);,$display(%s is ascii value for 101,101);,$write(“simulation time is”);,$write(“%tn”, $time);,end,endmodule,其输出结果为:,%,S,rval=00000065 hex 101 decimal,rval=00000000145 octal 00000000000000000000000001100101 binary,rval has e ascii character value,pd strength value is StX,current scope is disp,e is ascii value for 101,simulation time is 0,在,$display,中,输出列表中数据的显示宽度是自动按照输出格式进行调整的,总是用表达式的最大可能值所占的位数来显示表达式的当前值。,例5.3-1:$display和$write语句 modul,5.3.2 $monitor,和,$strobe,$monitor,与,$stobe,都提供了监控和输出参数列表中字符或变量的值的功能,(,1,),$monitor,语法格式:,$monitor(”, );,任务,$monitor,提供了监控和输出参数列表中的表达式或变量值的功能。每当参数列表中变量或表达式的值发生变化时,整个参数列表中变量或表达式的值都将输出显示。,例如:,$monitor($time,rxd=%b txd=%b,rxd,txd);,注意在上面的语句中,“,代表一个空参数。空参数在输出时显示为空格。,5.3.2 $monitor和$strobe$monitor,$monitoron,和,$monitoroff,任务的作用是通过打开和关闭监控标志来控制监控任务,$monitor,的启动和停止,这样使得程序员可以很容易的控制,$monitor,何时发生 。,$monitor,与,$display,的不同处在于,$monitor,往往在,initial,块中调用,只要不调用,$monitoroff,$monitor,便不间断地对所设定的信号进行监视。,例,5.3-2,:,$monitor,系统任务的应用实例,module monitor_tb;,integer a, b;,initial begin,a = 2;,b = 4;,forever begin #5 a= a + b; #5 b= a - 1; end,end,initial #40 $finish;,initial $monitor($time, a = %d, b = %d, a, b);,endmodule,输出结果为:,0 a = 2, b = 4,5 a = 6, b = 4,10 a = 6, b = 5,15 a = 11, b = 5,20 a = 11, b = 10,25 a = 21, b = 10,30 a = 21, b = 20,35 a = 41, b = 20,$monitoron和$monitoroff任务的作用是通过,(,2,),$strobe,语法格式:,$strobe();,$strobe(“”,);,探测任务用于在某时刻所有时间处理完后,在这个时间步的结尾输出一行格式化的文本。常用的系统任务如下:,$strobe:,在所有时间处理完后,以十进制格式输出一行格式化的文本;,$strobeb:,在所有时间处理完后,以二进制格式输出一行格式化的文本;,$strobeo:,在所有时间处理完后,以八进制格式输出一行格式化的文本;,$strobeh:,在所有时间处理完后,以十六进制格式输出一行格式化的文本。,(2)$strobe语法格式:,$strobe,任务在被调用的时刻所有的赋值语句都完成了,才输出相应的文字信息。,$strobe,任务提供了另一种数据显示机制,可以保证数据只在所有赋值语句被执行完毕后才被显示。,例,5.3-3,:,$strobe,系统任务的应用实例,module strobe_tb;,reg a,b;,initial begin,a=0;,$display(“a by display is:”,a);,$strobe(“a by strobe is:”,a);,a=1;,end,initial begin,b=0;,$display(“b by display is:”,b);,$strobe (“b by strobe is:”,b);,#5;,$display(“#5 b by display is:”,b);,$display(“#5 b by strobe is:”,b);,b=1;,end,Endmodule,显示结果是,:,a by display is:0,b by display is:x,a by strobe is:1,b by strobe is:0,#5 b by display is:0,#5 b by strobe is:0,$strobe任务在被调用的时刻所有的赋值语句都,5.3.3 $time,和,$realtime,用这两个时间系统函数可以得到当前的仿真时刻,所不同的是,,$time,函数以,64,位整数值的形式返回仿真时间,而,$realtime,函数则以实数型数据返回仿真时间。,(,1,)系统函数,$time,例,5.3-4,:,$time,系统任务的应用实例,timescale 1ns/1ns,module time_tb;,reg ts;,parameter delay = 2;,initial begin,#delay ts = 1;,#delay ts = 0;,#delay ts = 1;,#delay ts = 0;,end,initial,$monitor($time,ts = %b, ts);/,使用函数,$time,endmodule,输出结果为:,0 ts = x,3 ts = 1,5 ts = 0,8 ts = 1,10 ts = 0,5.3.3 $time和$realtime用这两个时间系统函,(,2,),$realtime,系统函数,$realtime,返回的时间数字是一个实型数,该数字也是以时间尺度为基准的。,例,5.3-5,:,$realtime,系统任务的应用实例,timescale1ns/1ns,module realtime_tb;,reg set;,parameter p=2;,initial,begin,$monitor($realtime,set=b%,set); /,使用函数,$realtime,#p set=0;,#p set=1;,end,endmodule,输出结果为:,0 set=x,2 set=0,4 set=1,(2)$realtime系统函数$realtime返回的时间,5.3.4 $finish,和,$stop,系统任务,$finish,和,$stop,是用于对仿真过程进行控制,分别表示结束仿真和中断仿真。其语法格式:,$finish;,$finish(n);,$stop;,$stop(n);,其中,,n,是,$finish,和,$stop,的参数,,n,可以取,0,、,1,或,2,几个值,分别表示如下含义,如下表所示。,n,的取值,含义,0,不输出任何信息,1,给出仿真时间和位置,2,给出仿真时间和位置,同时还有所用,memory,及,CPU,时间的统计,5.3.4 $finish和$stop系统任务$finish,$finish,的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。任务,$finish,可以带参数,根据参数的值输出不同的特征信息。如果不带参数,默认,$finish,的参数值为,1,。,$stop,任务的作用是把,EDA,工具,(,例如仿真器,),置成暂停模式,在仿真环境下给出一个交互式的命令提示符,将控制权交给用户。这个任务可以带有参数表达式。根据参数值,(0,,,1,或,2),的不同,输出不同的信息。参数值越大,输出的信息越多。,$finish的作用是退出仿真器,返回主操作系统,也就是结束,$finish,和,$stop,实例,例,5.3-6,:,$finish,系统任务的应用实例,module finish_tb;,integer a, b;,initial begin,a = 2;,b = 4;,forever begin,#5 a= a + b;,#5 b= a - 1;,end,end,initial #40 $finish;,initial begin,$monitor($time, a = %d, b = %d, a, b);,end,endmodule,在上例中,程序执行到,40,个时间单位时退出仿真器。,例,5.3-7,:,$stop,系统任务的应用实例,module stop_tb;,integer a, b;,initial begin,a = 2;,b = 4;,forever begin,#5 a= a + b;,#5 b= a - 1;,end,end,initial #40 $stop;,initial begin,$monitor($time, a = %d, b = %d, a, b);,end,endmodule,在上例中,程序执行到,40,个时间单位时停止仿真,将,EDA,仿真器设置为暂停模式,。,$finish和$stop实例例5.3-6:$finish系,5.3.5 $readmemh,和,$readmem,在,Verilog HDL,程序中有两个系统任务,$readmemb,和,$readmemh,用来从文件中读取数据到存储器中。这两个系统任务可以在仿真的任何时刻被执行使用,其语法格式共有以下六种:,(,1,),$readmemb(,);,(,2,),$readmemb(,);,(,3,),$readmemb(,);,(,4,),$readmemh(,);,(,5,),$readmemh(,);,(,6,),$readmemh(,);,9/3/2024,32,Microelectronics School Xidian University,5.3.5 $readmemh和$readmem在Veril,9/3/2024,33,Microelectronics School Xidian University,例,$readmemh,和,$readmemb,系统任务的应用实例,module read_mem_tb;,reg 7:0 memory_b 0:7;,reg 31:0 memory_h 0:31;,integer i;,initial begin,/,把数据文件,init_b.txt,读入存储器中的给定地址,$readmemb(init_b.txt,memory_b);,/,把数据文件,init_h.txt,读入存储器中的给定地址,$readmemb(init_h.txt,memory_h);,/,显示初始化后的存储器内容,for(i=0; i0,,它给出了一个范围在(,-b+1):(b-1),中的随机数。,9/3/2024,35,Microelectronics School Xidian University,5.3.6 $random$random是产生随机数的系统函,例,$random,系统任务的应用实例,9/3/2024,36,Microelectronics School Xidian University,timescale 1ns/1ns,module random_pulse( dout );,output 9:0 dout;,reg dout;,integer delay1,delay2,k;,initial,begin,#10 dout=0;,for (k=0; k 100; k=k+1),begin,delay1 = 20 * ( $random % 6); / delay1,在,0,到,100ns,间变化,delay2 = 20 * ( 1 + $random % 3); / delay2,在,20,到,60ns,间变化,#delay1 dout = 1 ($random %10);,/dout,的,0-9,位中随机出现,1,,并出现的时间在,0-100ns,间变化,#delay2 dout = 0;,/,脉冲的宽度在在,20,到,60ns,间变化,end,end,endmodule,例$random系统任务的应用实例9/10/202336Mi,5.4,信号时间赋值语句,9/3/2024,37,Microelectronics School Xidian University,5.4信号时间赋值语句9/10/202337Microele,5.4.1,时间延迟的语法说明,延迟语句用于对各条语句的执行时间进行控制,从而快速满足用户的时序要求。,Verilog HDL,语言中延时控制的语法格式有两类:,(,1,),#,行为语句;,(,2,),#,;,其中,符号,“,#”,是延迟控制的关键字符,,可以是直接指定的延迟时间量,并以多少个仿真时间单位的形式给出。在仿真过程中,所有时延都根据时间单位定义。,下面是带时延的赋值语句示例。,#2 Sum = A B; /#2,指定,2,个时间单位后,将,A,异或,B,的值赋值给,Sum,。,9/3/2024,38,Microelectronics School Xidian University,5.4.1时间延迟的语法说明延迟语句用于对各条语句的执行时间,根据时间控制部分在过程赋值语句中出现的位置,可以把过程赋值语句中的时间控制方式分为外部时间控制方式和内部时间控制方式。,(,1,)外部时间控制方式是时间控制出现在整个过程赋值语句的最左端,也就是出现赋值目标变量的左边的时间控制方式,其语法结构如下例所示:,#5 a=b,;,在仿真执行时就相当于如下几条语句的执行:,initial,begin,#5;,a=b;,end,9/3/2024,39,Microelectronics School Xidian University,根据时间控制部分在过程赋值语句中出现的位置,可以把过程赋值语,(,2,)内部时间控制方式是过程赋值语句中的时间控制部分还可以出现在,“,赋值操作符,”,和,“,赋值表达式,”,之间的时间控制方式。其语法结构如下例所示:,a=#5b,;,其中时间控制部分,“,#5”,就出现在赋值操作符,“,=”,和赋值表达式,“,b”,的中间,因此在这条过程赋值语句内带有内部时间控制方式的时间控制。它在执行时就相当于如下几条语句的执行:,initial,begin,temp=b; /,先求,b,的值,#5,;,a=temp,;,end,9/3/2024,40,Microelectronics School Xidian University,(2)内部时间控制方式是过程赋值语句中的时间控制部分还可以出,5.4.2,时间延迟的描述形式,此处时间延迟的描述形式是指延时控制的描述形式,其分为串行延迟控制、并行延迟控制、阻塞式延迟控制和非阻塞式延迟控制四种形式。以实现两组不同波形的信号为例(如图所示,q0_out,和,q1_out,),说明四种不同时间延迟的描述形式。,9/3/2024,41,Microelectronics School Xidian University,5.4.2时间延迟的描述形式此处时间延迟的描述形式是指延时控,(,1,)串行延迟控制,串行延迟控制是最为常见的信号延迟控制,它是由,begin-end,过程块加上延迟赋值语句构成,其中延迟赋值语句可以为外部时间控制方式,也可以为内部时间控制方式。在,之后也可根据情况来确定是否执行相应的行为语句。,在,后面有相应的行为语句,则仿真进程遇到这条带有延迟控制的行为语句后并不立即执行行为语句指定的操作,而是要延迟等待到,“,”,所指定的时间量过去后才真正开始执行行为语句指定的操作。,9/3/2024,42,Microelectronics School Xidian University,(1)串行延迟控制9/10/202342Microelect,9/3/2024,43,Microelectronics School Xidian University,timescale 1ns/1ns,module serial_delay (q0_out,q1_out);,output q0_out,q1_out;,reg q0_out,q1_out;,initial,begin,q0_out=1b0;,#50 q0_out=1b1;,#100q0_out=1b0;,#100q0_out=1b1;,#50 q0_out=1b0;,#100q0_out=1b1;,#50 q0_out=1b0;,#50 q0_out=1b1;,#50 q0_out=1b0;,end,initial,begin,q1_out=1b0;,#100q1_out=1b1;,#100q1_out=1b0;,#50 q1_out=1b1;,#100q1_out=1b0;,#50 q1_out=1b1;,#100q1_out=1b0;,#50 q1_out=1b1;,#50 q1_out=1b0;,end,endmodule,例,Verilog HDL,串行延迟控制方式设计图示信号,9/10/202343Microelectronics Sc,(,2,)并行延迟控制,并行延迟控制方式是通过,fork-join,过程块加上延迟赋值语句构成,其中延迟赋值语句同串行延迟控制方式一样,既可以是外部时间控制方式,也可以是内部时间控制方式。在,之后也可根据情况来确定是否执行相应的行为语句。,在,后面有相应的行为语句,则仿真进程遇到这条带有延迟控制的行为语句后并不立即执行行为语句指定的操作,而是要延迟等待到,“,”,所指定的时间量过去后才真正开始执行行为语句指定的操作。但并行延迟控制方式与串行延迟控制方式不同在于并行延迟控制方式中的多条延迟语句时并行执行的,并不需要等待上一条语句的执行完成才开始执行当前的语句。,9/3/2024,44,Microelectronics School Xidian University,(2)并行延迟控制9/10/202344Microelect,9/3/2024,45,Microelectronics School Xidian University,timescale 1ns/1ns,module parallel_delay (q0_out,q1_out);,output q0_out,q1_out;,reg q0_out,q1_out;,initial fork,q0_out=1b0;,#50 q0_out=1b1;,#150q0_out=1b0;,#250q0_out=1b1;,#300q0_out=1b0;,#400q0_out=1b1;,#450q0_out=1b0;,#500q0_out=1b1;,#600q0_out=1b0;,join,initial fork,q1_out=1b0;,#100q1_out=1b1;,#200q1_out=1b0;,#250q1_out=1b1;,#350q1_out=1b0;,#400q1_out=1b1;,#500q1_out=1b0;,#550q1_out=1b1;,#600q1_out=1b0;,join,endmodule,例,Verilog HDL,并行延迟控制方式设计图示信号,9/10/202345Microelectronics Sc,(,3,)阻塞式延迟控制,以赋值操作符,“,=”,来标识的赋值操作称为,“,阻塞式过程赋值,”,,阻塞式过程赋值在之前已经介绍过,在此介绍阻塞式延迟控制。阻塞式延迟控制是在阻塞式过程赋值基础上带有延时控制的情况,例如,initial,begin,a = 0;,a = #5 1;,a = #10 0;,a = #15 1;,end,9/3/2024,46,Microelectronics School Xidian University,(3)阻塞式延迟控制9/10/202346Microelec,各条阻塞式赋值语句将依次得到执行,并且在第一条语句所指定的赋值操作没有完成之前第二条语句不会开始执行。因此在仿真进程开始时刻将,“,0”,值赋给,a,,此条赋值语句完成之后才开始执行第二条赋值语句;在完成第一条赋值语句之后,延迟,5,个时间单位将,“,1”,赋值给,a,;同理第三条赋值语句是在第二条赋值语句完成之后延迟,10,个时间单位才开始执行,将,“,0”,赋值给,a,;最后一条赋值语句是在前三条语句都完成的时刻,延迟,15,个时间单位,将,“,1”,赋值给,a,。下图给出了上例中信号,a,的波形。上述两例都采用的是阻塞式赋值语句。,9/3/2024,47,Microelectronics School Xidian University,各条阻塞式赋值语句将依次得到执行,并且在第一条语句所指定的赋,(,4,)非阻塞式延迟控制,以赋值操作符,“,=”,来标识的赋值操作称为,“,非阻塞式过程赋值,”,,非阻塞式过程赋值也在之前讲述过,在此主要介绍非阻塞式延迟控制。非阻塞式延迟控制是在非阻塞式过程赋值基础上带有延时控制的情况。如下例所示:,initial,begin,a = 0;,a = #5 1;,a = #10 0;,a = #15 1;,end,9/3/2024,48,Microelectronics School Xidian University,(4)非阻塞式延迟控制9/10/202348Microele,在上例中各条非阻塞式赋值语句均以并行方式执行,虽然执行语句在,begin-end,串行块中,但其执行方式与并行延迟控制方式一致,在仿真进程开始时刻同时执行四条延迟赋值语句。在仿真进程开始时,将,“,0”,值赋值给,a,;在离仿真开始时刻,5,个时间单位时,将,“,1”,值赋值给,a,;在离仿真开始时刻,10,个时间单位时,将,“,0”,值赋值给,a,;最后在离仿真开始时刻,15,个时间单位时,将,“,1”,值赋值给,a,。下图给出了上例中信号,a,的波形。,9/3/2024,49,Microelectronics School Xidian University,在上例中各条非阻塞式赋值语句均以并行方式执行,虽然执行语句在,9/3/2024,50,Microelectronics School Xidian University,timescale 1ns/1ns,module non_blocking_delay(q0_out,q1_out);,output q0_out,q1_out;,reg q0_out,q1_out;,initial,begin,q0_out= 1b0;,q0_out=#50 1b1;,q0_out=#150 1b0;,q0_out=#250 1b1;,q0_out=#300 1b0;,q0_out=#400 1b1;,q0_out=#450 1b0;,q0_out=#500 1b1;,q0_out=#600 1b0;,end,initial,begin,q1_out= 1b0;,q1_out=#100 1b1;,q1_out=#200 1b0;,q1_out=#250 1b1;,q1_out=#350 1b0;,q1_out=#400 1b1;,q1_out=#500 1b0;,q1_out=#550 1b1;,q1_out=#600 1b0;,end,endmodule,例,Verilog HDL,非阻塞延迟控制方式设计,9/10/202350Microelectronics Sc,5.4.3,边沿触发事件控制,边沿触发事件控制的语法格式可以为如下四种形式:,形式,1,:,(,)行为语句;,形式,2,:,(,);,形式,3,:,(,ororor,)行为语句;,形式,4,:,(,ororor,);,9/3/2024,51,Microelectronics School Xidian University,5.4.3边沿触发事件控制边沿触发事件控制的语法格式可以为如,1,事件表达式,在事件表达式中,可以以三种形式出现:,形式,1,:,形式,2,:,posedge,形式,3,:,negedge,其中,,“,”,可以是任何数据类型的标量或矢量。,形式,1,中,代表触发事件的,“,”,在指定的信号发生逻辑变化时,执行下面的语句,如例所示:,(,in,),out=in,;,当敏感事件,in,发生逻辑变化时(包括正跳变和负跳变),执行对应的赋值语句,将,in,的值赋值给,out,。,9/3/2024,52,Microelectronics School Xidian University,1事件表达式9/10/202352Microelectro,形式,2,中,代表触发事件的,“,posedge”,在指定的信号发生了正跳变时,执行下面的语句,如下例所示:,(,posedge in,),out=in,;,当敏感事件,in,发生正跳变时,执行对应的赋值语句,将,in,的值赋值给,out,。,形式,3,中,代表触发事件的,“,negedge”,在指定的信号发生了负跳变时,执行下面的语句,如下例所示:,(,negedge in,),out=in,;,当敏感事件,in,发生负跳变时,执行对应的赋值语句,将,in,的值赋值给,out,。,9/3/2024,53,Microelectronics School Xidian University,形式2中,代表触发事件的“posedge”在指定的,在信号发生逻辑变化(正跳变或负跳变)的过程中,信号的值是从,0,、,1,、,x,、,z,四个值中的一个值变化到另一个值;而信号发生正跳变的过程是信号由低电平向高电平的转变,负跳变是信号由高电平向低电平的转变。表,5.4-1,为,Verilog HDL,中规定的正跳变和负跳变。,9/3/2024,54,Microelectronics School Xidian University,正跳变,负跳变,0x,1x,0z,1z,01,10,x1,x0,z1,z0,在信号发生逻辑变化(正跳变或负跳变)的过程中,信号的值是从0,2,边沿触发语法格式,形式,1,:,(,)行为语句;,这种语法格式的敏感事件列表内只包含了一个触发事件,只有当这个指定的触发事件发生之后,后面的行为语句才能启动执行。在仿真进程中遇到这种带有事件控制的行为语句时,如果指定的触发事件还没有发生,则仿真进程就会停留在此处等待,直到指定触发事件发生之后再启动执行后面的行为语句,仿真进程继续向下进行。,9/3/2024,55,Microelectronics School Xidian University,例,5.4-4,:时钟脉冲计数器,module clk_counter(clk, count_out);,input clk;,output count_out;,reg 3:0 count_out;,initial,count_out = 0;,always(posedge clk),count_out = count_out + 1;/,在,clk,的每个正跳变边沿,count_out,增加,1,endmodule,2边沿触发语法格式9/10/202355Microelec,形式,2,:,(,),;,这种语法格式的敏感事件列表内也只包含了一个触发事件,没有行为语句来指定触发事件发生时要执行的操作。这种格式的事件控制语句的执行过程与延时控制语句中没有行为语句的情况类似,仿真进程在遇到这条事件控制语句后会进入等待状态,直到指定的触发事件发生后才结束等待状态,退出该事件控制语句的执行并开始下一条语句的执行。,9/3/2024,56,Microelectronics School Xidian University,形式2:();9/10/202356Micr,9/3/2024,57,Microelectronics School Xidian University,module clk_time_mea(clk);,input clk;,time posedge_time, negedge_time;,time high_last_time, low_last_time,last_time;,initial,begin,(posedge clk);,/*,等待,直到时钟发生正跳变后退出等待状态,继续执行下一条语句,*,/,posedge_time = $time;,(negedge clk);,/*,等待,直到时钟发生负跳变后退出等待状态,,继续执行下一条语句,*,/,negedge_time = $time;,(negedge clk);,/*,等待,直到时钟再次正跳变后退出等待状态,继续执行下一条语句,*,/,last_time = $time - posedge_time;,high_last_time = negedge_time - posedge_time;,low_last_time = last_time - high_last_time;,$display(The clk stay in High level for:%t,high_last_time);,$display(The clk stay in Low leve
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!