uvm_packer

UVMkit » 1800.2-2017

The uvm_packer class provides a policy object for packing and unpacking uvm_objects.  The policies determine how packing and unpacking should be done.  Packing an object causes the object to be placed into a bit (byte or int) array.  If the `uvm_field_* macro are used to implement pack and unpack, by default no metadata information is stored for the packing of dynamic objects (strings, arrays, class objects).

Contents
uvm_packerThe uvm_packer class provides a policy object for packing and unpacking uvm_objects.
uvm_packerImplementation of uvm_packer, as defined in section 16.5.1 of 1800.2-2017

uvm_packer

Implementation of uvm_packer, as defined in section 16.5.1 of 1800.2-2017

Summary
uvm_packer
Implementation of uvm_packer, as defined in section 16.5.1 of 1800.2-2017
Class Hierarchy
Class Declaration
class uvm_packer extends uvm_policy
set_packed_*Implementation of P1800.2 16.5.3.1
get_packed_*Implementation of P1800.2 16.5.3.2
Packing
pack_fieldPacks an integral value (less than or equal to 4096 bits) into the packed array.
pack_field_intPacks the integral value (less than or equal to 64 bits) into the pack array.
pack_stringPacks a string value into the pack array.
pack_timePacks a time value as 64 bits into the pack array.
pack_realPacks a real value as 64 bits into the pack array.
pack_objectPacks an object value into the pack array.
Unpacking
is_nullThis method is used during unpack operations to peek at the next 4-bit chunk of the pack data and determine if it is 0.
unpack_fieldUnpacks bits from the pack array and returns the bit-stream that was unpacked.
unpack_field_intUnpacks bits from the pack array and returns the bit-stream that was unpacked.
unpack_stringUnpacks a string.
unpack_timeUnpacks the next 64 bits of the pack array and places them into a time variable.
unpack_realUnpacks the next 64 bits of the pack array and places them into a real variable.
unpack_objectUnpacks an object and stores the result into value.
get_packed_sizeReturns the number of bits that were packed.
Variables
physicalThis bit provides a filtering mechanism for fields.
abstractThis bit provides a filtering mechanism for fields.
big_endianThis bit determines the order that integral data is packed (using pack_field, pack_field_int, pack_time, or pack_real) and how the data is unpacked from the pack array (using unpack_field, unpack_field_int, unpack_time, or unpack_real).
pack_object_with_metaPacks obj into the packer data stream, such that it can be unpacked via an associated unpack_object_with_meta call.
pack_object_with_meta is not compatible with <unpack_object>and is_null.
unpack_object_with_metaUnpacks an object which was packed into the packer data stream using pack_object_with_meta.
unpack_object_with_meta is not compatible with <pack_object>or is_null.

set_packed_*

Implementation of P1800.2 16.5.3.1

The LRM specifies the set_packed_* methods as being signed, whereas the uvm_object::unpack methods are specified as unsigned.  This is being tracked in Mantis 6423.

The reference implementation has implemented these methods as unsigned so as to remain consistent.

virtual function void set_packed_bits( ref bit unsigned stream[] );
virtual function void set_packed_bytes( ref byte unsigned stream[] );
virtual function void set_packed_ints( ref int unsigned stream[] );
virtual function void set_packed_longints( ref longint unsigned stream[] );

@uvm-contrib This API is being considered for potential contribution to 1800.2

get_packed_*

Implementation of P1800.2 16.5.3.2

The LRM specifies the get_packed_* methods as being signed, whereas the uvm_object::pack methods are specified as unsigned.  This is being tracked in Mantis 6423.

The reference implementation has implemented these methods as unsigned so as to remain consistent.

virtual function void get_packed_bits( ref bit unsigned stream[] );
virtual function void get_packed_bytes( ref byte unsigned stream[] );
virtual function void get_packed_ints( ref int unsigned stream[] );
virtual function void get_packed_longints( ref longint unsigned stream[] );

@uvm-contrib This API is being considered for potential contribution to 1800.2

pack_field

virtual function void pack_field ( uvm_bitstream_t  value,
int  size )

Packs an integral value (less than or equal to 4096 bits) into the packed array.  size is the number of bits of value to pack.

pack_field_int

Packs the integral value (less than or equal to 64 bits) into the pack array.  The size is the number of bits to pack, usually obtained by $bits.  This optimized version of pack_field is useful for sizes up to 64 bits.

pack_string

virtual function void pack_string ( string  value )

Packs a string value into the pack array.

When the metadata flag is set, the packed string is terminated by a null character to mark the end of the string.

This is useful for mixed language communication where unpacking may occur outside of SystemVerilog UVM.

pack_time

virtual function void pack_time ( time  value )

Packs a time value as 64 bits into the pack array.

pack_real

virtual function void pack_real ( real  value )

Packs a real value as 64 bits into the pack array.

The real value is converted to a 6-bit scalar value using the function $real2bits before it is packed into the array.

pack_object

virtual function void pack_object ( uvm_object  value )

Packs an object value into the pack array.

A 4-bit header is inserted ahead of the string to indicate the number of bits that was packed.  If a null object was packed, then this header will be 0.

This is useful for mixed-language communication where unpacking may occur outside of SystemVerilog UVM.

is_null

virtual function bit is_null ()

This method is used during unpack operations to peek at the next 4-bit chunk of the pack data and determine if it is 0.

If the next four bits are all 0, then the return value is a 1; otherwise it is 0.

This is useful when unpacking objects, to decide whether a new object needs to be allocated or not.

unpack_field

virtual function uvm_bitstream_t unpack_field ( int  size )

Unpacks bits from the pack array and returns the bit-stream that was unpacked.  size is the number of bits to unpack; the maximum is 4096 bits.

unpack_field_int

virtual function uvm_integral_t unpack_field_int ( int  size )

Unpacks bits from the pack array and returns the bit-stream that was unpacked.

size is the number of bits to unpack; the maximum is 64 bits.  This is a more efficient variant than unpack_field when unpacking into smaller vectors.

unpack_string

virtual function string unpack_string ()

Unpacks a string.

num_chars bytes are unpacked into a string.  If num_chars is -1 then unpacking stops on at the first null character that is encountered.

unpack_time

virtual function time unpack_time ()

Unpacks the next 64 bits of the pack array and places them into a time variable.

unpack_real

virtual function real unpack_real ()

Unpacks the next 64 bits of the pack array and places them into a real variable.

The 64 bits of packed data are converted to a real using the $bits2real system function.

unpack_object

virtual function void unpack_object ( uvm_object  value )

Unpacks an object and stores the result into value.

value must be an allocated object that has enough space for the data being unpacked.  The first four bits of packed data are used to determine if a null object was packed into the array.

The is_null function can be used to peek at the next four bits in the pack array before calling this method.

get_packed_size

virtual function int get_packed_size()

Returns the number of bits that were packed.

physical

bit physical = 1

This bit provides a filtering mechanism for fields.

The abstract and physical settings allow an object to distinguish between two different classes of fields.  It is up to you, in the uvm_object::do_pack and uvm_object::do_unpack methods, to test the setting of this field if you want to use it as a filter.

abstract

bit abstract

This bit provides a filtering mechanism for fields.

The abstract and physical settings allow an object to distinguish between two different classes of fields.  It is up to you, in the uvm_object::do_pack and uvm_object::do_unpack routines, to test the setting of this field if you want to use it as a filter.

big_endian

bit big_endian = 0

This bit determines the order that integral data is packed (using pack_field, pack_field_int, pack_time, or pack_real) and how the data is unpacked from the pack array (using unpack_field, unpack_field_int, unpack_time, or unpack_real).  When the bit is set, data is associated msb to lsb; otherwise, it is associated lsb to msb.

The following code illustrates how data can be associated msb to lsb and lsb to msb:

class mydata extends uvm_object;

  logic[15:0] value = 'h1234;

  function void do_pack (uvm_packer packer);
    packer.pack_field_int(value, 16);
  endfunction

  function void do_unpack (uvm_packer packer);
    value = packer.unpack_field_int(16);
  endfunction
endclass

mydata d = new;
bit bits[];

initial begin
  d.pack(bits);  // 'b0001001000110100
  uvm_default_packer.big_endian = 0;
  d.pack(bits);  // 'b0010110001001000
end

pack_object_with_meta

Packs obj into the packer data stream, such that it can be unpacked via an associated unpack_object_with_meta call.

Unlike pack_object, the pack_object_with_meta method keeps track of what objects have already been packed in this call chain.  The first time an object is passed to pack_object_with_meta after a call to <flush>, the object is assigned a unique id.  Subsequent calls to pack_object_with_meta will only add the unique id to the stream.  This allows structural information to be maintained through pack/unpack operations.

pack_object_with_meta is not compatible with <unpack_object>

and is_null.  The object can only be unpacked via unpack_object_with_meta.

@uvm-contrib This API is being considered for potential contribution to 1800.2

unpack_object_with_meta

Unpacks an object which was packed into the packer data stream using pack_object_with_meta.

Unlike unpack_object, the unpack_object_with_meta method keeps track of what objects have already been unpacked in this call chain.  If the packed object was null, then value is set to null.  Otherwise, if this is the first time the object’s unique id has been encountered since a call to <flush>, then unpack_object_with_meta checks value to determine if it is the correct type.  If it is not the correct type, or if value is null, then the packer shall create a new object instance for the unpack operation, using the data provided by pack_object_with_meta.  If value is of the correct type, then it is used as the object instance for the unpack operation.  Subsequent calls to unpack_object_with_meta for this unique id shall simply set value to this object instance.

unpack_object_with_meta is not compatible with <pack_object>

or is_null.  The object must have been packed via pack_object_with_meta.

@uvm-contrib This API is being considered for potential contribution to 1800.2

virtual class uvm_void
The uvm_void class is the base class for all UVM classes.
virtual class uvm_object extends uvm_void
The uvm_object class is the base class for all UVM data and hierarchical classes.
virtual class uvm_policy extends uvm_object
The abstract uvm_policy class provides a common base from which all UVM policy classes derive Implementation as per Section 16.1 UVM Policy
class uvm_packer extends uvm_policy
Implementation of uvm_packer, as defined in section 16.5.1 of 1800.2-2017
virtual function void pack_field ( uvm_bitstream_t  value,
int  size )
Packs an integral value (less than or equal to 4096 bits) into the packed array.
virtual function void pack_string ( string  value )
Packs a string value into the pack array.
virtual function void pack_time ( time  value )
Packs a time value as 64 bits into the pack array.
virtual function void pack_real ( real  value )
Packs a real value as 64 bits into the pack array.
virtual function void pack_object ( uvm_object  value )
Packs an object value into the pack array.
virtual function bit is_null ()
This method is used during unpack operations to peek at the next 4-bit chunk of the pack data and determine if it is 0.
virtual function uvm_bitstream_t unpack_field ( int  size )
Unpacks bits from the pack array and returns the bit-stream that was unpacked.
virtual function uvm_integral_t unpack_field_int ( int  size )
Unpacks bits from the pack array and returns the bit-stream that was unpacked.
virtual function string unpack_string ()
Unpacks a string.
virtual function time unpack_time ()
Unpacks the next 64 bits of the pack array and places them into a time variable.
virtual function real unpack_real ()
Unpacks the next 64 bits of the pack array and places them into a real variable.
virtual function void unpack_object ( uvm_object  value )
Unpacks an object and stores the result into value.
virtual function int get_packed_size()
Returns the number of bits that were packed.
bit physical = 1
This bit provides a filtering mechanism for fields.
bit abstract
This bit provides a filtering mechanism for fields.
bit big_endian = 0
This bit determines the order that integral data is packed (using pack_field, pack_field_int, pack_time, or pack_real) and how the data is unpacked from the pack array (using unpack_field, unpack_field_int, unpack_time, or unpack_real).
Packs the integral value (less than or equal to 64 bits) into the pack array.
Unpacks an object which was packed into the packer data stream using pack_object_with_meta.
Packs obj into the packer data stream, such that it can be unpacked via an associated unpack_object_with_meta call.
function int unpack ( ref  bit  bitstream[],   
input  uvm_packer  packer  =  null )
function int pack ( ref  bit  bitstream[],   
input  uvm_packer  packer  =  null )
virtual function void do_pack ( uvm_packer  packer )
The do_pack method is the user-definable hook called by the pack methods.
virtual function void do_unpack ( uvm_packer  packer )
The do_unpack method is the user-definable hook called by the unpack method.