SystemVerilog(UVM)で正規表現を使用する

はじめに

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_bar

UVM_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で挙動が変わるため注意してください。

コメント

タイトルとURLをコピーしました