testbenchpreliminary


Testbench Preliminary itator Make EDA Serve You 仅供学习,严禁拷贝! 1 编写TESTBENCH目的 .......................................................................................................... 3 2 基本TESTBENCH形式 .......................................................................................................... 3 2.1 基本的Testbench结构...................................................................................................... 3 2.2 激励产生方式 ................................................................................................................... 4 2.2.1 HDL描述方式 ............................................................................................................. 4 2.2.2 文本输入方式 ............................................................................................................. 5 2.2.3 编程语言接口(PLI)方式.......................................................................................... 5 2.3 仿真结果分析 ................................................................................................................... 6 2.4 产生激励的一些描写方式 ................................................................................................. 6 2.4.1 产生时钟的几种方式................................................................................................... 6 2.4.2 产生复位信号的几种形式 ........................................................................................... 7 3 TESTBENCH实例.................................................................................................................. 9 3.1 2-4解码器实例 ................................................................................................................. 9 3.2 时序检测器..................................................................................................................... 10 4 结构化的testbench............................................................................................................... 12 4.1 BFM............................................................................................................................... 13 2 Make EDA Serve You 仅供学习,严禁拷贝! Testbench_Preliminary 关键词:Testbench 测试验证 摘要:本文简单介绍逻辑验证的入门知识—如何编写TESTBENCH进行逻辑测试。 1 编写TESTBENCH目的 编写TESTBENCH的主要目的是为了对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试 设计电路的功能、部分性能是否与预期的目标相符。编写TESTBENCH进行测试的过程如下: 1)产生模拟激励(波形)。 2)将产生的激励加入到被测试模块并观察其输出响应。 3)将输出响应与期望值进行比较。 从而判断设计的正确性。 2 基本TESTBENCH形式 2.1 基本的Testbench结构 module test_bench ; //通常Testbench没有输入与输出端口 信号或变量定义声明 使用initial 或always语句来产生激励波形 例化设计模块 监控和比较输出响应 endmodule 简单的Testbench的结构通常需要建立一个顶层文件,顶层文件没有输入和输出端口。在顶层文件里, 把被测模块和激励产生模块实例化进来,并且把被测模块的端口与激励模块的端口进行对应连接, 使得激励可以输入到被测模块。端口连接的方式有名称和位置关联两种方式,下面一个为实例化非 门的两种方式: 名称关联: NOT U1( . I ( in_ ) , . O ( out_ ) ) ; 在名称关联方式中,非门的端口 I 和 O 分别与网路名 in_ 和 out_连接。 位置关联: 3 Make EDA Serve You 仅供学习,严禁拷贝! NOT U2 ( in_ , out_ ); 在位置关联方式中,模块实例语句的网路名 in_ 和 out_ 的顺序必须与模块NOT定义的端口顺序一 致。 2.2 激励产生方式 2.2.1 HDL描述方式 HDL用于描述硬件电路,同样也可以用于描述仿真激励的产生。HDL描述可以产生所需的控制信号, 以及一些简单的数据。例如模拟CPU产生的读/写信号,数据/地址总线信号等。下面为一个简单的 CPU写操作的例子: initial begin cs_n = 1 ; // CPU接口初始状态 wr_n = 1 ; rd_n = 1 ; addr = 8'hxx ; data = 8'hzz ; # 1000 ; // 一次写操作 cs_n = 0 ; wr_n = 0 ; addr = 8'h80 ; data = 8'h00 ; # 100 ; cs_n = 1 ; wr_n = 1 ; #10 ; addr = 8'hxx ; data = 8'hzz ; end 产生的波形如下: 4 Make EDA Serve You 仅供学习,严禁拷贝! xx 80 xx zz 80 zz 0 1000 1100 1110 rd_n wr_n cs_n addr data 2.2.2 文本输入方式 诚然,HDL语言产生波形比起手工画波形来仿真已经已经有了很的提高。但如果产生的激励具有复 杂的数据结构,例如产生IP报文的激励,HDL就显得较困难了。比起HDL,用C/C++产生复杂的 数据激励就容易得多。因此,verilog提供了一种读入文本文件的系统函数 ——$readmemb/$readmemh,分别用于从文本文件中读入二进制和十六进制的数据,存放到verilog 自定义的memory里,verilog再从memory取出数据按一定的顺序施加到被测模块。而C产生的数据存 放到文本文件里以被verilog读取。 2.2.3 编程语言接口(PLI)方式 文本输入的方式可以很方便地产生所需的激励数据,但是,如果需要动态地产生大量的数据,文本 输入的方式就有很大的缺陷,因为C和仿真器之间没有通讯的桥梁,因此就不能动态地根据当前的 响应决定下一个激励是什么。当然有很多人都想到了一个偏方:既然文本文件可以用于输入激励, 也可以用它来作为通讯邮箱,使得C和仿真器之间可以互通控制信息呀。方法确实是可以实现,但 是通过文件来交互的方式显然不够灵活、实时性不够强(因为需要定时地去查询邮箱有没有信息), 而且如果有大量的数据通过存储在硬盘上的文件来交互,会大大降低仿真的速度。 仿真器提供一个编程语言接口PLI( program language interface ),通过PLI,将C程序嵌入到HDL 设计中,用户可以用C写扩展的系统任务和函数,扩充了HDL语言的功能。有了PLI,C和HDL之间 就可以直接通讯,去掉了文件交互的环节,大大提高了效率和方便性。此外,PLI还有许多强大的 功能。 5 Make EDA Serve You 仅供学习,严禁拷贝! 2.3 仿真结果分析 运行仿真后,可以通过查看波形、显示信息和LOG文件的方式来分析仿真结果。 查看波形是最基本和直接的方式,但过程比较繁琐和低效,因为从无数的信号中分析某些信号是否 正确无疑大海捞针。查看波形的分析方式通常在小模块的仿真分析或精确定位设计问题是采用。 显示信息和LOG文件的方式是指添加一些自检测的程序,在遇到错误时将错误的信息显示到屏幕或 打印到LOG文件中,方便仿真结果的分析。 2.4 产生激励的一些描写方式 2.4.1 产生时钟的几种方式 1)使用initial方式产生占空比50%的时钟 initial begin Clk = 0 ; # delay ; forever # (period/2) Clk = ~ Clk ; end 注意一定要给时钟赋初始值,因为信号的缺省值为z,如果不赋初值,则反相后还是z,时钟就一直 处于高阻z状态。 产生的时钟信号如下图所示 2)使用always方式 initial Clk = 0 ; always # (period/2) Clk = ~ Clk ; 6 Make EDA Serve You 仅供学习,严禁拷贝! 3)使用repeat产生确定数目的时钟脉冲 initial begin Clk = 0 ; repeat ( 6 ) # (period/2) Clk = ~ Clk ; end 该例使用repeat产生 3个时钟脉冲,产生的波形如下: 4)产生占空比非50%的时钟 initial Clk = 0 ; always begin # 3 Clk = ~ Clk ; # 2 Clk = ~ Clk ; end 2.4.2 产生复位信号的几种形式 1)异步复位 initial begin Rst = 1 ; # 100 ; Rst = 0 ; # 500 ; Rst = 1 ; end 7 Make EDA Serve You 仅供学习,严禁拷贝! 2)同步复位1 initial begin Rst = 1 ; @( negedge Clk) ; // 等待时钟下降沿 Rst = 0 ; # 30 ; @( negedge Clk) ; // 等待时钟下降沿 Rst = 1 ; end Clk 020 405060 negedge Clk negedge Clk Rst 2)同步复位2 initial begin Rst = 1 ; @( negedge Clk) ; // 等待时钟下降沿 repeat ( 3 ) @( negedge Clk) ; // 经过3个时钟下降沿 Rst = 1 ; end 8 Make EDA Serve You 仅供学习,严禁拷贝! 3 TESTBENCH实例 3.1 2-4解码器实例 下面是2-4解码器和它的TESTBENCH,任何时候只要输入或输出信号的值发生变化,输出信号的值 都会被显示输出。 `timescale 1ns/100ps module dec2x4 ( A , B , Enable , Z ) ; input A , B , Enable ; output [3:0] Z ; always @( A or B or Enable ) begin if ( Enable == 1'b0 ) Z = 4'b1111 ; else case ( A , B ) 2'b00 : Z = 4'b1110 ; 2'b01 : Z = 4'b1101 ; 2'b10 : Z = 4'b1011 ; 2'b11 : Z = 4'b0111 ; default : Z = 4'b1111 ; endcase end endmodule module testbench ; reg a , b , en ; wire [3:0] z ; // 例化被测试模块 ; dec2x4 DUT ( . A ( a ), . B ( b ), . Enable ( en ), . Z ( z ) 9 Make EDA Serve You 仅供学习,严禁拷贝! ); //产生输入激励: initial begin en = 0 ; a = 0 ; b = 0 ; #10 en = 1 ; #10 b = 1 ; #10 a = 1 ; #10 b = 0 ; #10 a = 0 ; #10 $stop ; end //显示输出结果 always @(en or a or b or z) begin $display ("At time %t , input is %b%b%b , output is %b", $time , a , b , en , z ) ; endmodule 下面是测试模块执行时产生的输出。 At time 0, input is 000, output is 1111 At time 10, input is 001, output is 1110 At time 20, input is 011, output is 1101 At time 30, input is 111, output is 0111 At time 40, input is 101, output is 1011 At time 50, input is 001, output is 1110 3.2 时序检测器 下面是一个时序检测器的验证实例。被测模型用于检测数据线上连续三个1 的序列。在时钟的每个 上升沿检查数据。带有测试验证模块的模型描述如下: module Count3_ls (Data, Clock, Detect3_ls ) ; input Data, Clock; output Detect3_ ls ; integer Count ; 10 Make EDA Serve You 仅供学习,严禁拷贝! reg Detect3_1s ; initial begin Count = 0; Detect3_ls = 0; end always @(posedge Clock) begin if ( Data == 1) Count = Count + 1; else Count = 0; if (Count >= 3) Detect3_ls = 1 ; else Detect3_ls = 0 ; end endmodule module test ; reg Data , Clock , Detect ; integer Out_File ; / /待测试模块的应用实例。 Count3_ls DUT (Data, Clock, Detect ) ; initial begin Clock = 0 ; forever #5 Clock = ~ Clock ; end initial begin Data = 0 ; #5 Data = 1; #40 Data = 0; #10 Data = 1; #40 Data = 0; 11 Make EDA Serve You 仅供学习,严禁拷贝! #20 $stop; // 仿真结束。 end // 创建一个记录文件; initial Out_file = $fopen ( "results.txt"); //在文件中保存监控信息; always @(posedge Clock) begin if ( Detect == 1'b1 ) $fwrite ( Out_file , "At time %t , Detect out is 1\n"); end endmodule 4 结构化的testbench 一个结构良好的testbench有助于提高验证代码的可重用性,减少testbench设计的工作量,一种可重 用的结构是testbench划分为harness和testcase两部分。如下图所示: Testcase Bus Funct. Model Bus Funct. Model DUV Harness Reusable Verification Components RAM harness做为一个module,可以被testcase实例化,也可以两者在同一层次。两种方式testcase都可以通 过任务调用的形式对harness进行访问。总线功能模型可以被同一设计的所有Testbench甚至多个设计 12 Make EDA Serve You 仅供学习,严禁拷贝! 重用。上图所示是一个简单的可重用Testbench结构,实际上,根据设计的需要,可以将一些中间层 次的可重用的子程序进行封装,对外通过任务调用等方式提供程序化的接口。结构化的设计不仅可 以有利于重用,而且程序化接口的方式隐去了时序,更便于testbench的编写。 4.1 BFM BFM(Bus functional model)——总线功能模型,BFM的作用是将低层总线的时序封装起来,对 高层提供一个调用接口,使得高层不用关心低层的实现细节,专注于testcase的设计。这一点类似C++ 里面向对象的概念,在C++里,对象相当于命令或调用,而对象的成员函数实现具体的功能,外部 无须关心类内部的细节。 addr data cs wr rd read() write() Bus Functional Model CPU总线功能模型 上图为一个CPU的总线功能模型,根据预定义的CPU时序,一侧为底层信号的驱动。另外一侧,提 供读和写两个任务被上一层调用。 13
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

3637320230

贡献于2017-03-04

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf