Specman e:有没有办法扩展多种结构?

时间:2014-09-17 11:33:20

标签: specman uvm e

在我的验证环境中,我们使用vr_ad UVM包,其中有一个寄存器vr_ad_reg的通用结构,它已针对环境中的每个寄存器以不同的类型进行扩展,等:

reg_def TIMER_LOAD_0 TIMER 20'h00010 {
    reg_fld timer_load : uint : RW : 0xffff;
}:

vr_ad_reg具有预定义函数post_access(),我想为每个以“TIMER”开头的寄存器类型进行扩展。有办法吗?例如:

extend TIMER_* vr_ad_reg { //The intention here to extend the vr_ad_reg for all types that starts with the word TIMER
        post_access() is also {
            var some_var : uint;
        };
    }

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

没有内置构造来扩展多个子类型。但是,您可以使用基于宏的解决方案。特斯曼队有一篇关于这个主题的博客文章:http://www.cadence.com/Community/blogs/fv/archive/2009/10/20/extending-multiple-when-subtypes-simultaneously.aspx

他们创建了一个define as computed宏,它接受多个子类型并扩展它们:

  define <multi_when'statement> "extend \[<detr'name>,...\] <base'type> (<MEMBERS {<struct_member>;...})" as computed {
    for each in <detr'names> do {
      result = appendf("%s extend %s %s %s;",result,it,<base'type>,<MEMBERS>);
    };
  };

然后您可以这样使用:

extend [ TIMER_LOAD_0, TIMER_LOAD_1, TIMER_LOAD_2 ] vr_ad_reg {
  post_access() is also {
    // ...
  };
};

答案 1 :(得分:2)

如果您有许多与您的表达式匹配的寄存器,或者您事先并不知道确切的名称,则可能需要考虑使用运行时解决方案:

extend vr_reg {
  post_access() is also {
    var some_var: uint;
    if str_match(kind.as_a(string), "/^TIMER_*/") {
    ... // do stuff for the TIMER_* registers
    };
  };
};