uvm pack/unpack
- 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相关推荐
- 【从零开始学习 UVM】2.6、UVM 基础功能 —— UVM Object Pack/Unpack
UVM自动化宏还包括将类变量打包(pack)成位或字节流的机制,以及解包(unpack)缩位流并填充类内容.在处理SPI.I2C和RS-232等串行通信形式时,这特别有用. 文章目录 三种 pack/ ...
- [转]PHP: 深入pack/unpack
From : http://my.oschina.net/goal/blog/195749 http://www.w3school.com.cn/php/func_misc_pack.asp PHP作 ...
- python3 struct模块 处理二进制 pack unpack用法
python有时需要处理二进制数据,例如 存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用struct来处理c语言中的结构体. struct模块中最重要的三个 ...
- PHP: 深入pack/unpack
为什么80%的码农都做不了架构师?>>> PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用.其中不乏大公司,如腾迅.盛大.淘米.新浪等.在对性能要求比较高的 ...
- Php pack unpack
2019独角兽企业重金招聘Python工程师标准>>> PHP的pack和unpack主要用于把数据进行二进制化和反二进制化,一般用于网络传输或者存储数据时用,能一定程度降低数据长度 ...
- java pack unicode,汉字和Unicode码(utf-8)之间的转换(Pack/Unpack)
保证你要转换的字符串编码为UTF8,如果不是,请iconv cnStr成utf8 $cnStr = "中"; $code = unpack("H6codes", ...
- Perl函数pack/unpack(二进制读写)
函数名 pack 调用语法 formatstr = pack(packformat, list); 解说 把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中.参数 ...
- python pack unpack_golang 仿python pack/unpack
package includes import ("bytes" "encoding/binary" "fmt"_"os" ...
- pack unpack 用法 转载
原本转自于 https://segmentfault.com/a/1190000008305573 PHP中有两个函数pack和unpack,很多PHPer在实际项目中从来没有使用过,甚至也不知道这两 ...
最新文章
- 94. 二叉树的中序遍历(迭代)
- fiddler 在火狐(firefox)下无效的问题 ——Fiddler监听Firefox、Chrome中的http请求
- 1. 写出一个能创建多级目录的 PHP 函数(新浪网技术部)
- Python 面向对象 —— super 的使用(Python 2.x vs Python 3.x)
- 4.12任务 apache结合php以及apache默认虚拟主机
- 遇到一个在linux下无法跨网段发送接收广播包的问题
- xampp中apache点击启动失败解决方法
- C# 获取动态类中所有的字段
- n1盒子救砖_斐讯N1盒子刷机救砖教程
- ubuntu 18.04 安装NFS 共享文件夹,Linux挂载,Mac 挂载
- 贵州大学计算机研究生排名,贵大计算机研究生怎么样?
- 布道微服务_18服务配置中心设计方案
- 一文看懂并了解5G网络切片
- 超声在早期银屑病关节炎中的应用价值
- Java反射面试题(2020)
- 这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!!
- oracle 抓包工具,【转】抓包工具Wireshark详解(抓取IOS中APP的请求)
- 微信公众号-自动聊天机器人
- Java常见面试题整理(一)
- Midway-ModelProxy — 轻量级的接口配置建模框架
热门文章
- OSError: [WinError 1455] 页面文件太小,无法完成操作和AttributeError: ‘NoneType‘ object has no attribute ‘_free_wea
- 重定向和CSFB返回场景优先ENDC选网介绍
- 吸烟者问题(有例题!!!)
- 易之 - 我是个算命先生(2014年3月23日)
- 基于 layui 的纯前端框架 cy-ui
- lua(1):lua,luarocks介绍及lua库安装
- 【5G核心网】Packet Forwarding Model 数据包转发模型
- 从粗放式到精益化编程
- 数据分析案例 自行车公司
- 云服务器部署nginx