宝玛科技网
您的当前位置:首页Verilog Testbench设计技巧和策略

Verilog Testbench设计技巧和策略

来源:宝玛科技网
VerilogTestbench设计技巧和策略

张盛兵

高德远

(西北工业大学航空微电子中心,西安710072)

仿真Testbench的设计是Top-Down流程中非常关键的一个环节,但是很多设计者却感到困难较大。实际上,

verilogHDL有着较强的行为建模能力,可以方便地写出更加高效、简洁的行为模型。论文结合一个ATM测试平台的

讨论了Testbench的结构和总线功能模型(BFM),并对使用BFM模型进行Testbench设计的策略和方法Testbench设计,

进行了探讨,希望能对广大设计者有所帮助。关键词

VerilogTestbenchBFM模型功能仿真验证

中图分类号TP311

(2003)文章编号1002-8331-10-0128-03文献标识码A

StrategyandTechniqueofTestbenchDesigninVerilog

LiYingZhangShengbingGaoDeyuan(AviationMicroelectronicCenter,NorthwesternPolytechnicalUniversity,Xiˊan710072)

Abstract:WritingtestbenchisaverycriticalstepintheTop-Downdesignflow,however,manydesignersfeeldifficult

todoitwell.Infact,designerscanwritemoreefficientandconcisebehavioralmodelingtestbenchusingverilogHDL.Inthispaper,throughatestbenchdesignofATMtestingplatform,theauthorsdiscussthestructureoftestbenchandthe

(BFM)busfunctionmodel.TheyalsodiscussthestrategyandmethodofdesigningtestbenchwithBFM.Theauthorshopemorereadersanddesignerscanbenefitfromit.

Keywords:Verilog,Testbench,BFM,functionsimulation,verification

1概述

基于Top-Down流程的高层次设计方法,采用硬件描述语

(2)将产生的激励加入到被测试模块并观察其输出响应。(3)将输出响应与期望值进行比较。

言作为设计输入手段,已经为广大的IC设计者接受。功能仿真是Top-Down流程中非常重要的一个环节,仿真Testbench的设计是其中的关键,但是很多设计者却感到这项工作很复杂,困难较大。

大部分人在编写Testbench的时候,都习惯于编写可综合的代码,除了always、似乎看不if/else、case和assign等语句外,的说法,这对到别的写法,因此就有了“if/else、case包打天下”设计人员来说“可能”有利于养成良好的编码习惯,但对测试验证来说,却不是好事情,因为verilogHDL有着较强的行为建模能力,它的许多接近于高级语言的语法,可以方便地写出更加可高效、简洁的行为模型。而且,Testbench的结构也有很多种,以灵活选择。

论文结合设计工作实践,探讨Testbench的结构、BFM仿真模型、期望能对广大设计者设Testbench设计策略和方法等,计高效、完善的Testbench工作有所帮助。

2.2Testbench的结构

它的结构Testbench实际上也是一段Verilog语言的描述,

可以是单顶层结构,也可以采用多顶层结构。

2.2.1单顶层结构

在这种结构中Testbench只有一个顶层,顶层再把所有的

模块实例化进去。打个比方,类似树结构,只有一个模块有子节点而没有父节点,其它模块都有父节点。如图1结构所示。

图1单顶层结构图

测试模块是一些接口模型,接口模型还可能包含了一些激励。测试模块和DUV(DesignUnderVerification)之间通过端口映射进行互连。

2Testbench结构

2.1编写Testbench的目的

编写Testbench的主要目的是为了对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符,从而对设计的正确性进行验证。设计验证的过程如下:

产生模拟激励(波形)。(1)

2.2.2多顶层结构

另外一种结构是多顶层结构,如图2所示。

在这种结构中,有一个顶层是作为测试向量模块,一个或

多个顶层是一些公用的子程序,这些子程序由于完成一些通用的功能被封装成任务、函数等被公用。

还有一个叫harness的顶层,该顶层由DUV和一些接口模

作者简介:李瑛,博士研究生,主要研究方向计算机体系结构和ASIC系统设计。张盛兵,副教授,博士,主要从事计算机体系结构和ASIC系统设计

