我正在尝试在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语法中有什么东西吗?
答案 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
你正在使用的引擎实现。
某些正则表达式引擎选择实现所有这些引擎,其他引擎(例如sed
或grep
)仅实现一个子集,不包括\d
。
声称svlib
实施与egrep
兼容,egrep
不支持\d
。