Callbacks

class uvm.reg.uvm_reg_cbs.UVMRegCbs(name='uvm_reg_cbs')[source]

Bases: UVMCallback

async pre_write(rw)[source]

Task: pre_write

Called before a write operation.

All registered pre_write callback methods are invoked after the invocation of the pre_write method of associated object (Registers, Fields, Memories, or Backdoors). If the element being written is a Registers, all pre_write callback methods are invoked before the contained uvm_reg_fields.

Backdoor - <uvm_reg_backdoor::pre_write>,

<uvm_reg_cbs::pre_write> cbs for backdoor.

Register - <uvm_reg::pre_write>,

<uvm_reg_cbs::pre_write> cbs for reg, then foreach field:

<uvm_reg_field::pre_write>, <uvm_reg_cbs::pre_write> cbs for field

RegField - <uvm_reg_field::pre_write>,

<uvm_reg_cbs::pre_write> cbs for field

Memory - <uvm_mem::pre_write>,

<uvm_reg_cbs::pre_write> cbs for mem

The rw argument holds information about the operation.

  • Modifying the value modifies the actual value written.

  • For memories, modifying the offset modifies the offset used in the operation.

  • For non-backdoor operations, modifying the access path or address map modifies the actual path or map used in the operation.

If the ~rw.status~ is modified to anything other than UVM_IS_OK, the operation is aborted.

See Generic Register Operation Descriptors for details on rw information.

virtual task pre_write(uvm_reg_item rw); endtask

Parameters

rw

async post_write(rw)[source]

Task: post_write

Called after a write operation.

All registered post_write callback methods are invoked before the invocation of the post_write method of the associated object (Registers, Fields, Memories, or Backdoors). If the element being written is a Registers, all post_write callback methods are invoked before the contained uvm_reg_fields.

Summary of callback order:

Backdoor - <uvm_reg_cbs::post_write> cbs for backdoor,

<uvm_reg_backdoor::post_write>

Register - <uvm_reg_cbs::post_write> cbs for reg,

<uvm_reg::post_write>, then foreach field:

<uvm_reg_cbs::post_write> cbs for field, <uvm_reg_field::post_read>

RegField - <uvm_reg_cbs::post_write> cbs for field,

<uvm_reg_field::post_write>

Memory - <uvm_reg_cbs::post_write> cbs for mem,

<uvm_mem::post_write>

The rw argument holds information about the operation.

  • Modifying the status member modifies the returned status.

  • Modifying the value or offset members has no effect, as the operation has already completed.

See Generic Register Operation Descriptors for details on rw information.

virtual task post_write(uvm_reg_item rw); endtask

Parameters

rw

async pre_read(rw)[source]

Task: pre_read

Callback called before a read operation.

All registered pre_read callback methods are invoked after the invocation of the pre_read method of associated object (Registers, Fields, Memories, or Backdoors). If the element being read is a Registers, all pre_read callback methods are invoked before the contained uvm_reg_fields.

Backdoor - <uvm_reg_backdoor::pre_read>,

<uvm_reg_cbs::pre_read> cbs for backdoor

Register - <uvm_reg::pre_read>,

<uvm_reg_cbs::pre_read> cbs for reg, then foreach field:

<uvm_reg_field::pre_read>, <uvm_reg_cbs::pre_read> cbs for field

RegField - <uvm_reg_field::pre_read>,

<uvm_reg_cbs::pre_read> cbs for field

Memory - <uvm_mem::pre_read>,

<uvm_reg_cbs::pre_read> cbs for mem

The rw argument holds information about the operation.

  • The value member of rw is not used has no effect if modified.

  • For memories, modifying the offset modifies the offset used in the operation.

  • For non-backdoor operations, modifying the access path or address map modifies the actual path or map used in the operation.

If the ~rw.status~ is modified to anything other than UVM_IS_OK, the operation is aborted.

See Generic Register Operation Descriptors for details on rw information.

virtual task pre_read(uvm_reg_item rw); endtask

Parameters

rw

post_read(rw)[source]

Task: post_read

Callback called after a read operation.

All registered post_read callback methods are invoked before the invocation of the post_read method of the associated object (Registers, Fields, Memories, or Backdoors). If the element being read is a Registers, all post_read callback methods are invoked before the contained uvm_reg_fields.

Backdoor - <uvm_reg_cbs::post_read> cbs for backdoor,

<uvm_reg_backdoor::post_read>

Register - <uvm_reg_cbs::post_read> cbs for reg,

<uvm_reg::post_read>, then foreach field:

<uvm_reg_cbs::post_read> cbs for field, <uvm_reg_field::post_read>

RegField - <uvm_reg_cbs::post_read> cbs for field,

<uvm_reg_field::post_read>

Memory - <uvm_reg_cbs::post_read> cbs for mem,

<uvm_mem::post_read>

The rw argument holds information about the operation.

  • Modifying the readback value or status modifies the actual returned value and status.

  • Modifying the value or offset members has no effect, as the operation has already completed.

See Generic Register Operation Descriptors for details on rw information.

virtual task post_read(uvm_reg_item rw); endtask

Parameters

rw

encode(data)[source]

Function: encode

Data encoder

