本页内容
get_arg_matches 重用统一匹配接口,/regex/ 仍保留正则语义
其他行为变化
影响范围
使用 get_arg_matches 的 /regex/,或自行关闭 DPI。
具体差异
2.0 改走 uvm_is_match(),但 DPI 的 glob 转换会识别斜杠包围的表达式并保留正则语义,不能仅因调用了 deglob 接口就推断正则失效。/^\\+REVIEW_ARG=(red|green)[0-9]+$/ 匹配 +REVIEW_ARG=green123 的双库实测均命中一次。非斜杠前缀匹配路径保留;无 DPI 条件需要单独验证。
修改方案
正常 /regex/ 用法无需为此改写为 glob。自行编译且关闭 DPI 的环境单独核对匹配支持范围。
兼容措施与范围:原 /regex/ 调用无需兼容开关;关闭 DPI 的构建仍须核对匹配支持范围。
迁移后验证
用匹配和不匹配参数各运行一次,比较命中数;关闭 DPI 的构建单独测试,不将默认 DPI 结果推广过去。
记录本条结果:M04-011 · 状态与证据。
已有实测与复现
补充查阅
扫描定位与记录结果
有扫描规则,覆盖部分可识别写法。脚本检查名称、参数和部分 FLAG 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。
| uv run tools/uvm_migration_scan.py <SoC代码目录> --rules S41
|
核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。
扫描器下载、输入范围与报告说明
源码与标准依据
核查方式:源码与实测核对。实测仅覆盖本条所列场景。
VCS 内置 UVM-1.2:uvm_cmdline_processor.svh:128(DPI uvm_dpi_regcomp/regexec 真正则)
VCS 内置 uvm-ieee-2020-2.0:uvm_cmdline_processor.svh:229(改走 uvm_is_match,保留斜杠正则识别;UVM_CMDLINE_NO_DPI 分支移除)
引用代码(高亮为引用行);上方行号链接可直接定位。
| src/vcs-uvm-1.2/base/uvm_cmdline_processor.svh |
|---|
| //| //and foo123.sv,
//| //not barfoo.sv.
function int get_arg_matches (string match, ref string args[$]);
`ifndef UVM_CMDLINE_NO_DPI
chandle exp_h = null;
int len = match.len();
args.delete();
if((match.len() > 2) && (match[0] == "/") && (match[match.len()-1] == "/")) begin
match = match.substr(1,match.len()-2);
exp_h = uvm_dpi_regcomp(match);
if(exp_h == null) begin
uvm_report_error("UVM_CMDLINE_PROC", {"Unable to compile the regular expression: ", match}, UVM_NONE);
return 0;
end
end
foreach (m_argv[i]) begin
if(exp_h != null) begin
|
完整源码 · SHA256:b0c8f08ff0c8a788a317ad6436e637fadf556cec65a57a2393611dbd5e0d72a5
| src/vcs-uvm-ieee-2020-2.0/base/uvm_cmdline_processor.svh |
|---|
| //| //not barfoo.sv.
// @uvm-ieee 1800.2-2020 auto G.1.3.4
function int get_arg_matches (string match, ref string args[$]);
bit match_is_regex = (match.len() > 2) && (match[0] == "/") && (match[match.len()-1] == "/");
int len = match.len();
args.delete();
foreach (m_argv[i]) begin
if ( match_is_regex && uvm_is_match( match, m_argv[i] ) ) begin
args.push_back( m_argv[i] );
end
else if((m_argv[i].len() >= len) && (m_argv[i].substr(0,len - 1) == match)) begin
args.push_back(m_argv[i]);
end
end
return args.size();
endfunction
|
完整源码 · SHA256:de22012dd08e060c7a2b473781d63a68963b9ed53ea8b524942f26b58a6fcfdc
术语解释 · 兼容配置
返回Reporting / 命令行 · 迁移清单
版本适用范围