3

在我的验证环境中,我们使用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;
        };
    }

谢谢您的帮助

4

2 回答 2

2

没有内置结构来扩展多个子类型。但是,您可以做的是使用基于宏的解决方案。Specman 团队有一篇关于此主题的博客文章: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 {
    // ...
  };
};
于 2014-09-17T14:49:30.763 回答
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
    };
  };
};
于 2014-09-23T11:43:15.677 回答