与测试等方面的研究。高德远,教授,博士生导师,主要从事VLSI系统设计研究工作。

1282003.10计算机工程与应用

型构成一个狭义上的测试平台,其它模块可以调用BFM里面的task或event等,向DUV施加激励。注意这些顶层之间是没有端口映射的,它们之间的互相调用和访问是通过层次路径名的方式来访问,图2中的虚线表示层次路径名的访问。下面举例说明层次路径是如何访问的。

图2多顶层结构图

由于大部分人对C都有所认识,在这里作个比较,以便于了解。VerilogHDL的顶层类似于C的结构体,而实例化的模块、任务、函数、变量等就是结构体内的成员,可以通过句点(.)隔开的方式访问结构体里面的每一个成员。如:顶层harness实例化进来的模块BFM1里面有一个任务SEND-DATA,该任务可以产生激励输入到DUV,在testcase里调用该任务就可写为:

initialbegin

……

harness.BFM1.SEND-DATA

(……);end

多顶层结构的可扩展和重用性比单顶层结构强得多。

3BFM模型

一个结构良好的Testbench有助于提高验证代码的可重用

性,减少Testbench设计的工作量,一种可重用的结构是

Testbench划分为harness和testcase两部分。如图3所示。

图3

BFM模型图harness作为一个module,

可以被testcase实例化,也可以两者在同一层次。两种方式testcase都可以通过任务调用的形式对harness进行访问。总线功能模型可以被同一设计的所有

Testbench甚至多个设计重用。图3所示是一个简单的可重用

Testbench结构,

实际上,根据设计的需要,可以将一些中间层次的可重用的子程序进行封装,对外通过任务调用等方式提供程序化的接口。结构化的设计不仅有利于重用,而且程序化接口的方式隐去了时序,更便于Testbench的编写。

3.1BFM简介

BFM(Busfunctionalmodel)———总线功能模型,BFM的作

用是将低层总线的时序封装起来,对高层提供一个调用接口,使得高层不用关心低层的实现细节,专注于testcase的设计。这一点类似C++中面向对象的概念,在C++里,对象相当于命令或调用,而对象的成员函数实现具体的功能,外部无须关心类内部的细节。

BFM就是针对特定设计单元的总线接口模型,例如微处

理器的总线接口模型。它不包括RTL或门级单元内部的细节。

BFM的目的是为了使验证代码的仿真速度更快,行为建模更

容易,并且模型更易使用。

图4

CPU总线功能模型

图4为一个CPU的总线功能模型,根据预定义的CPU时序,一侧为底层信号的驱动。另外一侧,提供读和写两个任务被上一层调用。

3.2基于状态机的BFM

系统级的Testbench通常需要强大的功能,以适应当今高

度集成设计的验证需求。在芯片接口中一般存在多个总线,并且彼此不同步,它们之间必须执行。在动态仿真被测模块时,基于状态机的BFM是一种好的方法。

基于状态机的BFM使用一个状态机来产生总线循环。例如处理器,状态机将产生内存读、内存写、I/O读和I/O写等循环。这类循环通常容易用状态机实现。状态机易于处理突发任务和早期中断。它可以处理特殊的循环,比如中断响应或关闭。

BFM可以有多个状态机。如可以有专门的状态机用来处

理中断。如果中断发生在总线循环有效期间,中断状态机可以将其俘获并开始唤醒中断服务程序(ISR)的译码。

BFM调用具有自检查功能的task执行总线周期,这些task分别对应不同的总线周期。例如一个读任务完成读取所需

的地址、数据,以及插入等待状态。如果期望的数据与实际不同,将报告一个错误消息。同样,如果等待状态不对,也会报告错误消息。

可以建立特定的任务来处理错误。对于较严重的错误,用户可以创建消息任务来显示错误,并唤醒=finish系统任务停止仿真。

状态机通过使用忙碌标记来与Testcode保持同步。当状

