はじめに
SystemVerilogで正規表現を使用したいときがあり、標準で実装されているかを調べました。
結論
UVM(IEEE 1800.2-2020)にuvm_re_matchというメソッドがありました。正規表現で文字列検索を行うメソッドのようです。
uvm_re_match
uvm_re_matchは以下のように定義されています。
function int uvm_re_match(string re, string str, bit deglob = 0);- 引数
re:正規表現
str:被検索文字列
deglob:reで与えたglobを正規表現に変換して検索(0:正規表現のまま、1:glob→正規表現に変換) - 戻り値
0:成功
1:失敗
uvm_re_matchはデフォルトでDPI-Cを使用しますが、UVM_NO_DPIをDefineするとVerilog Onlyのメソッドに切り替わります。
しかし、Verilog Onlyのメソッドでは、正規表現ではなくglobで検索するため、結果が異なる可能性があり注意が必要です。
使用例
デフォルト(UVM_NO_DPIのDefineなし)
module top;
import uvm_pkg::*;
`include "uvm_macros.svh"
initial begin
string pattern = "foo.*bar"; // 正規表現
string text = "foo_123_bar";
int result;
// 正規表現として扱う
result = uvm_re_match(pattern, text);
if (result)
`uvm_info("TEST", $sformatf("Matched: %s", text), UVM_LOW)
end
endmodule
// 出力
// UVM_INFO ... Matched: foo_123_barUVM_NO_DPIをDefine
`define UVM_NO_DPI
module top;
import uvm_pkg::*;
`include "uvm_macros.svh"
initial begin
string pattern = "foo*bar"; // glob パターン
string text = "foo_123_bar";
int result;
// glob として扱う
result = uvm_re_match(pattern, text);
if (result)
`uvm_info("TEST", $sformatf("Glob matched: %s", text), UVM_LOW)
endmodule
// 出力
// UVM_INFO ... Glob matched: foo_123_barまとめ
SystemVerilogで正規表現を使用できるuvm_re_matchについて解説しました。
Defineで挙動が変わるため注意してください。

コメント