使用regex通过get\u field\u by\u name搜索字段

使用regex通过get\u field\u by\u name搜索字段,regex,system-verilog,uvm,Regex,System Verilog,Uvm,我正在尝试在systemverilog中按名称获取uvm寄存器字段。我想使用正则表达式,这样我就可以使用一个模式作为字段名。这是我的注册字段: YY_XXX_2_N ZZ_BBB_3_N UU_AAA_8_N MM_CCC_4_N YY_WWW_9_N 正如您所看到的,所有寄存器字段都以_N结尾,我使用以下代码来获取寄存器字段: field=env.my_regmap.get_field_by_name("_N$"); 所以我想让这段代码得到一个与提供的模式匹配的寄存器字段。使用上面的代码,

我正在尝试在systemverilog中按名称获取uvm寄存器字段。我想使用正则表达式,这样我就可以使用一个模式作为字段名。这是我的注册字段:

YY_XXX_2_N
ZZ_BBB_3_N
UU_AAA_8_N
MM_CCC_4_N
YY_WWW_9_N
正如您所看到的,所有寄存器字段都以_N结尾,我使用以下代码来获取寄存器字段:

field=env.my_regmap.get_field_by_name("_N$");
所以我想让这段代码得到一个与提供的模式匹配的寄存器字段。使用上面的代码,我得到以下错误:

reporter [RegModel] Unable to locate field '_N$' in block 'my_regmap'
我想知道在这种情况下是否有办法使用正则表达式


谢谢

SystemVerilog不允许直接使用regex,但UVM提供了一个DPI函数
UVM\u re\u match
,允许您使用regex.h库中的regexec函数。你可以阅读更多关于这方面的内容

您不能使用此函数作为参数来
get\u fields\u by\u name
,但您可以通过调用
get\u fields
从寄存器获取所有字段,然后使用
uvm\u re\u match检查每个字段
get\u field\u by\u name()
需要精确匹配才能将单个句柄返回到字段。您需要做的是使用
get_fields()
构建字段列表,然后使用SV find()命令


非常感谢。它可以工作,但您必须反转uvm_re_match函数返回的任何内容
selected_fields=all_fields.find(item)with(!uvm_re_match(“.*N$”,item.get_name())
uvm_field_reg all_fields[$], selected_fields[$];

all_fields = get_fields();
selected_fields = all_fields.find(item) with (uvm_re_match("*_N",item.get_name));