uvm_field_automation:UVM_UNPACK

在前面的文章中已经介绍了UVM_PACK的使用方法,这篇来介绍下UVM_PACK的姊妹篇–UVM_UNPACK的使用方法.
一.相关函数
1.uvm_object定义了do_unpack.
do_unpack作为自定义的hook,可以方便用户实现定制的unpack方式.
2.uvm_obejct定义unpack、unpack_bytes、unpack_ints分别用来处理bit、byte、int类型数据流;
3.uvm_obejct定义了put_bits、put_bytes、put_ints分别用来通过bit、byte、int的形式将对应的数据转换为bit,存放在m_bits内.
4.uvm_object定义了m_unpack_pre用来获取uvm_packer,m_unpack_post内调用了do_unpack实现对数据流的解析.
5.uvm_packer中定义了多个unpack相关的函数,下面以常见的unpack_field_int为例介绍.
调用unpack_field_int时,需要传递的参数是总共获取数据的位宽,最大是64bits.每调用一次,内部的count会加上对应的位宽;在返回数据之前通过enough_bits函数确认是否有剩余足够的数据.
二.内置UNPACK函数
1.调用UVM_NOPACK
定义xaction时,会通过uvm_field_int等宏将对应的变量注册进去;通常UVM_ALL_ON后面不带其他参数,表示PACK、UNPACK等功能都打开;如果对某些变量不需要UNPACK,那么在对应变量后面添加UVM_NOPACK即可.
uvm_field_automation:UVM_UNPACK_第1张图片
2.调用unpack_bytes
在调用unpack_bytes时,那么传递进去的参数是byte类型或者bit[7:0]类型的动态数组.默认情况下,按照注册变量的顺序进行unpack.
uvm_field_automation:UVM_UNPACK_第2张图片
3.结果
uvm_field_automation:UVM_UNPACK_第3张图片
从结果中可以看出,m_reg_pack中写入的数据是1-20;注册到uvm_filed_int的字节数是17bytes,而且m_wr_rd_en没有参与unpack.
三.自定义UNPACK函数
内置函数省去了我们编写了unpack函数的烦恼,但是,如果添加了新的变量或者数据结构发生变化了就需要重新排布注册的顺序.此时,就可以通过自定义unpack函数,解决上面的问题.
在使用自定义unpack函数时,需要将内置UNPACK功能关闭.
1.关闭UNPACK功能
uvm_field_automation:UVM_UNPACK_第4张图片
2.定义UNPACK函数
在这里插入图片描述
3.结果
uvm_field_automation:UVM_UNPACK_第5张图片
从结果中可以看出,因为m_reg_addr先unpack,所以得到的值比m_rd_data的值要小
四数据量不足
在做unpack时所需要的的数据量比实际传递进来的数据量要大,会报如下的错误:
在这里插入图片描述

你可能感兴趣的:(UVM_UNPACK,c#,java)