配置 'print' 以显示完整的结构字段
Configure 'print' to display full struct fields
我的嵌套结构定义如下:
struct some_struct {
some_field : uint;
some_struct_field : some_other_struct;
some_other_field : uint;
};
struct some_other_struct {
some_field : uint;
some_other_field : uint;
};
当我打印 some_struct 的实例时使用:
extend sys {
run() is also {
var some_struct : some_struct;
gen some_struct;
print some_struct;
};
};
我得到以下信息:
some_struct = some_struct-@1: some_struct of unit: sys
---------------------------------------------- @test
0 some_field: 3435783455
1 some_struct_field: some_other_struct-@2
2 some_other_field: 2907638895
我想查看 some_struct_field 的详细显示,其中会显示其子字段。类似于:
some_struct = some_struct-@1: some_struct of unit: sys
---------------------------------------------- @test
0 some_field: 3435783455
1 some_struct_field: some_other_struct-@2
0 some_field: 1753518447
1 some_other_field: 1744092907
2 some_other_field: 2907638895
我试过使用 print ... full=TRUE,但这也无济于事。我找不到此行为的任何配置旋钮。
字段是否有任何类型的属性来自定义它们的打印方式(如 UVM/SV 字段宏)?
我知道有一个 do_print() 方法在打印时被调用,我可以用它来自定义显示的文本,但我不知道如何我可以在不重新实现整个打印例程的情况下使用它。如果有一种方法可以捕获构建的文本,我可以使用它。
有人能帮我吗?
一般不建议编辑any_struct的do_print()方法来递归打印struct的内容。
这是因为某些结构具有指向其父结构或指向该结构的另一个结构的指针(如 driver 和 bfm),
并且如果将修改后的 do_print() 方法(通过使用“打印”)应用于此类结构,将导致永无止境的递归打印
这很可能以 OS 11 段违规结束(由于堆栈溢出)。
我建议在 any_struct 中创建一个新方法,然后您将使用它来打印没有循环指针的结构
在他们的任何地方。
我对这种方法的想法将利用反射机制,看起来像这样:
extend any_struct{
printMe(s:string="") is{
var fld_indx:uint=0;
var printed_line:string;
var get_struct: rf_struct = rf_manager.get_struct_of_instance(me); // get a reflection pointer to me
var fields_in_struct : list of rf_field = get_struct.get_fields(); // get all my fields
for each (strct_field) in fields_in_struct do {
printed_line=append(s,fld_indx," ",strct_field.get_name()); // build the string that will display for this field
out(str_pad(printed_line,40)," : ",strct_field.get_type().value_to_string(strct_field.get_value_unsafe(me)));
var elem_type : rf_type = strct_field.get_type();
if (elem_type is a rf_struct) { // if the field is a struct, call this method recursively
var st:any_struct= strct_field.get_value_unsafe(me).unsafe() ;
st.printMe(append(s," "));
};
fld_indx=fld_indx+1;
};
};
};
然后您可以定义一个宏,以更类似于打印操作的方式处理此问题:
define <printr'action> "printr <exp>" as {
<exp>.printMe();
};
在代码中,你可以这样写:
printr me; // usage example
我的嵌套结构定义如下:
struct some_struct {
some_field : uint;
some_struct_field : some_other_struct;
some_other_field : uint;
};
struct some_other_struct {
some_field : uint;
some_other_field : uint;
};
当我打印 some_struct 的实例时使用:
extend sys {
run() is also {
var some_struct : some_struct;
gen some_struct;
print some_struct;
};
};
我得到以下信息:
some_struct = some_struct-@1: some_struct of unit: sys
---------------------------------------------- @test
0 some_field: 3435783455
1 some_struct_field: some_other_struct-@2
2 some_other_field: 2907638895
我想查看 some_struct_field 的详细显示,其中会显示其子字段。类似于:
some_struct = some_struct-@1: some_struct of unit: sys
---------------------------------------------- @test
0 some_field: 3435783455
1 some_struct_field: some_other_struct-@2
0 some_field: 1753518447
1 some_other_field: 1744092907
2 some_other_field: 2907638895
我试过使用 print ... full=TRUE,但这也无济于事。我找不到此行为的任何配置旋钮。
字段是否有任何类型的属性来自定义它们的打印方式(如 UVM/SV 字段宏)?
我知道有一个 do_print() 方法在打印时被调用,我可以用它来自定义显示的文本,但我不知道如何我可以在不重新实现整个打印例程的情况下使用它。如果有一种方法可以捕获构建的文本,我可以使用它。
有人能帮我吗?
一般不建议编辑any_struct的do_print()方法来递归打印struct的内容。 这是因为某些结构具有指向其父结构或指向该结构的另一个结构的指针(如 driver 和 bfm), 并且如果将修改后的 do_print() 方法(通过使用“打印”)应用于此类结构,将导致永无止境的递归打印 这很可能以 OS 11 段违规结束(由于堆栈溢出)。
我建议在 any_struct 中创建一个新方法,然后您将使用它来打印没有循环指针的结构 在他们的任何地方。 我对这种方法的想法将利用反射机制,看起来像这样:
extend any_struct{
printMe(s:string="") is{
var fld_indx:uint=0;
var printed_line:string;
var get_struct: rf_struct = rf_manager.get_struct_of_instance(me); // get a reflection pointer to me
var fields_in_struct : list of rf_field = get_struct.get_fields(); // get all my fields
for each (strct_field) in fields_in_struct do {
printed_line=append(s,fld_indx," ",strct_field.get_name()); // build the string that will display for this field
out(str_pad(printed_line,40)," : ",strct_field.get_type().value_to_string(strct_field.get_value_unsafe(me)));
var elem_type : rf_type = strct_field.get_type();
if (elem_type is a rf_struct) { // if the field is a struct, call this method recursively
var st:any_struct= strct_field.get_value_unsafe(me).unsafe() ;
st.printMe(append(s," "));
};
fld_indx=fld_indx+1;
};
};
};
然后您可以定义一个宏,以更类似于打印操作的方式处理此问题:
define <printr'action> "printr <exp>" as {
<exp>.printMe();
};
在代码中,你可以这样写:
printr me; // usage example