The registered callback methods are invoked in order of registration after all the pre_write methods have been called. The encoded data is passed through each invocation in sequence. This allows the pre_write methods to deal with clear-text data.

By default, the data is not modified.

Parameters

data

decode(data)[source]

Function: decode

Data decode

The registered callback methods are invoked in ~reverse order~ of registration before all the post_read methods are called. The decoded data is passed through each invocation in sequence. This allows the post_read methods to deal with clear-text data.

The reversal of the invocation order is to allow the decoding of the data to be performed in the opposite order of the encoding with both operations specified in the same callback extension.

By default, the data is not modified.

Parameters

data

class uvm.reg.uvm_reg_cbs.UVMRegReadOnlyCbs(name='uvm_reg_read_only_cbs')[source]

Bases: UVMRegCbs

m_me = None
classmethod get()[source]
classmethod add(rg)[source]
create(name='')

Group: Creation

The create method allocates a new object of the same type as this object and returns it via a base uvm_object handle. Every class deriving from uvm_object, directly or indirectly, must implement the create method.

A typical implementation is as follows:

class mytype (UVMObject):
  ...
  def create(self, name=""):
    mytype t = mytype(name)
    return t
Parameters

name (str) – Name of the created object.

Returns

New object.

Return type

obj

get_object_type()

Function: get_object_type

Returns the type-proxy (wrapper) for this object. The uvm_factory’s type-based override and creation methods take arguments of uvm_object_wrapper. This method, if implemented, can be used as convenient means of supplying those arguments. This method is the same as the static get_type method, but uses an already allocated object to determine the type-proxy to access (instead of using the static object).

The default implementation of this method does a factory lookup of the proxy using the return value from get_type_name. If the type returned by get_type_name is not registered with the factory, then a None handle is returned.

For example:

class cmd (UVMObject):
  type_id = UVMObjectRegistry()
  @classmethod
  def type_id get_type(cls):
    return type_id.get()
  def get_object_type(self):
    return cmd.type_id.get()

This function is implemented by the `uvm_*_utils macros, if employed.

Returns:

classmethod get_type()

Returns the type-proxy (wrapper) for this object. The UVMFactory’s type-based override and creation methods take arguments of uvm_object_wrapper. This method, if implemented, can be used as convenient means of supplying those arguments.

The default implementation of this method produces an error and returns None. To enable use of this method, a user’s subtype must implement a version that returns the subtype’s wrapper.

For example:

class cmd(UVMObject):
  type_id = None

  @classmethod
  def get_type(cls):
    return cls.type_id.get()

Then, to use:

factory.set_type_override(cmd.get_type(), subcmd.get_type())

This function is implemented by the uvm_*_utils functions, if employed.

Returns:

get_type_name()

Returns the type name of this callback object.

Returns

Type name of this callback object.

Return type

str

type_id = <uvm.base.uvm_registry.UVMObjectRegistry object>
type_name = 'UVMRegReadOnlyCbs'
class uvm.reg.uvm_reg_cbs.UVMRegWriteOnlyCbs(name='UVMRegWriteOnlyCbs')[source]

Bases: UVMRegCbs

m_me = None
classmethod get()[source]
classmethod add(rg)[source]
create(name='')

Group: Creation

The create method allocates a new object of the same type as this object and returns it via a base uvm_object handle. Every class deriving from uvm_object, directly or indirectly, must implement the create method.

A typical implementation is as follows:

class mytype (UVMObject):
  ...
  def create(self, name=""):
    mytype t = mytype(name)
    return t
Parameters

name (str) – Name of the created object.

Returns

New object.

Return type

obj

get_object_type()

Function: get_object_type

Returns the type-proxy (wrapper) for this object. The uvm_factory’s type-based override and creation methods take arguments of uvm_object_wrapper. This method, if implemented, can be used as convenient means of supplying those arguments. This method is the same as the static get_type method, but uses an already allocated object to determine the type-proxy to access (instead of using the static object).

The default implementation of this method does a factory lookup of the proxy using the return value from get_type_name. If the type returned by get_type_name is not registered with the factory, then a None handle is returned.

For example:

class cmd (UVMObject):
  type_id = UVMObjectRegistry()
  @classmethod
  def type_id get_type(cls):
    return type_id.get()
  def get_object_type(self):
    return cmd.type_id.get()

This function is implemented by the `uvm_*_utils macros, if employed.

Returns:

classmethod get_type()

Returns the type-proxy (wrapper) for this object. The UVMFactory’s type-based override and creation methods take arguments of uvm_object_wrapper. This method, if implemented, can be used as convenient means of supplying those arguments.

The default implementation of this method produces an error and returns None. To enable use of this method, a user’s subtype must implement a version that returns the subtype’s wrapper.

For example:

class cmd(UVMObject):
  type_id = None

  @classmethod
  def get_type(cls):
    return cls.type_id.get()

Then, to use:

factory.set_type_override(cmd.get_type(), subcmd.get_type())

This function is implemented by the uvm_*_utils functions, if employed.

Returns:

get_type_name()

Returns the type name of this callback object.

Returns

Type name of this callback object.

Return type

str

type_id = <uvm.base.uvm_registry.UVMObjectRegistry object>
type_name = 'UVMRegWriteOnlyCbs'