配置'print'以显示完整的struct字段

时间:2015-12-30 13:38:19

标签: specman e

我有嵌套结构,定义如下:

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

有人可以帮助我吗?

1 个答案:

答案 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