2016-10-03 11 views
3

Я пытаюсь получить поле регистра uvm по имени в systemverilog. Я хочу использовать регулярное выражение, чтобы я мог использовать шаблон для имени поля. Вот мои регистровых поля:с помощью regex в поисках поля с использованием 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 find()

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) с (! uvm_re_match (". * _ N $ ", item.get_name()));' –

1

SystemVerilog не позволяет напрямую использовать регулярное выражение, но UVM предоставляет функцию DPI uvm_re_match, которая позволяет вам использовать функцию regexec из библиотеки regex.h. Вы можете узнать больше об этом here.

Вы не можете использовать эту функцию в качестве аргумента get_field_by_name, но вы можете получить все поля из регистра по телефону get_fields, а затем проверить каждое поле с uvm_re_match.