preface:
在uvm_compare中已经做了详细解释,这里就直接剖析这个类。本类的目的非常简单提供一个packer的工具,可以处理uvm_object中各种情况下的packer需求。由于这个类可以用户自定义,从而提供同一个方法的不同实现,故也叫policy
object。
content:
1. bit physical = 1; bit
abstract = 0;在do_pack ordo_unpack中起到控制作用,选择不同的实现方式
2. bit use_metadata =
0;这个标志告诉uvm_object在做pack和unpack的时候可以根据不同的对象类型添加或者取出一个额外的信息在数据的头或者尾部。作为处理过程中的一些标志信号。
3. bit big_endian =
1;大端字节序,高位在寄存器的低地址,低位在高地址,按上边源代码中的列子好像有点不对;小端:高位值在高地址,低位值在低地址,一般的做法并不会把每个byte内部的值倒转,即byte内部仍然按小端字节序。
4. static
bit bitstream[]; 所有packer共享的一个静态数组,for
(un)pack_bytes
5. static
bit fabitstream[]; // field automation bits for
(un)pack_bytes和上边的数组做相同理解,如果函数遇到在做详细解释。
6.
int count = 0; 记录pack了多少个bit的一个中间变量
7.
uvm_scope_stack scope= new;packer自己的scope,估计一些中间过程会使用到这个packer
8.
uvm_recursion_policy_enum policy =
UVM_DEFAULT_POLICY;递归的策略,和uvm_compare类似
9.
uvm_pack_bitstream_t m_bits =
0;一个很大的logic[max:0]结构,存储pack的结果用
10. int
m_packed_size = 0;记录m_bits的大小
11.function void
uvm_packer::reset();把count,m_bits,m_packed_size
置零
12.function void
uvm_packer::set_packed_size();工具函数,把m_packed_size=count,count=0;
13.function
uvm_pack_bitstream_t uvm_packer::get_packed_bits();返回m_bits
14.function
void uvm_packer::get_bits(ref bit unsigned bits[]);把m_bits复制一份
15.function
void uvm_packer::get_bytes(ref byte unsigned
bytes[]);把m_bits按byte格式复制一份
16.function void uvm_packer::get_ints(ref int unsigned
ints[]);类似15
17.function void uvm_packer::index_error(int index, string id, int
sz);如果index超过了m_bits中给定的范围就会打印一个错误信息,sz可以用来设置进制,如2进制设置1,10进制设置32,8进制设置8
18.function bit uvm_packer::enough_bits(int needed, string
id);在做unpack前检查被unpack的对象是否有足够的位数。如enough_bits(64,"real")
将检查m_packed_size-count<64否,否者将报告错误信息。
19.function void uvm_packer::put_bits (ref bit bitstream
[]);把bitsream复制给m_bits,把bitsream的大小复制给m_packed_size,把count=0;
20.function void uvm_packer::put_bytes (ref byte unsigned
bytestream []);类似19
21.function void uvm_packer::put_ints (ref int unsigned intstream
[]);类似19
22.function bit unsigned uvm_packer::get_bit(int unsigned
index);取回m_bits[index],取前先检查index是否在enough_bis(1,"bit")合法范围内
23.function byte unsigned uvm_packer::get_byte(int unsigned
index);类似22
24.function int unsigned uvm_packer::get_int(int unsigned
index);类似22
25.function void uvm_packer::pack_object(uvm_object
value);对object进行pack.
该函数首先检查__m_uvm_status_container.cycle_check.exists(value)看是否已经有一个任务在处理这个object。这里可以看出cycle_check的作用是当一个object在被处理时记录这个object,处理完成时删除这个object,避免多个task处理同一个object.从而保证处理的异步性。相当于一个注册器,其中记录的都是正在被处理的object。如果已经被注册了则说明在处理中这个时候打印信息并返回。如果没有注册则注册这个object.如果处理的policy不是引用且value不是null,则根据use_metadata是否为1选择在m_bits前4个bits设置为1.然后调用value.do_pack(this)处理这个value。如果value为null或者处理策略为引用且use_metadata为1则把m_bits头4bits设置为0,然后把vaule从check_type中删除,处理完成。
26.function void uvm_packer::pack_field_int(logic [63:0] value, int
size);把value的前size位(根据big_endian)或者后size位放入m_bits,且把count=count+size.
27.function void uvm_packer::pack_real(real value);调用26完成
28.function
void uvm_packer::pack_time(time value);调用26完成
29.function void uvm_packer::pack_field(uvm_bitstream_t value, int
size);同26类似
30.function void uvm_packer::pack_string(string
value);根据big_endian把string塞入m_bits,根据use_metadata决定要不要在最后塞入8个bits的0
31.function bit
uvm_packer::is_null();测试塞入m_bits的对象是不是null,在pack_object的时候如果value为null会在use_metadata为1的时候在头上塞入4'b0000.
32.function void uvm_packer::unpack_object(uvm_object
value);与25类似,只是在中间调用do_unpack
33.function void uvm_packer::unpack_object_ext(inout uvm_object
value);调用32完成,只是端口不是inout类型,不是传递的句柄,也不是传递的引用。
34.function real uvm_packer::unpack_real();从m_bits中取出64位
35.function time uvm_packer::unpack_time();从m_bits中取出64位
36.function uvm_bitstream_t uvm_packer::unpack_field(int
size);从m_bits中取出size位
37.function logic[63:0] uvm_packer::unpack_field_int(int
size);从m_bits中取出size位
38.function string uvm_packer::unpack_string(int
num_chars=-1);从m_bits中取出num_chars
location:
C:\Documents and
Settings\zhliu\Desktop\uvm-1.0p1\src\base\uvm_packer.svh
加载中,请稍候......