0

我有嵌套结构定义如下:

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()方法在打印时被调用,我可以使用它来自定义显示的文本,但我不知道如何在不重新实现整个打印例程的情况下使用它。如果有一种方法可以捕获构建的文本,我可以使用它。

有人可以帮我吗?

4

1 回答 1

1

通常不建议编辑 any_struct 的 do_print() 方法以递归方式打印结构的内容。这是因为某些结构具有指向其父级的指针或另一个指向该结构的指针(如驱动程序和 bfm),并且如果您将修改后的 do_print() 方法(通过使用'print')应用于这样的结构,将导致永无止境的递归打印,这很可能以 OS 11 分段冲突结束(由于堆栈溢出)。

我建议在 any_struct 中创建一个新方法,然后您将使用它来打印其中没有循环指针 Anywhere 的结构。我对这种方法的想法将利用反射机制,看起来像这样:

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
于 2015-12-31T13:46:45.773 回答