UVM实战指南.docx
《UVM实战指南.docx》由会员分享,可在线阅读,更多相关《UVM实战指南.docx(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Callback最简单的callback2012-01-21 22:06:01|分类:SystemVerilog|字号订阅在RVM、VMM、OVM/UVM中,常常提到callback这个概念。指在事先设置好的地方留下一个接口,通过向这个接口添加一些函数对象,来达到不改变代码结构而动态修改代码行为。下面用systemverilog来举一个简单的callback例子:1classcallback;23virtualtaskcb_pre_run();4$display(base callback run);5endtask:cb_pre_run67endclass:callback89classwi
2、dget;1011callback cb_queue$;1213functionvoidadd_cb(callback cb);14cb_queue.push_back(cb);15endfunction:add_cb1617taskrun();18/ add callback here19foreach(cb_queuei)begin20cb_queuei.cb_pre_run();21end22$display(widget run.);23endtask:run24endclass:widget2526moduletop;2728classext_callbackextendscallb
3、ack;29taskcb_pre_run();30$display(ext callback run);31endtask:cb_pre_run32endclass:ext_callback33widget w;34callback cb0;35ext_callback cb_ext;363738initialbegin39w=new;40cb0=new;41cb_ext=new;42w.run;43w.add_cb(cb0);44$display(=After Add base Callback);45w.run;46w.add_cb(cb_ext);47$display(=After Ad
4、d extention Callback);48w.run;49end5051endmodule;/ top在sysverilog中,没有函数指针的概念,因此必须将函数包装成为一个对象,就是上面例子中的callback class. 而为了在widget的对象中使用这个函数对象,必须事先在设计好的调用点对callback对象中的函数进行逐个调用(代码19-21行)。widget的对象事先并不知道有多少callback对象,而是将所有的callback对象放到自己的一个callback对象队列中(cb_queue)。然后逐个对这个队列中的所有对象进行函数调用。上面的程序编译执行后,结果如下:wi
5、dget run.= After Add base Callbackbase callback runwidget run.= After Add extention Callbackbase callback runext callback runwidget run.可以看出,在执行的过程中,可以对widget对象进行动态的添加callback,从而动态的改变widget对象的动作。上面的例子非常简单,仅仅是输出一些讯息而已,有一些局限:1. 这个callback结构并不能够真的改变widget对象的内部成员,以与处理的数据内容,仅仅能够输出一些讯息。2. 对每一个widget的对象,都需
6、要单独添加相关callback对象,假如程序中又创建了一个新的widget对象,那么这个对象的callback queue初始是空的,也就是没有callback。必须再次添加才能让这个新的widget调用相应的callback功能。3. callback只有一个地方,可以扩展到多个地方。另外也可以使用function,而不仅仅是task.工厂模式的简单理解首先,如果一个客户要用到一款手机,一般的做法是客户去创建一款手机,然后拿来用:这时,客户需要知道怎么去创建一款手机,客户和手机就紧密耦合在一起了.为了降低耦合,就出现了工厂类,把创建手机的操作放到了工厂里面去,客户直接使用工厂的创建手机方法,
7、传入想要的手机型号就行了,而不必去知道创建的细节.随着手机种类越来越多,简单工厂模式出现了弊端,每次新加入手机品种,工厂类都要加入新的创建逻辑.这时我们就可以把工厂类定义成了接口,而每增加一种新的手机,就增加该手机对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码:随着工厂规模的继续扩大,工厂开始生产充电器了.这时候工厂有二个系列的产品:手机和充电器.而手机必须使用对应的充电器才能使用.这时候分别使用一个手机工厂和一个充电器工厂都不能满足我们的需求,我们必须确认手机跟充电器的对应关系.我们把工厂改造一下,把手机工厂跟充电器工厂联系在一起:抽象工厂模式 工厂方法模式 简单工厂模
8、式UVM实战指南第1部分2010-10-31 21:54:15|分类:SystemVerilog|标签:uvm|字号订阅验证的复杂度已经明显超过设计。为了处理复杂度,面向对象,设计模式等软件设计的思想逐渐渗透到了硬件设计领域。UVM的适时提出,有望能够尽早一统江湖,不再有各门各派军阀割据。最近,出了一本UVM新书,工作之余,我抽空进行翻译,供大家参考。英文来源:UVM实战指南第1部分这篇文章是新书A Practical Guide to Adopting the Universal Verification Methodology的第四章 UVM library基础的节选。这一章的后续会在之后
9、4周的周一连续发表。如果等不与,可以到网站购买。作者:Sharon Rosenberg and Kathleen A. Meade, Cadence Design SystemsUVM是功能验证的第一个最佳实践和方法学。如之前提到,UVM实现了成熟的高级验证方法。尽管其类库可以任意使用,我们强烈建议按照后续章节描述的方式来使用,因为这些方法源自于成功经验。这一章讲解库的结构以与基本功能,重点放在大多数验证环境所需要的基本特征上。注意:为了简化,例子并没有完全遵循UVM建议的架构和方法学。这一章主要包括: 使用UVM库 基本类 TLM端口 工厂模式 消息和汇报 配置机制4.1 使用UVM库为了使
10、用UVM库,用户需要: 编译UVM包的顶层文件:uvm_pkg.sv 在所需要的地方导入uvm_pkg 包含UVM宏4.1.1 Hello World例子下面的例子功能是在屏幕上显示消息:Hello World!”1 / Compile the UVM package2include “uvm_pkg.sv”3 module hello_world_example;4 / Import the UVM library and include the UVM macros5import uvm_pkg:*;6include “uvm_macros.svh”7 initial begin8uvm
11、_info(“info1”,“Hello World!”, UVM _LOW)9 end10 endmodule: hello_world_example第1-2行:注释用来提醒需要编译UVM库。uvm_pkg.sv是UVM顶层文件,此文件将所有的UVM文件放在一个systemverilog文件包中。注意:SystemVerilog包需要在模块以外进行编译。建议用命令行方式进行编译。由于包常被多个单元使用,不要将包的编译绑定到某个指定的单元。第5行:当库已经编译,用户可以在任意编译单元导入此systemverilog包第6行:必须分别包含UVM宏,因为宏属于编译指令,不会在多个编译步骤中保持存
12、在。为了避免重复编译整个库,宏被分开包含。(每个需要用的宏的文件都必须包含)第8行:uvm_info宏属于UVM消息打印功能的一部分。UVM消息打印允许格式化以与控制屏幕显示。在这里,我们仅仅打印消息“Hello World!”4.1.2 UVM库使用指南 为了避免命名冲突,避免在全局环境中导入uvm_pkg. 其他的package也同样适用此原则(避免全局环境中导入) 顶层文件一般如下格式ifndef _SVHdefine _SVH. 文件内容endif这种方式允许UVM库被多个地方引用而避免重复声明,一起编译的时候仅编译一次。建议用户在自己的UVM文件中也使用此方式。 在Cadence的I
13、ncisive Enterprise Simulator(IES)仿真器中运行仿真器自带的UVM库:% irun -uvmmy 使用非仿真器自带的UVM库,使用命令行:% irun -uvmhome $UVM _HOMEmy4.2 基本类图4-1 类图描绘了UVM库中的一些类。这些类提供了一些自动机制,可以用来衍生出用户自定义的类以与类的行为。除了自动机制,这些基类还提供了支持统一和重用的API。注意:此图没有显示uvm_transaction类。 尽管这个类仍然属于库,Accellera TSC并不建议使用它。(建议使用uvm_sequence_item)后续章节讨论 uvm_object和
14、uvm_component抽象类4.3 uvm_object类抽象类uvm_object是所有UVM数据类型的基类。他的主要功能是定义完成了一系列通用的操作方式,比如创建, 复制, 打包/解包(pack/unpack), 比较, 打印, 以与记录(record). 从uvm_object衍生出来的类必须实现类似create()和get_type_name()这样的纯虚函数。以下代码演示了一个没有使用UVM object类的AMBA APB传输的例子实例41:非UVM类定义1typedefenumbit APB _READ, APB_WRITE apb _direction _enum;2cla
15、ssapb_transfer;3 rand bit 31:0 addr;4 rand bit 31:0 data;5 rand apb _direction _enum direction;6functionvoid print();7 $display(%s transfer: addr=%h data=%h, direction.name(), addr, data);8endfunction: print9endclass: apb_transfer上面简单的例子包含了一个几乎所有交易(transaction)都有的print()方法。 大部分数据项都需要打印,复制,比较,打包,解包以与
16、其他功能。如果让开发者去自已去定义这些功能,将不方便复用,环境整合者必须学习从多个地方得到的不同类的使用规则以与行为特征。UVM库通过引入uvm_object基类解决了这个问题。基类定义了一些通用的服务。测试向量中所有的类都必须间接或直接由uvm_object派生出来。UVM类库也实现了一些宏,这些宏能够自动实现打印,复制,克隆,打包(pack),解包(unpack)方法等等。实例 42: 从uvm_object继承而来的APB传输类1 typedef enum bit APB _READ, APB_WRITE apb_direction_enum;2 class apb_transfer e
17、xtendsuvm_object;3 rand bit 31:0 addr;4 rand bit 31:0 data;5 rand apb_direction_enum direction;6 / Control field - does not translate into signal data7 rand int unsigned transmit_delay; /delay between transfers8 /UVM automation macros for data items9uvm_object_utils_begin(apb_transfer)10uvm _field _
18、int(addr, UVM _DEFAULT)11uvm _field _int(data, UVM _DEFAULT)12uvm _field _enum(apb_direction _enum, direction, UVM _DEFAULT)13uvm _field _int(transmit _delay, UVM _DEFAULT | UVM_NOCOMPARE)14uvm_obj ect_utils_end15 / Constructor - required UVM syntax16 function new (string name=apb _transfer);17 supe
19、r.new(name);18 endfunction : new19 endclass : apb_transfer第9-14行: UVM自动宏第16-18行:在数据对象中构造函数并不是必须的。如果使用构造函数,它的所有的参数都必须有缺省值. (针对uvm_object如此,但是uvm_component并不是这样,其parent参数并没有缺省值,因为不可能在类中知道其父组件)4.3.1 UVM自动域使用uvm_object_utils_begin(TYPE)和uvm_object_utils_end宏来完成UVM对象的基本操作声明。 实现get_type_name()函数,此函数返回内容为这
20、个对象类型名字的字符串 实现create()函数,此函数通过调用指定类型的构造函数来创建一个对象 在工厂中注册此类型,以便在测试向量中的其他地方能够被重载 实现一个静态方法get_type(),此方法在工厂操作中需要被用到uvm_field_*宏将自动实现指定域的一些对象方法:print(), copy(), clone(), pack(), unpack(), compare(),以与record()。支持嵌套对象以与用户自定义。宏语法如下:语法:uvm_field_*(field_name,flag)“field_name”必须是类的某个属性的标识符;“flag”用来定制此域的自动化。“f
21、lag”是一数字,可以用或“|”或者“+”进行组合。此语法适合:对象、字符串、事件(event)、实数、队列、以与不同类型的数组。域自动有多种形式,请参考UVM参考手册。4.3.2 uvm_object定义指南 建议从uvm_sequence_item继承对象,此方式能够给对象增加一些额外的域,同时允许对象成为uvm_sequence随机的一部分。 对uvm_field_*宏使用UVM_DEFAULT作为“flag”参数(而不是UVM_ALL_ON)。目的是为了让UVM架构增加一些缺省下并不打开的自动功能。其他一些标志是用来去掉一些自动化功能的。 在构造函数中的参数中将类名字设置为缺省值 不要
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UVM 实战 指南
限制150内