2023.11.03笔记

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的区别
  1. seq.start(e.sqr)用来将sequence挂载到sequencer上面,用于在给定的序列器上启动序列。例如,如果您 有一个名为seq的序列对象和一个名为sqr的序列器对象,您可以使用以下代码来启动序列: seq.start(sqr); 这样,seq序列将在sqr序列器上启动
  2. `uvm_do宏用来在内部的child_sequence中使用,而uvm_do是一个宏,用于简化序列启动的语法。例如,如果您有一个名为seq的序列对象,您可以使用 以下代码来启动序列: `uvm_do(seq) 这样,seq序列将在当前上下文中的默认序列器上启动。
      (2). uvm_do_with宏,这个宏完成了 三个步骤(漫游P373): 
  1. sequence 或 item 的创建;
  2. sequence 或 item 的随机化;
  3. 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( ));

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值