• packing: 将一组数据(item中的某些域 da sa payload)打包到一个比特数组(bit流)中。
  • unpacking:将一个比特数组拆解成一组数据(item中的某些域 da sa payload)。

在item中定义do_pack函数
在driver中调用

下面的这些方法属于 uvm_object class 包含的function。

  • pack
    function int pack (ref bit bitstream[], input uvm_packer packer = null)
  • pack_bytes
    function int pack_bytes (ref byte unsigned bytestream[], input uvm_packer packer = null)
  • pack_ints
    function int pack_ints (ref int unsigned intstream[], input uvm_packer packer = null)
  • do_pack (回调函数)
    virtual function void do_pack( ucm_packer packer)

使用field automation的pack; 1个bit的不会给对齐;

  • m_reg_pack是一个存放pack_bytes的动态数组;
  • item.pack_bytes(pack数组)
  • pack数组可以定义在item里边;也可以定义在使用item的地方;


在用例中调用pack_bytes函数,返回的数据长度是0,即不会进行打包处理的.
自定义do_pack函数,其按照新的排列顺序打包.

  • pack_field_int的顺序是打包的顺序,后边数字式这个field占用的bit位宽;

参考
UVM糖果爱好者教程 - 15. “Do”钩子函数

do_pack

do_pack()方法由pack(),pack_bytes()和pack_ints()方法调用。 do_pack()用于使用uvm_packer策略对象打包jelly_bean_transaction对象的每个属性。请参阅寄存器抽象了解每个属性是如何打包的。打包器决定如何包装。我们必须调用super.do_pack()来打包超类的属性(第5行)。

   virtual function void do_pack( uvm_packer packer );bit       R1; // reserved bitbit [5:0] R6; // reserved bitssuper.do_pack( packer );packer.pack_field_int( .value( flavor     ), .size( 3 ) );packer.pack_field_int( .value( color      ), .size( 2 ) );packer.pack_field_int( .value( sugar_free ), .size( 1 ) );packer.pack_field_int( .value( sour       ), .size( 1 ) );packer.pack_field_int( .value( R1         ), .size( 1 ) );packer.pack_field_int( .value( taste      ), .size( 2 ) );packer.pack_field_int( .value( R6         ), .size( 6 ) );endfunction: do_pack

do_unpack

do_unpack()方法由unpack(),unpack_bytes()和unpack_ints()方法调用。 do_unpack()用于使用uvm_packer策略对象解压jelly_bean_transaction对象的每个属性。分包器决定了拆包应该如何完成。我们必须调用super.do_unpack()来解压超级类的属性(第5行)。

   virtual function void do_unpack( uvm_packer packer );bit       R1; // reserved bitbit [5:0] R6; // reserved bitssuper.do_unpack( packer );flavor     = flavor_e'( packer.unpack_field_int( .size( 3 ) ) );color      = color_e '( packer.unpack_field_int( .size( 2 ) ) );sugar_free =            packer.unpack_field_int( .size( 1 ) );sour       =            packer.unpack_field_int( .size( 1 ) );R1         =            packer.unpack_field_int( .size( 1 ) );taste      = taste_e '( packer.unpack_field_int( .size( 2 ) ) );R6         =            packer.unpack_field_int( .size( 6 ) );endfunction: do_unpack

//eth 类型 do_pack
rand fcs_kind_t fcs_kind;rand bit [7:0] length;
rand bit [7:0] da;
rand bit [7:0] sa;
rand bit [7:0] data[];
rand byte fcs;
//9) Define do_pack() method which does the packing operation.
function void do_pack(uvm_packer packer);
super.do_pack(packer);
packer.pack_field_int(da,$bits(da));
packer.pack_field_int(sa,$bits(sa));
packer.pack_field_int(length,$bits(length));
foreach(data[i])
packer.pack_field_int(data[i],8);
packer.pack_field_int(fcs,$bits(fcs));
endfunction : do_pack//10) Define do_unpack() method which does the unpacking operation.
function void do_unpack(uvm_packer packer);
int sz;
super.do_pack(packer);da = packer.unpack_field_int($bits(da));
sa = packer.unpack_field_int($bits(sa));
length = packer.unpack_field_int($bits(length));data.delete();
data = new[length];
foreach(data[i])
data[i] = packer.unpack_field_int(8);
fcs = packer.unpack_field_int($bits(fcs));
endfunction : do_unpack

参考:PHASE 4 PACKET
UVM:2.3 为验证平台加入各个组件->2.3.7 加入field_automation机制


参考
UVM Object


$bits $size

$size() gives the number of bits for a single dimension. $bits() gives the number of bits to completely represent the variable.

For example:

reg [9:0] a;
reg [9:0] b [5:0];initial begin$display("a Size ", $size(a));$display("a Bits ", $bits(a));$display("b Size ", $size(b));$display("b Bits ", $bits(b)) ;
end
//output
//a Size          10
//a Bits          10
//b Size           6 // Depth of memory
//b Bits          60 // Width * Depth

  • pack返回的是长度;
  • m_pack调用do_pack

