SystemVerilog& RegEx:“\ d”不被识别为字符类

时间:2017-07-04 13:10:32

标签: regex system-verilog

我正在尝试在SystemVerilog中使用正则表达式。字符类“\ d”(一个数字)似乎不起作用,而其他字符类如“\ w”,“\ s”工作正常。我试过SVLIB和UVM,行为相同。

要重现我写下面的代码。代码除了使用UVM和SVLIB对正则表达式“\ d”和“\ w”测试“1”外什么都不做。

microbenchmark(prob_k <- prob(1:10000, et = 1, ey = 1 ,m0 = 5000, m1 = 5000))
# Unit: milliseconds
#                                                           expr     min
#  prob_k <- prob(1:10000, et = 1, ey = 1, m0 = 5000, m1 = 5000) 4.68232
#        lq     mean   median       uq      max neval
#  4.776912 5.168405 4.817979 4.907612 7.023989   100

我有以下输出:

module SandBox;

import svlib_pkg::*;
import uvm_pkg::*;

initial
begin

Str myString;
Regex regex;

string testString;
string reString;

testString = "1";
reString = "\\d";

myString = Str::create(testString);
regex = Regex::create();
regex.setRE(reString);

$display("-------------------------------------");
$display("test string: %s", testString);
$display("regex: %s", reString);

if (regex.test(myString)) begin

    $display("SVLIB Test passed!");

end

if (!uvm_re_match(reString, testString)) begin

    $display("UVM Test passed!");   

end

testString = "1";
reString = "\\w";

myString = Str::create(testString);
regex = Regex::create();
regex.setRE(reString);

$display("-------------------------------------");
$display("test string: %s", testString);
$display("regex: %s", reString);

if (regex.test(myString)) begin

    $display("SVLIB Test passed!");

end

if (!uvm_re_match(reString, testString)) begin

    $display("UVM Test passed!");   

end

end

endmodule

这种行为的原因是什么?底层系统? SV语法中有什么东西吗?

1 个答案:

答案 0 :(得分:1)

根据 svlib用户指南和程序员参考

  

svlib使用&#34;扩展   正则表达式&#34; C库的POSIX兼容正则表达式子系统的方言,   你可以通过咨询找到如何用这种方言写正则表达式的完整细节   man-page man 7 regex或众多在线正则表达式教程中的任何一个。该   svlib的正则表达式几乎在所有方面与Unix / Linux使用的方言相同   命令egrep。

POSIX正则表达式标准(man 7 regexp)反过来定义了可用的字符类,如下所示:

  

在括号表达式中,&#34; [:&#34;中包含的字符类的名称和&#34;:]&#34;代表属于该类的所有字符的列表。标准字符类名称为:

alnum   digit   punct
alpha   graph   space
blank   lower   upper
cntrl   print   xdigit

因此,必须将数字字符类指定为:

[[:digit:]]

使用规范语法。

\d\w\s是所谓的Shorthand Character Classes,它们不是由POSIX标准定义的,因此它们的可用性取决于Regexp 你正在使用的引擎实现。

某些正则表达式引擎选择实现所有这些引擎,其他引擎(例如sedgrep)仅实现一个子集,不包括\d

声称svlib实施与egrep兼容,egrep不支持\d