1、pack_bytes和unpack_bytes函数用法
- pack_bytes函数用于将所有的字段打包成byte流,其原型为:
extern function int pack_bytes (ref byte unsigned bytestream[ ], input uvm_packer packer=null);
例如:tr.pack_bytes(data_q),调用pack_bytes将tr中所有的字段变成byte流放入data_q中,其中data_q必须是一个动态数组
- unpack_bytes函数用于将一个byte流逐一恢复到某个类的实例中,其原型为:
extern function int unpack_bytes (ref byte unsigned bytestream[], input uvm_packer packer=null);
例如(白皮书P41):
tr.unpack_bytes(data_array)
这里使用unpack_bytes函数将data_q中的byte流转换成tr中的各个字段。unpack_bytes函数的输入参数必须是一个动态数组,所 以需要先把收集到的、放在data_q中的数据复制到一个动态数组中。由于tr中的pload是一个动态数组,所以需要在调用 unpack_bytes之前指定其大小,这样unpack_bytes函数才能正常工作
2、uvm_do常用宏:`uvm_do(m_trans)(白P45)
①、创建一个my_transaction的实例
②、将其随机化
③、最终将其送给sequencer
也可以使用start_item和finish_item的方式产生transaction
seq.start(i_agt.sqr);首先创建一个my_sequence的实例seq,然后调用start任务,start任务的参数是一个sequencer指针,必须指明,如果是在当前sequencer中启动sequence时,参数变为this,即seq.start(this);
(1). start()和`uvm_do的区别
- seq.start(e.sqr)用来将sequence挂载到sequencer上面,用于在给定的序列器上启动序列。例如,如果您 有一个名为seq的序列对象和一个名为sqr的序列器对象,您可以使用以下代码来启动序列: seq.start(sqr); 这样,seq序列将在sqr序列器上启动
- `uvm_do宏用来在内部的child_sequence中使用,而uvm_do是一个宏,用于简化序列启动的语法。例如,如果您有一个名为seq的序列对象,您可以使用 以下代码来启动序列: `uvm_do(seq) 这样,seq序列将在当前上下文中的默认序列器上启动。
(2). uvm_do_with宏,这个宏完成了 三个步骤(漫游P373):
- sequence 或 item 的创建;
- sequence 或 item 的随机化;
- sequence 或 item 的传送。
常用在sequence的send_trans中,代替了type_id和randomize
(3).宏`uvm_do_on(SEQ_OR_ITEM, SEQR)
`uvm_do_on用于显式地指定使用哪个sequencer发送此transaction。它有两个参数,第一个是transaction的指针,第二个是 sequencer的指针。当在sequence中使用uvm_do等宏时,其默认的sequencer就是此sequence启动时为其指定的sequencer,sequence将这个sequencer的指针放在其成员变量m_sequencer中。
3、使用default_sequence启动sequence
只需要config_db的set设置:(白P48)
关于详细用法,在P53页有详细示例
在top_tb中:
uvm_config_db #(uvm_object_wrapper) :: set(null, "uvm_test_top.i_agt.sqr.main_phase", "default_sequence", my_sequence::type_id::get( ));
红色部分要替换为应该启动的sequence
在my_env的build_phase启动中:
uvm_config_db #(uvm_object_wrapper) :: set(this, "i_agt.sqr.main_phase", "default_sequence", my_sequence::type_id::get( ));
只需要设置的是第一个和第二个参数的组合,路径设置,注意如果是在top_tb这个module中,因为不是class,不能使用this,要使用null。这种方式启动sequence不需要在设置config_db的get
在my_agent的build_phase中:
uvm_config_db #(uvm_object_wrapper) :: set(this, "sqr.main_phase", "default_sequence", my_sequence::type_id::get( ));