//uvm_object.sv
// m_pack
// ------
function void uvm_object::m_pack (inout uvm_packer packer);if(packer!=null) __m_uvm_status_container.packer = packer;else  __m_uvm_status_container.packer = uvm_default_packer;packer = __m_uvm_status_container.packer;packer.reset();packer.scope.down(get_name());__m_uvm_field_automation(null, UVM_PACK, "");do_pack(packer);packer.set_packed_size();packer.scope.up(); endfunction// pack
// ----
function int uvm_object::pack (ref bit bitstream [],input uvm_packer packer =null );m_pack(packer);packer.get_bits(bitstream);return packer.get_packed_size();
endfunction// pack_bytes
// ----------
function int uvm_object::pack_bytes (ref byte unsigned bytestream [],input uvm_packer packer=null );m_pack(packer);packer.get_bytes(bytestream);return packer.get_packed_size();
endfunction// pack_ints
// ---------
function int uvm_object::pack_ints (ref int unsigned intstream [],input uvm_packer packer=null );m_pack(packer);packer.get_ints(intstream);return packer.get_packed_size();
endfunction

uvm pack/unpack相关推荐

  1. 【从零开始学习 UVM】2.6、UVM 基础功能 —— UVM Object Pack/Unpack

    UVM自动化宏还包括将类变量打包(pack)成位或字节流的机制,以及解包(unpack)缩位流并填充类内容.在处理SPI.I2C和RS-232等串行通信形式时,这特别有用. 文章目录 三种 pack/ ...

  2. [转]PHP: 深入pack/unpack

    From : http://my.oschina.net/goal/blog/195749 http://www.w3school.com.cn/php/func_misc_pack.asp PHP作 ...

  3. python3 struct模块 处理二进制 pack unpack用法

    python有时需要处理二进制数据,例如 存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用struct来处理c语言中的结构体. struct模块中最重要的三个 ...

  4. PHP: 深入pack/unpack

    为什么80%的码农都做不了架构师?>>>    PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用.其中不乏大公司,如腾迅.盛大.淘米.新浪等.在对性能要求比较高的 ...

  5. Php pack unpack

    2019独角兽企业重金招聘Python工程师标准>>> PHP的pack和unpack主要用于把数据进行二进制化和反二进制化,一般用于网络传输或者存储数据时用,能一定程度降低数据长度 ...

  6. java pack unicode,汉字和Unicode码(utf-8)之间的转换(Pack/Unpack)

    保证你要转换的字符串编码为UTF8,如果不是,请iconv cnStr成utf8 $cnStr = "中"; $code = unpack("H6codes", ...

  7. Perl函数pack/unpack(二进制读写)

    函数名 pack 调用语法 formatstr = pack(packformat, list); 解说 把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中.参数 ...

  8. python pack unpack_golang 仿python pack/unpack

    package includes import ("bytes" "encoding/binary" "fmt"_"os" ...

  9. pack unpack 用法 转载

    原本转自于 https://segmentfault.com/a/1190000008305573 PHP中有两个函数pack和unpack,很多PHPer在实际项目中从来没有使用过,甚至也不知道这两 ...

最新文章

  1. 94. 二叉树的中序遍历(迭代)
  2. fiddler 在火狐(firefox)下无效的问题 ——Fiddler监听Firefox、Chrome中的http请求
  3. 1. 写出一个能创建多级目录的 PHP 函数(新浪网技术部)
  4. Python 面向对象 —— super 的使用(Python 2.x vs Python 3.x)
  5. 4.12任务 apache结合php以及apache默认虚拟主机
  6. 遇到一个在linux下无法跨网段发送接收广播包的问题
  7. xampp中apache点击启动失败解决方法
  8. C# 获取动态类中所有的字段
  9. n1盒子救砖_斐讯N1盒子刷机救砖教程
  10. ubuntu 18.04 安装NFS 共享文件夹,Linux挂载,Mac 挂载
  11. 贵州大学计算机研究生排名,贵大计算机研究生怎么样?
  12. 布道微服务_18服务配置中心设计方案
  13. 一文看懂并了解5G网络切片
  14. 超声在早期银屑病关节炎中的应用价值
  15. Java反射面试题(2020)
  16. 这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!!
  17. oracle 抓包工具,【转】抓包工具Wireshark详解(抓取IOS中APP的请求)
  18. 微信公众号-自动聊天机器人
  19. Java常见面试题整理(一)
  20. Midway-ModelProxy — 轻量级的接口配置建模框架

热门文章

  1. OSError: [WinError 1455] 页面文件太小,无法完成操作和AttributeError: ‘NoneType‘ object has no attribute ‘_free_wea
  2. 重定向和CSFB返回场景优先ENDC选网介绍
  3. 吸烟者问题(有例题!!!)
  4. 易之 - 我是个算命先生(2014年3月23日)
  5. 基于 layui 的纯前端框架 cy-ui
  6. lua(1):lua,luarocks介绍及lua库安装
  7. 【5G核心网】Packet Forwarding Model 数据包转发模型
  8. 从粗放式到精益化编程
  9. 数据分析案例 自行车公司
  10. 云服务器部署nginx