Specman:如何检索存储在另一个 var 中的 var 值

发布于 2024-09-11 17:08:46 字数 248 浏览 6 评论 0原文

我已将 var 名称存储在另一个 var 中,并且想从原始 var 中检索值。

例如:

var var_A: list of uint = {1,3,2};
var var_A_str:string = "var_A";

//现在我想使用 var_A_str 打印 var_A 值列表。我怎样才能做到这一点?

print $var_A_str;

I have stored var name in another var and I want to retrieve values from original var.

for ex:

var var_A: list of uint = {1,3,2};
var var_A_str:string = "var_A";

//Now i want to print var_A list of values using var_A_str. How can i do that?

print $var_A_str;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼前雾蒙蒙 2024-09-18 17:08:46

这称为内省或反思。您必须使用 Specman 的 rf_manager。在文档中搜索它。但是,文档并未向您展示该单元具有的所有方法。如果您确实想查看所有方法,请运行此代码片段:

extend sys {
    run() is also {
        var rf_man : rf_struct = rf_manager.get_exact_subtype_of_instance(rf_manager);
        out(" RF Manager:");
        for each (meth) in rf_man.get_declared_methods() {
            print meth;
        };
    };
};

我不确定如何迭代列表元素,但您可以使用此代码片段来查看对对象的引用的方法。 /em> 实例成员(不是子例程的变量)。

extend sys {

    A : list of uint;
    keep A == {1;3;2};
    run() is also {

        var variable_name := "A";
        var rf_obj: rf_struct = rf_manager.get_exact_subtype_of_instance(sys);
        var rf_i : rf_field =  rf_obj.get_field(variable_name);
        print rf_i;
        var rf_rf_i := rf_manager.get_exact_subtype_of_instance(rf_i);
        out ( "#\n# RF_RFI\n#");
        for each (meth) in rf_rf_i.get_declared_methods() {
            print meth;
        }; 
    };
};    

在我的版本(8.2)中打印:

    Starting the test ...
    Running the test ...
      rf_i = rf_field 'A', line 7 in @rf_test4
    #
    # RF_RFI
    #
      meth = rf_method 'get_type', Specman's private modules
      meth = rf_method 'is_physical', Specman's private modules
      meth = rf_method 'get_svtp_pack', Specman's private modules
      meth = rf_method 'set_svtp_pack', Specman's private modules
      meth = rf_method 'is_ungenerated', Specman's private modules
      meth = rf_method 'is_const', Specman's private modules
      meth = rf_method 'is_unit_instance', Specman's private modules
      meth = rf_method 'is_port_instance', Specman's private modules
      meth = rf_method 'is_reference', Specman's private modules
      meth = rf_method 'get_constrained_types', Specman's private modules
      meth = rf_method 'get_deep_copy_attr', Specman's private modules
      meth = rf_method 'get_value', Specman's private modules
      meth = rf_method 'set_value', Specman's private modules
      meth = rf_method 'get_value_unsafe', Specman's private modules
      meth = rf_method 'get_all_when_value_unsafe', Specman's private modules
      meth = rf_method 'set_value_unsafe', Specman's private modules
      meth = rf_method 'set_value_const_reassign_unsafe', Specman's private modules
      meth = rf_method 'get_interface_port_prefix', Specman's private modules
      meth = rf_method 'get_interface_port_suffix', Specman's private modules
      meth = rf_method 'is_gen_intelligen', Specman's private modules
      meth = rf_method 'get_long_name', Specman's private modules
      meth = rf_method 'get_implicit_constraints', Specman's private modules
      meth = rf_method 'make_path', Specman's private modules
      meth = rf_method 'make_element', Specman's private modules
      meth = rf_method 'make_list_size_path', Specman's private modules
      meth = rf_method 'is_unit_reference', Specman's private modules
      meth = rf_method 'get_id_name_for_port_type', Specman's private modules
      meth = rf_method 'get_list_upper_bound', Specman's private modules
      meth = rf_method 'get_sv_typename', Specman's private modules
      meth = rf_method 'get_sv_name_under_when', Specman's private modules
      meth = rf_method 'get_sv_size', Specman's private modules
      meth = rf_method 'sv_add_encode_lines', Specman's private modules
      meth = rf_method 'sv_get_decode_function_local_var_name', Specman's private modules
      meth = rf_method 'sv_get_decode_function_local_var_decl', Specman's private modules
      meth = rf_method 'sv_add_decode_lines', Specman's private modules
      meth = rf_method 'get_sv_field_name', Specman's private modules
      meth = rf_method 'get_sv_field', Specman's private modules
      meth = rf_method 'sv_must_be_protected_field', Specman's private modules
      meth = rf_method 'sv_add_get_set_field_functions', Specman's private modules
      meth = rf_method 'sv_add_get_set_field_function_decs', Specman's private modules
      meth = rf_method 'is_sv_exported_field', Specman's private modules
      meth = rf_method 'is_sv_determinant_field', Specman's private modules
      meth = rf_method 'field_configured_to_svtp_pack', Specman's private modules
      meth = rf_method 'get_ovm_field_macro', Specman's private modules
      meth = rf_method 'is_internal', Specman's private modules
      meth = rf_method 'get', Specman's private modules
      meth = rf_method 'eanalyze_lnt', Specman's private modules
    No actual running requested.
    Checking the test ...

