


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、看了第1/2/3/4/5/6/8/这几个章节。第一章是综述,第二章是一个具体的例子,学习笔记从第三章相关内容开始。我个人觉得UVM重要的部分(特点的部分):1)factory 机制(override config_db )2)TLM传递3)phase 机制4)sequence-sequencer 以及 virtual seq/sqr内容中的截图基本来自于UVM源代码、书自带的例子和 应用指南及源代码分析这个PDF里的。需要结合书(UVM实战(卷1)第1版)来看这个笔记。第3章UVM基础uvm_component 和口 uvm_object常用的类名字:这个图是从作者张强的应用指南及源代码分析里
2、截得,不如书上里的图好。uvm_sequencer也是代码里必须有的,所以我加了uvm_seque nceruvm_void是一个空的虚类。在src/base/中定义:红框的是我们搭testbench的时候用的比较多的基类。常用的uvm_object派生类:sequencer 给 driver 的 transaction 要派生自 uvm_sequence_item,不要派生自 uvm_transaction所有的 sequenee 要派生自 uvm_sequenee 或者 uvm_sequenee 的派生类,可以理解为sequenee 是sequence_item 的组合(集合)。drive
3、r 向 sequencer 索要 item,sequencer 检查是否有 sequenee 要发送item,当发现有item待发送时,就把这个item发给driver.常用的 uvm_component 派生类:所有的driver要派生自uvm_driver. driver用来把sequence_item中的信息驱动到 DUT端口上, 从 transaction-level 向 signal-level 的转换。 uvm_driver 需要参数(REQ RSP,比 uvm_component 增加 了几个成员。重要的是 seq_item_port 和口 req/rsp. ( src/comp
4、s/)monitor/scoreboard 派生自 uvm_monitor 和口 uvm_scoreboard,但是 uvm_monitor 和口 uvm_scoreboard 并没有在 uvm_component基础上做扩展。src/comps/virtual 匚LLvm_monLtor eKtende lvm_cornponentFunctinnt wu/And init j a 1?=? fln i nt cf th is clasR rising the normal/ cornFtriKrtor召 For <iivm_conpcnftnt.> * ririme"
5、 Is T.he namp of the/ inPbT.AnceT and parFnt If ths handle to The hierapcTiical parent.r 1 f any,functlun n=u str irig tlame, uvm_i_xjiuponent parent.iitAi' (idine, pdrtnt ;eridfun 匚tinri匚onst static string type_nsnievirtJisl line 1.ionget_"typ_nianereturn tijpenamceridP-inct-LQionce lasequ
6、encer 要派生自 uvm_sequencer.sequencer 做了很多扩展,但是如果我们自己写的sequencer里没有增加成员的话,可以直接写如下代码:typedef uvm_sequencer #( 传递的 sequence_item 类名) sequencer 类名;因为 Sequencer在 age nt中例化,所以一般写在ent类文件里。reference_model 派生自 uvm_component.age nt要派生自uvm_age nt. uvm_age nt 里多了一个is_active的成员。一般根据这个active来决定是否实例化driver和sequencer
7、. is_active变量的数值需要在 env的build_phase里设置完成(可以直接设 置,也可以用 uvm_config_db#(int):set )。env 要派生自 uvm_env. uvm_env 没有对 uvm_component 扩展。src/comps/所有的test都要派生自uvm_test或者它的派生类。uvm_test也没扩展src/comps/uvm_object 和口 uvm_component 的 macromacro非常重要,事关把这些类的对象注册到factory机制中去。uvm_object macro1) 对于 uvm_sequence_item 就统一用
8、(假设不用 parameter):2)对于uvm. 'uvm_objec 可能还需要'uvm_object_utils_begin(item 类名)eqidn淙,要加上 t_w_j_tiis类 )'uvm_declare_p_seque ncer(seque ncer 类名)的声明uvm_comp onent macro这些uvm_component 派生类者0对于 driver mon itor refere nce_model scoreboard seque ncer case age nt env要加上:'uvm_component_utils(类名)u
9、vm_component里的成员也可以像uvm_object里成员一样,用field_automation 机制。field_automation 机制:对于 uvm_object 派生类来说,field_automation 机制让对象自动有的copy compare print pack unpack 等函数,简化了实现 uvm_component派生类里一些 function/task的工作量对于uvm_component派生类来说,field_automation 机制最重要的是可以在build_phase中自动获取uvm_config_db#():set()的数值(必须加(phase
10、)-也就是不用写uvm_config_db#():get()注意:field_automation 的macro的类型要和 uvm_config_db的参数类型一致: 如下示例代码,field_int vs uvm_config_db#(bit47:0)这个时候()是不起作用的。想要起作用的话,需要用clone = new + copy 源代码中可以看到clone函数一上来会做一次create,然后调 copy函数src/base/UVM的树形结构pare nt 指针。comp onent 的 pare nt 是什 pare nt参数设成n ull,那么uvm_component的new/cr
11、eate要注意第一个参数是名字,第二个参数是UVM真正的树根是“ uvm_top ” .根据上面这个树结构,可以看岀一个个 么。uvm_top的pare nt是n ull。 当一个 comp on e nt在实例化的时候,如果pare nt参数会被仿真器自动设置成uvm_root的实例uvm_top.在章节里也提到了,sequenee在uvm_config_db# (): get ()的时候,第一个参数设成"null实际就是uvm_root:get()章节也提到了这个层次结构函数:get_pare nt()get_child(stri ng name)这两个分别获取pare nt指针
12、和指定名字的child指针get_children(ref uvm_component children$)获取所有的 child 指针get_num_children() 获取 child 个数get_first_child(ref string name) get_next_child(ref string name) 获取 child 的名字(反映至U string name 上), 返回值是0/1两种情况应用参考代码如下(改动的例子中的):注意:上述代码是在connet_phase中实现的。上述代码的打印结果如下:This should be i_agt. my_age nt'
13、s n ame is uvm_testfield automati on 机制注意数组类型的 field macro比一般的要少 real和eve nt的macro. 般的对于 enum类型有3个参数,而 数组的只有2个参数。联合数组的 macro比较多常用函数需要注意pack unpack pack_bytes unpack_bytes pack_ints unpack_ints返回值都是 bit 个数。field-automati on 标记位17bit 中 bit0 copy bitlno_copy bit2 compare bit3no_compare bit4print bit5no
14、_print bit6 recordbit7 n o_record bit8pack bit9 n o_packUVM_ALL_ON 是UVM_ALL_ON|UVM_NO_PACK 这样就会忽略掉 pack bit field-automation 的macro可以和if结合起来,参考的代码、uvm_object_utils_begi n(m y_tra nsacti on)is_vlan变量可以饥seqdm誌UVM束成L ON或 1,来实现vlan或非vlan 我觉得这个地方代码其实写成像UV的!AlIoN) crc_error d bit的更合理一 ALLONfsNOpACb,而 crc
15、是 UVM_ALL_ON 打印信息控制 uvm_field_i nt(vlann fol, UVM_ALL_ON) port_verbosity'_lev_fjeld_i nt(vlan_i nfo2, UVM_ALL_ON) Port_verbosit_VmUV_!nVH_info3只对当前调用ON) component 起作用 Port_verbosity_Vmi_ied_(UVM_iHf4, UVM对当前及下面所有的 component 起作 simv + UVM_VERBOSITY=UVM_HIGH 命令行方式 我觉得用这个就可以了 重载打印信息:心° 'uv
16、m_field_int(ether_type, UVM_ALL_ON) poK-seuyfldaUWWAWNG/MvARffO R); -uvmfctjRhasa 及后面LL_oiisejVM_NOPACK) LERRORf一定定数量结束仿方 真VM_ALL_ON | UVM_NOPACK) port_rmuvmqojcu0ii§t)end 设成0就是无论多少 error都不退岀 get_r返回如果是0,说明无论多少error 都0不退岀设置在main_phase前调用。这个ps:UVMUVMget_reset reset reset_re上述函数都是在、con 设置JVMset r
17、e些。然后 crc error是simv +UVM_MAX_QUIT_COUNT=10我觉得应该用不大到,就不做笔记了config_db 机制uvm_config_db#(类型):set/get(component 指针,”;"变量名字 ”,para4)都是4个参数:第一个参数是一个 component指针,如果是 null的话,相当于 uvm_root:get()第二个参数是个路径字符串,第一和第二两个参数组和成一个完整的路径第三个参数对于 set、get要完全一致,是变量名字set的para4是数值,get的para4是变量component中的成员变量如果:1)componen
18、t 用 uvm_component_utils 宏注册2) 变量用field-automation 宏注册3) component 的 build_phase 函数里有(phase)那么可以省略get语句跨层次多重set的时候,看set的第一个参数,层级越高,优先级越高。调用set的时候,第一个参数尽量使用this同层次设置的时候是时间优先非直线设置的时候注意第一和第二参数的使用,如果需要pare nt指针,则要用config_db机制支持通配符,但是作者不推荐使用通配符。但是在对sequenee的成员set的时候需要用通配符(章节)。使用如下函数调试eon fig_dbcheck_confi
19、g_usage() print_config(1/O)这两个函数在 connect_phase 函数中调simv +UVM_CONFIG_DB_TRACE注意:第二个参数设置错误不会报错!config_db机制务必要注意参数的书写。第4章UVM中的通信TLM 是 Transaction Level Modeling 缩写这章要搞清楚port export imp fifo 以及几种操作 function/task 和对应component中要实现的fun cti on/task下面的箭头方向都是控制流的方向,不是数据流方向。我觉得作为一个 VMM用户会觉得TLM有点难理解,总想用 VMM_CH
20、ANNEL去套,结果把自己搞晕。像 port 等其实是调 imp 所在 component 的 task/function.我看 UVM 源代码里有一个 uvm_seq_item_pull_port 的 class,它的基类是 uvm_port_base.在 uvm_driver 的成员seq_item_port就是这个类型的。 与它对应的是 uvm_seq_item_pull_imp , uvm_sequencer的成员 seq_item_export就是这种类型。在中会 connect它们。端口互连port是动作的发起者,export是动作接收者,但是需要以一个imp来结束。可以 port
21、 export imp port port imp 也可以 port imp export impport imp用的较多,port port imp可以用port指针赋值来实现 port port章节)操作:put get/peek transport, transport相当于一次 put+ 一次 getpeek和get的不同(章节):使用uvm_tlm_analysis_fifo 的时候,get任务会使fifo中少一个transaction ; 而peek任务是fifo把transaction复制一份发岀,内部缓存中的transaction不会减少。一般情况下peek完以后,还得调 ge
22、t。上述操作都有阻塞和非阻塞之分。port export imp 的类型也有 blocki ng和non block ing之分。port/export/imp 类型: put/get/peek/get_peek/transport blocking/nonblocking/ 不区分 blocking-nonblocking 之分imp要多一个参数,除了声明 transaction类型(或者 REQ RSP类型)以外,还要声明实现这个接口的comp onentconnect 的一定是同类型的 port/export/impTLM的关键在于"与 imp对应的component中task
23、/function的实现”。假设(B imp),那么需要实现的task/function为:A portB impTask/fu ncti onFun cti onuvm block in g put portuvm block in g put impputnon block in g putnon block in g put imptry put can putputputputtry put can putblock in g_tra nsportblock in g_tra nsporttra nsportnon block in g_tra nsportnon block in g
24、_tra nsportn b_tra nsporttran sporttra nsporttra nsportn b_tra nsportget_peekget_peekget peektry_get can _get try peek can peekget/peek/get_peek和put类似, 上述task或function必须要实现,如果用不到就写个空函数(章节)。注意 上述 task 或者 function 的参数。 put 是一个 transaction 参数,get/peek 是 output 的 transaction 参 数,transport 是一个 req 参数一个 o
25、utput 的rsq 参数。连接用connect函数实现,从名字就可以看岀来,这个必须在connect_phase中调。通信方式这节应该是本章重点。实际使用中用 analysis_portanalysis_imp 还是 port tlm_analysis_fifo port可以根据实际情况自己决定。analysis_port(analysis_export)可以连接多个 imp(一对多的通信)put和get系列端口与相应 imp的通信通常是一对一的(可以一对多,但是本书没有给岀一对多的例子章节有介绍)。analysis_port(analysis_export)更像是一个广播analysis_
26、port(analysis_export)没有阻塞和非阻塞的概念。它是一个广播,不等与它相连的其他端口的响应。analysis_port ( analysis_export )必须连的 imp 是 analysis_imp. analysismp 所在的 component 必须定 义个 write 的 function 注意:是 function代码示例:示例代码的analysis_port文件夹component C 和 B 的代码基本一致。env 的 connect_phase 函数里做 connect :comp on e nt中有多个imp的时候,如何实现 write函数?给的例子中
27、,scoreboard 有两个 imp,分另V从 output_agent 和口 reference-model 的 analysis_port 获取transaction,然后做compare.这个时候需要用:'uvm_analysis_imp_decl(_ 标记) 这个 macro,然后"write "函数变成 “ write_ 标记()"函数,analysis_port 所在component不用变,还是调 write()函数即可。代码示例如下:使用macro声明write函数变名字analysis_port 所在 component 实现不变。使用
28、 uvm_analysis_fifo (uvm_tlm_analysis_fifo ) , analysis_fifo 的本质是一块缓存 + 两个 imp. 用 fifo 来实现 port fifo port使用fifo最重要的是 选好两端的port类型,然后根据选好的两端port类型,来选择fifo上要连接的imp/export fifo 本身实现了 write() put() get() peek()等一系列的 function/task,在两端 port 所在的 component中直接调就可以。连接在fifo两端的都是port,所以connect函数的起点是两端。的示例代码:可以看到e
29、nv里声明的几个 fifo都是connect_phase函数中connect函数括号里的参数。、和是 analysis_port、和都是 block in g_get_portfifo上有很多export,但是这些 export实际都是impsrc/tlm1/上面连接的也是一个analysis_imp:源代码中实现如下:src/tlm1/uvm_a nalysismp #(T, uvm_tlm_a nalysis_fifo #(T) an alysis_export;fifo 是一个 component ,可以调一些函数来 debug : used() is_empty() is_full()
30、 flush()fifo 里缓存深度可以在 new 的时候用第三个参数设置。问题: fifo 的两端是不是一般就是 analysis_port 和 blocking_get_port ? 感觉章节开始一段文字描述是这个意思。使用 fifo 还是 imp 自己来把握。 各有各的好处。imp 可以使用 uvm_analysis_imp_decl(_ 标记 )的 macro ,有时候会很方便。而 analysis_fifo 可以用 for 循环来操作 fifo 数组,也可以带来代码的简洁。 imp 不能在 connect 和 new 的时候用 for 循环。第 5 章 UVM 验证平台的运行phas
31、e 机制所有的 phase 如下图:中间绿色的是 task phase, 两头青色的是 function phase component 的实例化是在 build_phase 中完成, object 的实例化可以在任何 phase 完成。 function phase 中除了 build_phase 都是“自下而上” 的执行 这里的上下是指的树结构中的上下。 build_phase 是“自上而下”同层次的兄弟关系的component , build phase执行顺序是根据 new时候name的字典序 -章节对于叔侄关系的 component, build phase执行顺序是深度优先。例如前
32、面UVM树中,“ scb”和"”,因为i_agt在scb前面,会执行完 i_agt,然后 drvmo nsqr,然后 o_agt,然后 mon,然后才是 scb。所有 component 的同一个 run time phase 是同时开始的。 也就是说会等其他 component 的上一个phase 结束才开始当前 phase。(phase)一定要加,其他phase的super:可以不用加.phase之间可以跳转。例如在正常工作的时候,发生了的reset,那么应该是 main_phase跳转到reset_phase. 例如:章节的示例代码jump 导致 main_phase 的 ob
33、jection 没有被 drop. 仿真发现这里会有一个 UVM WARINGING 报出来,这个问题如何解决呢? -应该不用管它simv +UVM_PHASE_TRACE可以调试 phase超时退出机制:1) 在 test 的 build_phase 里加上 (500ns,0);2) 'defi ne UVM_DEFAULT_TIMEOUT 500ns3) simv +UVM_TIMEOUT= ”500ns,YES” 控制 objection 的时机:推荐在 sequence 里的 body() task 中实现控制 objection章节示例代码:注意用 starting_phas
34、e 的判断。给 main_phase 设置 drain_time 。所谓 drain_time ,就是 main_phase 结束之后经过 drain_time 时间以后再 进入 post_main_phase 。在 test 的 main_phase task 中使用 set_drain_time 函数: objection 的调试simv +UVM_OBJECTION_TRACE章节介绍了 domain , 我觉得基本不会用这个吧 ?第 6 章 UVM 中的 sequencesequencer 将 sequenee 传递给 driver.弓I入 sequenee,带来的变化:1) uvm_
35、transaction 的派生类变成 uvm_sequence_item 的派生类2) 需要 sequencer3) driver main_phase 有变化4) 启动 sequenee (般在 case 的 build_phase 中)上述变化反映到代码中,如图 章节的示例代码 下图中有两种方法实现 my_sequencer sequence 的启动方式 (3 种):1 )在case的main_phase中:注意要设置 eseq的staring_phase。我觉得书上 6-5代码清单里有两个地方写的不合理,一个是 start 的参数应该是 sqr 的路径,另外是少了设置 starting_
36、phase2) 注意在 case 的 build_phase 中3) 更推荐用下面这种方式:sequenee 被启动后,会自动执行sequenee 的 body task (以及 pre_body mid_body post_body )在同一个sequencer上可以启动多个 sequenee,因为启动了多个,所以不能设置default_sequnee 了,需要用上面第一种方法来启动 sequenee. 但是 sequenee 的嵌套可以解决这个问题(上层 sequenee做 default_sequenee 章节)sequenee 可以用 uvm_do_pri uvm_do_pri_wit
37、h 等 maero 来设置优先级 priority, 当一个 sequeneer 上有多 个 sequenee 的时候,这个优先级就有意义了。优先级就带来sequencer的仲裁算法。默认的仲裁算法是SEQ_ARB_FIFO(杨哥遵循陷入先岀顺序,不考虑优先级),所以设置优先级以后,需要改变仲裁算法。在 ease 的 main_phase 中调函数 set_arbitration()前面提到的"嵌套seque nee "也可以像上面这样来设置仲裁算法。sequeneer 的操作:loek() grab() 获取独占权。 unloek() ungrab() 释放独占权is_r
38、elevant() 设置 sequenee 有效和无效。返回值 1 有效,返回值 0 无效wait_for_relevant() 当 sequeneer 发现启动的所有 sequenee 都无效的时候,会自动调 wat_for_relevant() task。 在 wait_for_relevant() task 中,必须使 sequenee 无效的条件清除 。is_relevant() 和 wait_for_relevant() 如果需要的话,一般是成对重载 。sequenee 相关 maero 及实现最重要的是 uvm_do 系列宏,尤其是在引入 virtual sequeneer 以后
39、uvm_do_on 系列宏用的会很多。、uvm_do_on_pri_with(SEQ_OR_ITEM,SEQR,PRIORITY,CONSTRAINTS) uvm_d(系列 macro 都是来源于这 个最 长的 maero除了 uvm_do 系列 maero 之外,还可以用 uvm_ereate + uvm_send 。 使用 uvm_ereate + uvm_send 的 优势是可以在两个 maero 之间加一些赋值操作等,当然也可以把约束随机加在这里。uvm_ereate 是实例化 transaetion , uvm_send 是把 transaetion 发送岀去。uvm_rand_se
40、nd uvm_rand_send_pri uvm_rand_send_with uvm_rand_send_pri_with 与 uvm_do 系列 maero 类似start_item 和 finish_item 上述 maero 的实际实现函数 我觉得我们代码里应该不会用这两个函数。task pre_do(bit is_item)funetion void mid_do(uvm_sequenee_item this_item)funetion void post_do(uvm_sequenee_item this_item)注意上述 task/funetion 的参数。 mid_do 和
41、post_do 因为参数是基类对象,函数重载里可能需要做$east.sequenee 进阶应用 前面提到了 uvm_do 系列宏既可以用在 uvm_sequence_item 上也可以用于 uvm_sequence ,所以 sequence 可以嵌套。sequence 中可以有 rand 成员,并且可以把 rand 成员和 transaction 的 rand 成员约束起来。 通过上面的约束,上层 sequence 里可以约束下层 sequence 里 transaction 的成员: sequence 的参数代表了它的 req 和 rsp 的 uvm_sequence_item 派生类的类名
42、。如果需要发送不同 uvm_sequence_item 派生类的对象, 那么需要把 sequence 、 sequencer 和 driver 参数声明成基类 uvm_sequence_item。由于是基类,所以在 driver中(req)的时候要做$cast转换. 因为sequenee默认参 数就是 uvm_sequence_item ,所以不用写。示例代码:driver 中的 cast 操作实际的 testbench 中,很可能会在 sequencer 里加入一些成员变量, 一般这种情况下要 declare p_sequencer 这个指针。用 macro -uvm_declare_p_s
43、equencer(sequencer 类名)在 sequenee中可以实现:章节示例问题: p_sequencer 的声明 macro 是不是一直加着 直接写在 base_sequence 里比较好。可以做一个 base_sequenee,需要p_sequencer的声明的话,写在 base_sequenee里,这样就不用每个 sequence 都声明 p_sequencer 指针了。virtual sequencevirtual sequence (virtual sequencer) 是特色。 如下图所示 :系统级环境里可能有多个 env,带来了多个sequencer/sequenee ,
44、这样在case里不好维护。实现一个virtual sequencer,里面包括指向各个 sequencer的指针;而 virtual sequenee 就像前面介绍的" sequenee 嵌套” 一样实现。由于 virtual sequencer 里有实际 sequencer的指针,所以肯定不能用“typedef uvm_sequncer .”来实现。同时,由于 virtual sequencer 有成员了, 所以在 virtual sequence 里要 declare p_sequencer, 并且指向 virtual sequencer.base_test 的 connect_
45、phase 函数中,要把 virtual sequencer 里的成员赋值到各个 env 的 sqr 上。 所以virtual sequencer 和各个 env 是同级的所谓“ virtual ”是说它本身不会发送 transaction ,所以 virtual sequencer 和 virtual sequence 都不用写 transaction 的参数(用了默认的参数)。章节示例代码virtual sequence : 声明 p_sequencer 指针,注意 uvm_do_on 的 sequencer 参数virtual sequencer 声明指针base_test 在 conn
46、ect_phase 中连接 sequencercase:设置 virtual sequencer 的 main_phase 的 default_sequenee 为 virtual sequenee.前面提到了 objection 的控制在 sequence 的 body task 中实现。现在引入了 virtual sequence 以后, objection 的控制就移到顶层 virtual sequence 的 body task 中。sequence 中尽量不要用 fork join_none ,避免执行到 endtask虽然 sequence 不是 component ,但是也可以在
47、 sequence 中使用 uvm_config_db ( 类似于 tp_tb 中使用 )。 在case中对sequenee的成员用 uvm_config_db#(类型):set()的时候要注意:sequenee由于是一个 object,它的名字可能不确定,所以这里一般用通配符。而在sequence 中 get 的时候,则使用 uvm_root:get()/或者 null 和 get_full_name() ,作为前两个参数。示例代码 set 用通配符和 get 的路径参数在sequenee中可以对testbench中的component的成员使用 uvm_config_db#(类型):set
48、(),同样因为路径 的问题,第一个参数一般是 null 或者 uvm_root:get()书上还给了一个设置sequenee自己的成员的例子,不知道有啥用.章节介绍了 uvm_config_db 的 wait_modified task ,参数只有 3 个,和 get 前三个一样。responsesequence sequencer driver 的参数有两个 : req 类型和 rsp 类型,默认情况下 rsp 和 req 一样的类型。 当 sequence 需要 driver 返回 response 的时候,就需要用到 rsp 了。sequence 中在 uvm_do macro 之后调
49、get_reponse(rsp) task, 而在 driver 中增加的代码较多: 章节示例代码get_reponse 和 put_response 对应。 注意 driver 中必须有 set_id_info 函数。 put_response 可以省略:需要 item_done 函数带 rsp 参数: (rsp) 但是当有多次 rsp 的时候,就不能这么用了。 多次的时候只能是调多次 get_reponse 和 put_responseget_response是一个阻塞的task,当sequenee没有获取到driver返回的rsp的时候,会阻塞住sequenee 的 body() ,所以
50、当 driver 不能及时返回 rsp 的时候, get_response put_response 这个机制就有问题了。 UVM 的解决方法是使用 response_handler 函数:在 pre_body() 函数中 use_reponse_handler() 打开这个功能,然后重载 response_handler(uvm_sequenee_item response) 这个函数 一般需要 $east 给 sequenee 中的 rsp 成员 . 而 sequenee 的 body task 里就不用再调 get_response 了章节代码示例:rsp 和 req 的类型可以不同,这
51、个时候注意 sequenee driver sequeneer 的参数sequenee librarysequenee library 是一系列 sequenee 的结合。 uvm_sequenee_library 本身是 uvm_sequenee 的派生类。 实现 sequenee_library 的时候要注意:1) 在 new 函数里要增加 init_sequenee_library() 函数2) 增力廿 'uvm_sequence_library_utils( 类名) 的 macro对于里面的 sequenee 只需要增加一个macro: 'uvm_add_to_seq_lib(sequenee 类名,sequence_library 类名)一个 sequence 可以加入到不同的 sequence_library 中使用 sequence_library 可以有效简化 Testcase,因为 case 中设置 sqr 的 main_phased 的 default_sequenee 是 sequence_l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网吧股份转让合同9篇
- 装修五金合同范本7篇
- 食堂临时工劳动合同
- 门面租赁转租简单版合同
- 人事专员未签订劳动合同8篇
- (买卖合同)保温材料买卖合同9篇
- 水泥 沙石购销合同范本
- 合伙拆股合同范本
- 艺人经纪的合同范本
- 弱电安装合同范本2016
- 2025届陕西省高考适应性检测(三)数学试题+答案
- 人工智能导论(天津大学)知到智慧树章节答案
- 中考数学计算题练习100道(2024年中考真题)
- MOOC 光学发展与人类文明-华南师范大学 中国大学慕课答案
- 马家河金矿选矿试验报告
- “新时代好少年”推荐表
- 园林绿化工程监理实施细则(完整版)
- 规章制度文件评审表
- 草坪学实习报告模板-Copy
- 事业单位节能减排工作实施方案
- 住宅楼消防工程施工组织设计方案(DOC39页)
评论
0/150
提交评论