Disabling printing for a single field within UVM utility macros requires a nuanced approach, as the default behavior of uvm_info
, uvm_warning
, and uvm_error
macros prints information based on the verbosity level set at the transaction or component level. There's no single "disable printing" switch for an individual field. Instead, you need to control the information printed based on field values or through conditional logging.
Understanding UVM Logging
UVM's logging system uses verbosity levels to control what's printed. uvm_info
, uvm_warning
, and uvm_error
have severity levels which are compared against a global verbosity level, typically set using the $set_verbosity
system task. If the severity of the message is less than the set verbosity level, then the message isn't printed. This works on a global basis affecting all logging within a given scope.
Methods to Control Printing for a Single Field
Here are several strategies to selectively suppress printing for a particular field within your UVM environment:
1. Conditional Logging Based on Field Value
The most straightforward method is to conditionally log the field's value based on its content. You can achieve this using an if
statement inside your uvm_info
calls.
class my_transaction extends uvm_sequence_item;
rand bit [7:0] data;
rand bit [3:0] field_to_suppress;
function void print_transaction();
if (field_to_suppress != 4'h0) begin
`uvm_info("MY_TRANS", $sformatf("Data: 0x%0h, Field to suppress: 0x%0h", data, field_to_suppress), UVM_MEDIUM)
end
//The line below will only print if the field_to_suppress is 0.
else begin
`uvm_info("MY_TRANS", $sformatf("Data: 0x%0h", data), UVM_MEDIUM)
end
endfunction
...
endclass
This example only prints the field_to_suppress
if it's not equal to 4'h0
. Adapt the condition to match your specific requirement for suppressing the output.
2. Using a Separate Logging Function with Verbosity Control
Create a dedicated logging function that takes the field value and a verbosity level as arguments. You can then control the printing on a per-field basis.
function void my_log(string id, string message, int verbosity_level, bit suppress_field);
if (!suppress_field || verbosity_level >= UVM_MEDIUM)
`uvm_info(id, message, verbosity_level);
endfunction
class my_transaction extends uvm_sequence_item;
rand bit [7:0] data;
rand bit [3:0] field_to_suppress;
function void print_transaction();
my_log("MY_TRANS", $sformatf("Data: 0x%0h", data), UVM_MEDIUM, 0); //Always print data
my_log("MY_TRANS", $sformatf("Field to suppress: 0x%0h", field_to_suppress), UVM_MEDIUM, 1); //Conditional print
endfunction
...
endclass
This approach offers more granular control but adds a little complexity.
3. Modifying the Transaction Class
You can directly modify the transaction
class to not include the field in the standard display()
or print()
methods. This method is generally not preferred unless you need to fundamentally remove the field from transaction reporting.
Choosing the Best Approach
The best approach depends on your specific needs:
- Conditional Logging: Best for simple scenarios where you only need to suppress printing based on a field's value.
- Separate Logging Function: Best for more complex scenarios where you need finer control over verbosity levels and suppression logic.
- Modifying the Transaction: Only necessary if you want to completely remove the field from the reporting mechanism.
Remember to adjust the verbosity levels (UVM_HIGH
, UVM_MEDIUM
, UVM_LOW
, UVM_NONE
) as needed to suit your overall logging strategy. By employing these techniques, you can selectively disable printing for individual fields within UVM utility macros, improving the clarity and efficiency of your simulation logs.