【问题标题】:how to use macro with an argument in the `uvm_object_utils如何在 `uvm_object_utils 中使用带有参数的宏
【发布时间】:2021-09-09 03:31:07
【问题描述】:

我这样创建序列类:

`define SEQ_NAME(sub_name) ``sub_name``_test_seq

class base_sequence extends uvm_sequence;
    `uvm_object_utils(base_sequence)
......
endclass

class `SEQ_NAME(abc) extends base_sequence;
    `uvm_object_utils(`SEQ_NAME(abc))
......
endclass

然后我想使用 set_type_override_by_name 覆盖 base_sequence :

factory.set_type_override_by_name("base_sequence","abc_test_seq");  //fatal, abc_test_seq is not registered with the factory

我发现 `uvm_object_utils(`SEQ_NAME(abc)) 是这样展开的:

typedef uvm_object_registry#(abc_test_seq,"`SEQ_NAME(abc)") type_id;
......

我修改了我的覆盖代码:

factory.set_type_override_by_name("base_sequence","`SEQ_NAME(abc)");  //PASS

那么,如果我想在覆盖工厂中使用字符串“abc_test_seq”,是否应该将uvm_obeject_utils 传递给abc_test_seq 参数?有没有办法像我的第二课一样使用宏?

【问题讨论】:

    标签: macros verilog system-verilog uvm


    【解决方案1】:

    双引号内的反引号 (`) 被视为字符串字符,而不是宏的前缀。您应该创建一个新宏,在其输入参数周围添加引号。参数将在添加引号之前进行评估。例如:

    `define STR(str) `"str`"
    

    那么你可以这样做:

    typedef uvm_object_registry#(abc_test_seq,`STR(`SEQ_NAME(abc))) type_id;
    ...
    factory.set_type_override_by_name("base_sequence",`STR(`SEQ_NAME(abc)));
    

    在这种情况下,`STR(`SEQ_NAME(abc) 将解析为 "abc_test_seq"

    【讨论】:

    • 感谢您的回复。我尝试了这种方法,但在模拟中,它仍然被解析为“`SEQ_NAME(abc)”
    • @herbert.x 哪个模拟器?我在 EDAplayground 上的三个不同模拟器上进行了尝试,它们都按预期进行了评估
    猜你喜欢
    • 2018-06-25
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多