实战学习第二章笔记_第1页
实战学习第二章笔记_第2页
实战学习第二章笔记_第3页
实战学习第二章笔记_第4页
实战学习第二章笔记_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UVM实战学第一章:UVM(语法沿用1.1特点1.是一个标准的验证平台模板,2.具备有一套完备的源码库3.支持受约束激励的产4.支持覆盖率驱动的验证模式,5.代码重用性好,可移植性1.2基UVM最大的优点在于他有一个源码库,从而支持他可以在同一平台进行多种验证,并包含有第二章:简单的UVM验证平台的搭一个简单的验证平台由driver,scor,monitor,referencemodel(所有的组件在建立时,都是派生自uvm中的基类)组成。在引入agentsequence的概念之后建立起了典型的结构。driver的建注:uvm验证平台中所有的组件都应该是派生自uvm中的类的。 ponents的类的new都有两个参数,一个是string类型的名字,一个 ponents的类型parent。(driver也是派生自 driver中所做的事情几乎都是在main_phase(uvm定义的)中完成。uvmphase来管理平台运行,采用xxxx_phase命名,并带有一个类型为uvm_phase的参数和名字为phase的参数;`uvm_info("string1","string2",level);(作用和disy函数很像,但是比他强大level:UVM_LOW表示信息非常关键;UVM_HIGH:表示信息可有可无;UVM_MEDIUM介于两者在使用uvm搭建平台是,在top层需要加`include"uvm_macro.svh"// 包含了uvm的import 包含uvm必要得内factory注:所有派生 ponent及其派生的类都应该采 ponent_utils优点:不用在top中进行类,他会自动创建一个类语法:1.在类中加上 2.在top中不用进行类的初始化和和对main_phase的显示调用,直接运行类的程序,采用run_test("class_name")initialuvm里面只要采 ponent_utils,那么在实例化类时候,就会自动调用执objection机注意:在每个phase中,uvm会检查是否有objection被提起,有的话会等待objection被撤销才因此,需要在phase里面加入objection才可以objection必须在第一个耗时语句前。加入虚接口(virtual使用宏(但对于信号复杂时候,可能需要定义很多宏,反而不方便了使用接在类中,需要采用虚接口的方式把接口传递给他。只有模块名,可直接用于类中interface独立定义,不需要从 ponent中扩展,在top里面进行实例化后(input_if)进行调用。在driver里面必须采用虚接口的方式(vif)对其进行定义,然后使用。问题来了:怎么把topdrive里面的接口对应起来呢?引入了config_db分两步:setget完成。top完成set设置initialuvm_config_db#(virtualmy_if)::set(null,"uvm_test_top","vif",input_if);my_driver中设置virtualfunctionviodbuild_phase(uvm_phasephase)if(!uvm_config_bd#(virtualmy_if)::get(this,"","vif",vif))//使用::的都是静态函`uvm_fatal("my_driver","virtualinterfacemustbesetforvif")说明:set和get有四个参数:第三个参数需要保持一致,第四个参数表示需要传递和接受uvm是通过run_test来判断谁是uvm_test_top的加入其它组简单点看就是传递的数据包注意:1,transction基类是uvm_sequence_item2.采用uvm_object_utils()进在完成transction后,可以在driver中实例化-随机化-把transction要传递的内容压缩成数据(满足传输协议对数据进行处理,压缩),之后传给dirver里的输入端口内env相当于一个容器用来实例化各个组件;(这是因为前面讲的run_test只能实例化一个模扩展于注意采用factory机制,2.在build_phase里面完成模块的实例化--这里模块的实例化不是通过new函数的,而是通过drv=my_driver::type_id::create("drv",this)的语法完成例化(例化前需要先声3.此时,top里面run_test(env)变成env了,env变成了uvm树的树根,其他的是build_phase里面实例化的因为driver不再是树根了,因此测试接口传递的uvm_config_dbsetget的路径产生了变化monitor是收集dut的端口数据,并将其转换成transction交给后续的referencemodel或scor处理注意:1,所有monitor来自于uvm_monitor,采用factory机制if(!uvm_config_db#(virtual`uvm_fatal("my_driver","virtualinterfacemustbesetfor捕获接口taskmy_monitor::main_phase(uvm_phasephase);my_transctiontr;while(1)begin因为monitor时刻捕捉数据,所以采用while(1)循环达到这个目的当收集完一个transction后利用在transction中定义一个print把他打印出来,当然,后面有一field_object机制可以直接采用自带的print函数输出在my_env类中将其,并在build_phase中将其例化注意,monitor会在输入和输出的地方都进行例化,也就是有两个monitor这样的优点是monitordriver是由不同的人员设计时候,可以大大减少一方对于协议理解的错误。这两个monitor都需要在top模块里面采用config机制引入接口。封装agent用来封装driver/monitor/sequencer,不同的agent其实代表了不同的协议。采用factory机制build_phase中根据is_active变量决定是否创建drv,is_active==UVM_AVTIVE则实例化还引入了一个connect_phase但是暂时没在env中,在build_phase中例化agent,这个地方例化时,因为uvm平台中有两个agent,所以需要例化两次,区别在于,一个的i_agt.is_active=UVM_ACTIVE,另一个引入agent之后,uvm树发生变化,对于接口的config里面的路径发生变化referencereferencemodel完成和dut相同的功能,他的输出传给scor用于和monitor比较,他的复杂度取决于dut的复杂度。派生 因为referencemodel是从agent获得transction然后传输给是scor。也就是要实现通信,所以会引入数据在不同的component的传输。一般采用TLMtransctionlevelmodel通信,它具备 monitor采用了uvm_ysis_port#(needed_transction)ap;来发送transction数据在monitor中定义这个参数化的在monitor的build_phase中,将其实例化,ap=new("ap",this)ps:因为这个类来自内部所有直接用new,要是自己定义的类就要用::type_id::create()的方式例化之后再monitormain_phase里面完成transction的收集之后,将他用write内建函数写入ap里面就完成了发送到ap的作用了(ap.write(tr))采用了uvm_block_get_port#(needed_transctionport;来接受数据在model中定义这个参数化的ps:因为这个类来自uvm内部所有直接用new,要是自己定义的类就要用的方式例化之后再monitor的main_phase,直接通过port.get(tr)得到这个数在monitor和model中定义实现了各自的端口后,通信功能其实还没有实现,还要my_env中定义一个fifo将两个连起来才行,这个地方通过定义connect_phase实现:在my_env中定义uvm_tlm_ysis_fifo#(my_transction)在build_phase中对其进行实例化;直接采用在my_env中定义一个connect_phase的类,在类中完成连functionvoidmy_env::connect_phase(uvm_phasephase);注意:这个地方一般都会在agent里面也定义一个和monitor一样参数化的类uvm_ysis_port#(needed_transction)ap;然后定义一个connect_phase把这个ap指向monitorap:functionvoidmy_agent::connect_phase(uvm_phasephase);functionvoidmy_env::connect_phase(uvm_phasephase); 的数据要从两个部分获取,一个来自referencemodel,一个来自于输出的monitor。 两个uvm_block_get_port#(needed_transction)port;main_phase中要有两个进程来处理从这两个方面得到的数据,把从referencemodel得到的数据放在一个期待transction里,然后从期待transction里弹出数据(pop_front)和仿真获得的transction数据进行比较(compare数)

同时在my_env里面采用fifo完成portap的连接传输机制面很多模块里都引入了 pare函数,其实在uvm里可以采field_automation机制自动实现这三个函数:在transction里面用这里采用field了所有字段,当之后就可以直接调用系统自带的copy,compare,和函数了另外一个好处就是,可以极大的简化drivermonitor里面把数据压缩成包或者帧的过程。driver里面:可以采用pack_bytestr的所有字段变为byte流放入data_q里面,数据的排列按照field中的顺序(data_size=tr.pack_bytes(data_q)/8)monitor里面可以采用unpack_bytes把数据流打散,注意unpack_bytes操作的必须是动态数组,因此在同时,如果打散的数剧里面有动态数组,在进行unpack_bytes之前要先确定它的大小,否则打散UVM的终极大作squence机制用于产生激励,是uvm最大的特征之一。在规范化的uvm里面,driver只负责驱动transction,不负责产生transction。1.加入采用factorysequencer产生transction,driver驱动transction。一般在定义driver时候也是参数化的形式,他要驱动的类。采用参数化形式定义driver时候,就不用再对传递的transction进行和例化,直接采用内置的一个req来代表传递的transction。(有点类似Perl里面的$_变量)sequencer被加到agent里面,在agent中完成,在build_phase完成例化sequence机sequence不属于验证平台的任何一部分,他是为了帮助实现sequencer的价值建立的区别:sequence扩展于uvm_object,sequencer扩展于 ponent。所以sequence是一个短classmy_sequenceextendsuvm_sequence#(my_transction);my_transctionm_trans;functionnew(string ponentparent);virtualtaskbody();repeat(10)factory机制必须构建为带参数的类,扩展于每一个sequence都有一个body任务,当sequence启动,body走动执行`uvm_do宏定义,完成功能:1.创建一个my_transction实例,2,将其随机化,3.最终送sequencesequence发送一个transction;BUT,driver怎么sequencertransction呢?采用的是uvm的内置的变量传递!!!!!driver里有seq_item_portuvm_sequencer里有seq_item_export,然后相当于在seq_item_port<=>seq_item_export之间构建了通道,传递在定义他们时候所带的参数agentconncect_phase中把两者连接起来连接好了之后,在drivermain_phase中,采用seq_item.port.get_next_item(transction)任务向sequencertransction,并得到transction。这里一般采用while(1)循环体持续获得驱动sequence怎么向sequencertransction呢?采用的是`uvm_do的宏完成transction生成和传递。在driver取走transction后,uvm_do会一直等到item_done信号到来后才会结束。sequencesequencer连接机制在某一个componentmain_phase中就可以完成sequence的启动:my_sequence例化sq采用start函数启动:sq.start(需要定位到要传递transction给到的squencer的位置);注:objection一般伴随着sequence,通常只有在sequence出现的时候才需要提起和撤销default_sequence是常用的启动sequence的方式:使用它的方式十分简单virtualfunctionvoidbuild_phase(uvm_phasephase);config_db通常情况下是成对存在的,但在这个地方不需要再设置其他的了,uvm已经自行设置好default_sequence怎样提起和撤销objection呢采用default_sequence时候会在sequencer中自动配置一个叫start_phase的成员(无需写代码sequence中,直接利用start_phase进行提起和撤销objectionvirtualtaskbody();repeat(10)begin建造测试用

面都是把env当做uvm的树根。但是其实在正常的uvm中,是把基于uvm_test的类作为树真正的测试用例都是基于bast_test派生的类1.派生于采 ponent_utils在build_phase中实例化env,并设置default_sequenc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论