通过uvm_printer的print_generic进行扩展打印

uvmfield automation机制实现的其中一项功能就是sprint功能,该函数通过调用do_print函数实现。在某些情况的,uvm的打印功能不是我们所期望的,比如多维数组的field automation机制就不支持,struct之类的结构体打印结果为大数。因此我们需要对uvmsprint功能进行扩展,使其打印的log内容符合我们的预期。

1. do_print函数的定义

virtual function void do_print( uvm_printer printer );
	super.do_print( printer );
	//print customed variables or structs
	...
endfunction: do_print

2. print_generic

uvm源码中对uvm_sequen_item的打印是通过调用如下函数实现的,因此我们可以通过调用该函数实现打印功能扩展。

virtual function void print_generic (
   	string 	name,	  	
   	string 	type_name,	  	
   	int 	size,	  	
   	string 	value,	  	
   	byte 	scope_separator	 = 	"."
)

功能描述:Prints a field having the given name, type_name, size, and value.

3. application example

假如我们在扩展的uvm_transaction中定义了如下的结构体变量:

typedef struct {
       bit [7:0] x;
       bit [7:0] y;
       bit [7:0] z;
} point_s

point_s p;

`uvm_field_int(p, UVM_ALL_ON)
...

如果要对uvm_transaction的派生类的实例调用sprint函数进行打印,p打印的结果为整数,而我们期望的结果是打印出p的x,y,z的值。

通过对do_print函数的扩展可以实现上述功能,如下:

virtual function void do_print( uvm_printer printer );
	super.do_print( printer );
	//print customed variables or structs
	printer.print_generic(
   		"p",  	
   		"struct"
   		$size(p),	  	
   		$sformatf("x='h%0h,y='h%0h,z='h%0h",p.x,p.y,p.z)
	);
endfunction: do_print
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 题目中提到的'b'uvm_table_printer\xe7\x9a\x84\xe7\x94\xa8\xe6\xb3\x95''指的是UVM库中的一个函数,用于打印UVM测试环境中的各种表格、列表等数据结构。调用该函数可以方便地查看、检测测试环境中的数据是否正确,从而提高编写测试用例的效率和可靠性。 ### 回答2: uvm_table_printer是UVM中一个非常实用的工具类,可以将UVM测试框架中的数据转化为易于阅读和理解的表格形式展示。uvm_table_printer所支持的数据类型包括UVM组件、UVM序列、UVM事务以及用户自定义的数据类型。 使用uvm_table_printer需要以下几个步骤: 1. 创建uvm_table_printer实例:可以使用默认构造函数或者自定义构造函数,创建一个uvm_table_printer实例。 2. 设定需要打印数据的粒度:可以通过uvm_table_printer的成员函数set_depth()来设置需要打印的数据粒度。例如,如果要打印所有组件及其下面的所有序列和事务,可以将深度设置为UVM_COMPONENT。 3. 设置需要打印的数据类型:使用uvm_table_printer的成员函数add_container()来指定需要打印的数据类型。可以指定UVM组件、UVM序列、UVM事务以及用户自定义的数据类型。如果不指定数据类型,uvm_table_printer会默认打印所有类型的数据。 4. 打印数据:使用uvm_table_printer的成员函数print()来打印数据。此函数可以接受一个参数,用于指定打印的目标。例如,可以将数据打印到文件、标准输出或者UVM报告中。 需要注意的是,使用uvm_table_printer需要在UVM测试框架中运行。在UVM测试环境中,可以在任何需要的地方调用uvm_table_printer的相关函数,来打印测试框架中的数据。 总体来说,uvm_table_printer是UVM测试框架中一个强大的工具,可以将测试框架中的数据转化为易于理解和阅读的形式,方便测试人员进行测试结果的分析和验证。同时,uvm_table_printer的使用也并不复杂,只需要按照步骤依次进行即可。 ### 回答3: uvm_table_printer是UVM框架中一个非常有用的工具,用于将各种类型的数据以表格的形式打印出来。它是基于uvm_printer类实现的,它提供了一种简便的方法来格式化输出各种数据类型,包括各种UVM对象的信息。 uvm_table_printer函数定义 uvm_table_printer函数定义如下: static function void uvm_table_printer::print(vector data,A... args) 其中data是需要打印的数据,A是参数模板,它允许用户传递一些参数设置。在使用uvm_table_printer函数时,用户需要将需要打印的数据以vector形式传递给该函数。参数A是可选的,可以帮助用户更好地格式化输出数据。 使用uvm_table_printer函数打印数据 使用uvm_table_printer函数打印数据非常简单。用户只需要创建一个要打印的数据对象并将其传递给uvm_table_printer函数即可。 例如: `uvm_table_printer::print(m_vec_of_data, "Column 1", "Column 2", "Column 3");` 其中,m_vec_of_data是一个存储要打印的数据的vector对象,"Columm1","Column2"和"Column3"是表格中每一列的标题。在这种情况下,打印出的表格将包括三列:Column 1、Column 2和Column3。 设置列宽和对齐方式 当打印表格时,用户可以使用uvm_table_printer的一些其他函数来设置列的宽度和对齐方式。下面是一些常用的函数: set_col_widths(string widths) 该函数用于设置表格中每一列的宽度。用户可以通过指定一串 csv 格式的数字来设置每一列的宽度。例如,如果要将表格中的第一列设置为10个字符宽度,第二列设置为20个字符宽度,第三列设置为30个字符宽度,可以使用如下代码来实现: `printer.set_col_widths("10,20,30");` set_alignment(string alignments) 该函数用于设置表格中每一列的对齐方式。用户可以通过设置csv格式的字符来指定对齐方式,其值可以为 'L'、'C'和 'R',分别表示左对齐、居中对齐和右对齐。例如,如果要将表格中的第一列设置为左对齐,第二列设置为中心对齐,第三列设置为右对齐,可以使用如下代码来实现: `printer.set_alignment("L,C,R");` 总之,uvm_table_printer是UVM框架中非常有用的工具,可以用于将各种类型的数据以表格的形式打印出来。它提供了简单且灵活的方法,方便用户对数据进行格式化输出,使得数据的阅读和理解更加便捷和直观。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunvally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值