态机空闲时,忙碌标记为假,当状态机正使用时,忙碌标记为真。当一个任务正在执行时,忙碌标记可以防止响应另一个任务。这样做,可以允许testcode调入其他BFM中的任务来控制其他总线。

3.3基于任务的BFM

基于任务的BFM一般用于单元级测试。单元一般没有整

个系统复杂,因此不需要功能强大的Testbench。简单的BFM可以简化复杂模块的早期测试,尤其当单元接口简单或只有一个总线接口时。当被测单元需要完成许多计算,但使用相对少的总线周期时,基于任务的BFM将有极高的性能。因为这种

BFM在每个时钟周期的空闲状态不执行总线周期,它在任务

无效时不会触发任何信号,对输入数据也不做任何判断。

计算机工程与应用2003.10129

这种类型BFM使用任务来驱动总线信号。每个任务负责一类总线周期操作,比如读取8位数据的任务,这个任务将在正确的时钟周期内驱动信号完成读操作。并且在这个8位数据读循环中,它还负责比较实际数据和期望数据。

与状态机BFM一样,testcode通过指定Verilog的层次来调用任务。testbench顶层模块包含BFM和被测对象,test

code顶层模块包含要执行的任务。下面的例子使用fork-join

结构来驱动两个不同的总线。在读数据时,这可能引起冲突。尽管这样时序很容易出错,但是它比使用两个loop循环(一个为processor总线,

一个为PCI总线)实现起来要容易的多。在两个loop循环方式中,

使用握手信号控制数据流会更复杂。BFM中的fork-join例子:

alwaysbegin:tc1fork

tb.pci-bfm.rst(3);tb.uproc-bfm.rst

(5);join…

fork

tb.pci-bfm.rd(addr,data,ws3);tb.uproc-bfm.rd8(addr,data,ws5)

;join…

任务BFM的最大优点是当不运行总线循环时不占用仿真时间。

4结构化Testbench的设计实例

图5

ATM测试平台

图5是一个ATM的测试平台简图,它划分为发送/接收包、发送/接收信元以及UTOPIA的总线功能模型等模块。总线功能模型把UTOPIA总线的时序封装起来,对外提供了发送/接收信元两个高层任务供其它模块调用,因此在Sendcell、Receivecell等子程序中就可以不含有时延信息,

编写起来类似于C等高级语言,非常方便,可以在这些子程序的基础上编写发送各种包的tesecase,具有较好的扩充性。

1302003.10计算机工程与应用

moduletestcase;harnessinst-harness

();Initialbegin

inst-harness.reset;//网络名寻址方式的层次化调用,调用har-nessmodule

//中的复位任务reset。

inst-harness.send-packet(parameter1,parameter2……)

;…

=finish;endendmodulemoduleharness;reg……;Wire……;

bfm-utopiainst-bfm-utopia();//例化UTOPIA总线功能模型DUVinst-duv();//例化被测模块DUV

taskreset;//复位任务。…

endtask

tasksend-packet;//发送包任务。input[n:0]parameter1;input[m:0]parameter2;…

integeri;begin…

for(i=0;i;endendtaskendmodule

在上面的程序里利用网络寻址的方式(module-a.mod-ule-b.task-c)

调用了其它模块的任务。5结论

设计验证的目的就是在于尽可能早发现设计中的错误,

Testbench的设计非常关键。BFM实现起来简单并且容易理解,

通过使用和扩展BFM技术,可以缩短ASIC的设计周期。单元验证使用任务BFM来快速仿真,在系统被验证前做好一系列的测试可以节省整个工程的时间。

论文结合一个ATM测试平台的Testbench设计,探讨了设计和使用BFM的一些有用的方法。希望对开阔广大设计者的

视野有所帮助,以便设计出高效、完善的Testbench。2002年4月)

参考文献

1.JanickBergeron.WritingTestbenches-FunctionalVerificationofHDLModels[M].Boston:

KluwerAcademicPublishers,20002.BhaskerJ著.徐振林等译.VerilogHDL硬件描述语言[M].北京:机械工业出版社,2000-07

(收稿日期:

因篇幅问题不能全部显示,请点此查看更多更全内容