在我的验证环境中,我们使用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;
};
}
感谢您的帮助
答案 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
};
};
};