2016-10-03 119 views
3

我試圖通過名字SystemVerilog中獲得UVM寄存器字段的字段正則表達式。我想使用正則表達式,以便我可以使用字段名稱的模式。這裏是我的註冊字段:在尋找使用get_field_by_name

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' 

我不知道是否有在這種情況下使用正則表達式的方法。

謝謝!

回答

5

get_field_by_name()需要精確匹配到一個手柄返回到域中。你需要做的是用get_fields()來建立字段列表,然後用SV查找()

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)); 
+0

謝謝!!它的工作原理,但你必須反轉任何uvm_re_match函數返回'selected_fields = all_fields.find(item)with(!uvm_re_match(「。* _ N $」,item.get_name()));' –

1

SystemVerilog不允許直接使用regex,但是UVM提供了一個DPI函數uvm_re_match,允許您使用regex.h庫中的regexec函數。你可以閱讀更多關於這個here

您不能將此函數用作參數get_field_by_name,但您可以通過調用get_fields來獲取寄存器中的所有字段,然後使用uvm_re_match檢查每個字段。