uvm实战学习笔记Word格式.docx
《uvm实战学习笔记Word格式.docx》由会员分享,可在线阅读,更多相关《uvm实战学习笔记Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
uvm_sequencer也是代
码里必须有的,所以我加了uvm_sequencer
uvm_void是一个空的虚类。
在src/base/中定义:
红框的是我们搭testbench的时候用的比较多的基类。
常用的uvm_object派生类:
sequencer给driver的transaction要派生自uvm_sequence_item,不要派生自uvm_transaction
所有的sequenee要派生自uvm_sequenee或者uvm_sequenee的派生类,可以理解为sequenee是
sequence_item的组合(集合)。
driver向sequencer索要item,sequencer检查是否有sequenee要发送
item,当发现有item待发送时,就把这个item发给driver.
常用的uvm_component派生类:
所有的driver要派生自uvm_driver.driver用来把sequence_item中的信息驱动到DUT端口上,从transaction-level向signal-level的转换。
uvm_driver需要参数(REQRSP,比uvm_component增加了几个成员。
重要的是seq_item_port和口req/rsp.(src/comps/)
monitor/scoreboard派生自uvm_monitor和口uvm_scoreboard,但是uvm_monitor和口uvm_scoreboard并没有在uvm_component基础上做扩展。
src/comps/
virtual匚LLvm_monLtoreKtendelvm_cornponent
Functinntwu
//Andinitja]1?
^=?
flnin^tcfthisclasRrisingthenormal
//cornFtriKrtor召For<
iivm_conpcnftnt.>
*^ririme"
IsT.henampofthe
//inPbT.AnceTand~parFnt~IfthshandletoThehierapcTiicalparent.r1fany,
functlunn=ustririgtlame,uvm_i_xjiuponentparent
.iit^Ai'
(idine,pdrtnt;
eridfun匚tinri
匚onststaticstringtype_nsnie
virtJislline1.ionget_"
typ^_nia[ne
returntijpe^namc
eridP-inct-LQ^i
oncela
sequencer要派生自uvm_sequencer.sequencer做了很多扩展,但是如果我们自己写的sequencer
里没有增加成员的话,可以直接写如下代码:
typedefuvm_sequencer#(传递的sequence_item类名)sequencer类名;
因为Sequencer在agent中例化,所以一般写在^ent类文件里。
reference_model派生自uvm_component.
agent要派生自uvm_agent.uvm_agent里多了一个is_active的成员。
一般根据这个active来决定是
否实例化driver和sequencer.is_active变量的数值需要在env的build_phase里设置完成(可以直接设置,也可以用uvm_config_db#(int):
:
set)。
env要派生自uvm_env.uvm_env没有对uvm_component扩展。
所有的test都要派生自uvm_test或者它的派生类。
uvm_test也没扩展
uvm_object和口uvm_component的macro
macro非常重要,事关把这些类的对象注册到factory机制中去。
uvm_objectmacro
1)对于uvm_sequence_item就统一用(假设不用parameter):
2)对于uvm.'
uvm_objec可能还需要
'
uvm_object_utils_begin(item类名)
^eqidn淙,要加上…t_w_j_@tiis类)
uvm_declare_p_sequencer(sequencer类名)的声明
uvm_componentmacro
这些uvm_component派生类者0
对于drivermonitorreference_modelscoreboardsequencercaseagentenv
要加上:
uvm_component_utils(类名)
uvm_component里的成员也可以像uvm_object里成员一样,用field_automation机制。
field_automation机制:
对于uvm_object派生类来说,field_automation机制让对象自动有的copycompareprintpackunpack等函
数,简化了实现uvm_component派生类里一些function/task的工作量
对于uvm_component派生类来说,field_automation机制最重要的是可以在build_phase中自动获取
uvm_config_db#():
set()的数值(必须加(phase))----也就是不用写uvm_config_db#():
get()
注意:
field_automation的macro的类型要和uvm_config_db的参数类型一致:
如下示例代码,field_intvsuvm_config_db#(bit[47:
0])这个时候()是不起作用的。
想要起作用的话,需要用
clone=new+copy源代码中可以看到clone函数一上来会做一次create,然后调copy函数
src/base/
UVM的树形结构
parent指针。
component的parent是什parent参数设成null,那么
uvm_component的new/create要注意第一个参数是名字,第二个参数是
UVM真正的树根是“uvm_top”.根据上面这个树结构,可以看岀一个个么。
uvm_top的parent是null。
当一个component在实例化的时候,如果
parent参数会被仿真器自动设置成uvm_root的实例uvm_top.
在章节里也提到了,sequenee在uvm_config_db#():
:
get()的时候,第一个参数设成"
null
实际就是uvm_root:
get()章节也提到了这个
层次结构函数:
get_parent()get_child(stringname)这两个分别获取parent指针和指定名字的child指针
get_children(refuvm_componentchildren[$])获取所有的child指针
get_num_children()获取child个数
get_first_child(refstringname)get_next_child(refstringname)获取child的名字(反映至Ustringname上),返回值是0/1两种情况
应用参考代码如下(改动的例子中的):
上述代码是在connet_phase中实现的。
上述代码的打印结果如下:
Thisshouldbei_agt.my_agent'
snameisuvm_test
fieldautomation机制
注意数组类型的fieldmacro比一般的要少real和event的macro.—般的对于enum类型有3个参数,而数组的只有2个参数。
联合数组的macro比较多
常用函数需要注意packunpackpack_bytesunpack_bytespack_intsunpack_ints返回值都是bit个数。
field-automation标记位
17bit中bit0copybitlno_copybit2comparebit3no_comparebit4printbit5no_printbit6record
bit7no_recordbit8packbit9no_pack
UVM_ALL_ON是’
UVM_ALL_ON|UVM_NO_PACK这样就会忽略掉packbitfield-automation的macro可以和if结合起来,参考的代码
simv+UVM_MAX_QUIT_COUNT=10
我觉得应该用不大到,就不做笔记了
config_db机制
uvm_config_db#(类型):
set/get(component指针,”…;
"
变量名字”,para4)
都是4个参数:
第一个参数是一个component指针,如果是null的话,相当于uvm_root:
第二个参数是个路径字符串,第一和第二两个参数组和成一个完整的路径
第三个参数对于set、get要完全一致,是变量名字
set的para4是数值,get的para4是变量
component中的成员变量如果:
1)component用uvm_component_utils宏注册
2)变量用field-automation宏注册
3)component的build_phase函数里有(phase)
那么可以省略get语句
跨层次多重set的时候,看set的第一个参数,层级越高,优先级越高。
调用set的时候,第一个参数尽量使用this
同层次设置的时候是时间优先
非直线设置的时候注意第一和第二参数的使用,如果需要parent指针,则要用
config_db机制支持通配符,但是作者不推荐使用通配符。
但是在对sequenee的成员set的时候需要用
通配符(章节)。
使用如下函数调试eonfig_db
check_config_usage()print_config(1/O)这两个函数在connect_phase函数中调
simv+UVM_CONFIG_DB_T