Specman — как преобразовать struct в список строк

#struct #verification #specman

#struct #проверка #specman

Вопрос:

Каков эффективный способ преобразовать struct в список строк (список всех его полей — имя и значение)?

Например, следующая структура:

 struct spot_top_s {
   %D_LDO_SFS_EN : uint(bits:1);
   %D_COMP3P3_ACC_EN : uint(bits:1);
   %D_BGCOMP_TRIM : uint(bits:6);
   %spot_top_jtagtest_out : bit;
   %spot_top_jtagtest_in  : bit;

}; // spot_top_s
  

Комментарии:

1. Вы хотите иметь возможность делать это с любой структурой? Затем вам нужно использовать интерфейс отражения. Если только для этой структуры это тривиально.

Ответ №1:

Действительно, общий код, который принимает любую структуру, может быть реализован с использованием отражения. Вот один из примеров такого кода. Вы можете изменить это, например — добавить в список только физические поля (вызвав «if it.is_physical()») и т.д.

 extend sys {
    get_fields(input_struct : any_struct) : list of string is {
        var struct_rf : rf_struct;
        struct_rf = rf_manager.get_struct_of_instance( input_struct);

        var struct_fields : list of rf_field;
        struct_fields = struct_rf.get_fields();

        var field_type_rf : rf_type;
        var field_value_unsafe : untyped;

        for each in struct_fields {
            result.add(it.get_name());
            var f:=  it.get_value_unsafe(input_struct);
            field_type_rf = it.get_type();
            field_value_unsafe = it.get_value_unsafe(input_struct);
            result.add(field_type_rf.value_to_string(field_value_unsafe));
        };
    };

    // usage example:
    my_spot_top : spot_top_s;
    post_generate() is also {
        print get_field(my_spot_top);
    };
};
  

Комментарии:

1. Есть ли какая-либо возможность добавить разрядный номер каждого поля?

2. для скалярных полей — вы можете получить их размер. «если field_type_rf является rf_scalar (trs) { field_size = trs.get_size_in_bits();». найдите rf_scalar в ссылке specman e. если поле представляет собой список — тогда вам нужно суммировать (получить длину списка an * по размеру каждого поля) и т.д.