Checking is complete - 0 DUT errors, 0 DUT warnings.

我确信有一种方法可以实现您想要的功能,但是使用 Specman 的反射接口可能非常困难。

黑客快乐!

This is called introspection or reflection. You have to use Specman's rf_manager. Search for it in the docs. However, the docs don't show you all the methods that this unit has. If you really want to see all the methods, run this snippet of code:

extend sys {
    run() is also {
        var rf_man : rf_struct = rf_manager.get_exact_subtype_of_instance(rf_manager);
        out(" RF Manager:");
        for each (meth) in rf_man.get_declared_methods() {
            print meth;
        };
    };
};

I'm not sure how to iterate through the list elements, but you can use this snippet to look at the methods on a reference to an object's instance members ( not a subroutine's variable).

extend sys {

    A : list of uint;
    keep A == {1;3;2};
    run() is also {

        var variable_name := "A";
        var rf_obj: rf_struct = rf_manager.get_exact_subtype_of_instance(sys);
        var rf_i : rf_field =  rf_obj.get_field(variable_name);
        print rf_i;
        var rf_rf_i := rf_manager.get_exact_subtype_of_instance(rf_i);
        out ( "#\n# RF_RFI\n#");
        for each (meth) in rf_rf_i.get_declared_methods() {
            print meth;
        }; 
    };
};    

In my version ( 8.2 ) this prints:


Starting the test ...
Running the test ...
rf_i = rf_field 'A', line 7 in @rf_test4
#
# RF_RFI
#
meth = rf_method 'get_type', Specman's private modules
meth = rf_method 'is_physical', Specman's private modules
meth = rf_method 'get_svtp_pack', Specman's private modules
meth = rf_method 'set_svtp_pack', Specman's private modules
meth = rf_method 'is_ungenerated', Specman's private modules
meth = rf_method 'is_const', Specman's private modules
meth = rf_method 'is_unit_instance', Specman's private modules
meth = rf_method 'is_port_instance', Specman's private modules
meth = rf_method 'is_reference', Specman's private modules
meth = rf_method 'get_constrained_types', Specman's private modules
meth = rf_method 'get_deep_copy_attr', Specman's private modules
meth = rf_method 'get_value', Specman's private modules
meth = rf_method 'set_value', Specman's private modules
meth = rf_method 'get_value_unsafe', Specman's private modules
meth = rf_method 'get_all_when_value_unsafe', Specman's private modules
meth = rf_method 'set_value_unsafe', Specman's private modules
meth = rf_method 'set_value_const_reassign_unsafe', Specman's private modules
meth = rf_method 'get_interface_port_prefix', Specman's private modules
meth = rf_method 'get_interface_port_suffix', Specman's private modules
meth = rf_method 'is_gen_intelligen', Specman's private modules
meth = rf_method 'get_long_name', Specman's private modules
meth = rf_method 'get_implicit_constraints', Specman's private modules
meth = rf_method 'make_path', Specman's private modules
meth = rf_method 'make_element', Specman's private modules
meth = rf_method 'make_list_size_path', Specman's private modules
meth = rf_method 'is_unit_reference', Specman's private modules
meth = rf_method 'get_id_name_for_port_type', Specman's private modules
meth = rf_method 'get_list_upper_bound', Specman's private modules
meth = rf_method 'get_sv_typename', Specman's private modules
meth = rf_method 'get_sv_name_under_when', Specman's private modules
meth = rf_method 'get_sv_size', Specman's private modules
meth = rf_method 'sv_add_encode_lines', Specman's private modules
meth = rf_method 'sv_get_decode_function_local_var_name', Specman's private modules
meth = rf_method 'sv_get_decode_function_local_var_decl', Specman's private modules
meth = rf_method 'sv_add_decode_lines', Specman's private modules
meth = rf_method 'get_sv_field_name', Specman's private modules
meth = rf_method 'get_sv_field', Specman's private modules
meth = rf_method 'sv_must_be_protected_field', Specman's private modules
meth = rf_method 'sv_add_get_set_field_functions', Specman's private modules
meth = rf_method 'sv_add_get_set_field_function_decs', Specman's private modules
meth = rf_method 'is_sv_exported_field', Specman's private modules
meth = rf_method 'is_sv_determinant_field', Specman's private modules
meth = rf_method 'field_configured_to_svtp_pack', Specman's private modules
meth = rf_method 'get_ovm_field_macro', Specman's private modules
meth = rf_method 'is_internal', Specman's private modules
meth = rf_method 'get', Specman's private modules
meth = rf_method 'eanalyze_lnt', Specman's private modules
No actual running requested.
Checking the test ...

Checking is complete - 0 DUT errors, 0 DUT warnings.

I'm sure there's a way to do what you want, but it can be very difficult to use Specman's reflection interface.

Merry hacking!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文