我有嵌套结构,定义如下:
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()方法在打印时被调用,我可以用它来自定义显示的文本,但是我没有看到如何在不重新实现的情况下使用它整个打印例程。如果有办法捕获构造的文本,我可以使用它。
有人可以帮助我吗?
答案 0 :(得分:1)
通常不建议编辑any_struct的do_print()方法以递归方式打印struct的内容。 这是因为一些结构有指向它们的父或另一个结构的指针,指向这个结构(如驱动程序和bfm), 如果您将修改后的do_print()方法(通过使用'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