跳转至

输入查询内容

    本页内容

    运行第一个迁移示例

    用一个最小 test 观察旧 objection 如何导致 run 提前结束,再验证修改后的行为。

    示例独立于真实 SoC 环境,已归档结果基于 VCS W-2024.09-SP2-8。

    工具包里该用哪个脚本

    扫描自己的代码用扫描器;复现手册里的差异用示例运行器。 这四个 Python 脚本按任务选择,无需依次运行。

    脚本(均在 tools/ 下) 何时运行 输入与结果
    uvm_migration_scan.py 检查实际 SoC 代码中的迁移线索 接收代码目录或文件;默认保存 JSON、CSV 和范围摘要;自动读取同目录 YAML 的团队配置,统一输出目录;只读扫描
    run_uvm_review.py 复现某个行为差异或验证示例改法 --case 选择包内 TB、--variants 选择库;编译、仿真并核对观察值
    run_compile_review.py 复现旧 API 编译断点和改写后的编译结果 --cases 选择内置编译用例;检查旧写法在 1.2 通过、在 2.0 出现预期错误,以及改写后在 2.0 通过
    run_reg_review.py 复现寄存器访问矩阵 --scenarios 选择大小端、响应或补偿场景;在两库编译仿真并检查数据和镜像

    扫描脚本和配套 YAML放在同一目录,运行时自动读取团队配置;需要 PyYAML,无需 VCS 或 license。三个示例运行器需要 Linux、本机 VCS 和 license,运行的是包内 tests/uvm_review/ 下的最小 TB。实际 SoC 的编译和回归继续使用项目原有入口。

    运行示例时保留完整目录:run_compile_review.pyrun_reg_review.py 会导入同目录的 run_uvm_review.py*.sv 是 TB 源码,*.expected.json 是预期观察值。environment.example.sh 是按本机配置填写后加载的环境模板。

    配置下节环境后,按任务选择命令,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    # 单个行为实验:旧 objection 在两库的差异
    uv run tools/run_uvm_review.py --case objection_probe --variants 12,20
    
    # 指定编译断点:end_event 旧用法与迁移后写法
    uv run tools/run_compile_review.py --cases C2
    
    # 指定寄存器场景:小端和大端访问
    uv run tools/run_reg_review.py --scenarios le,be
    

    --case 是 TB 名称,不是扫描规则 ID;--cases 只接受运行器内置的编译用例,并非所有扫描规则。省略 --cases--scenarios 会运行对应完整矩阵。具体实验所需的宏、plusarg 和预期文件,以条目中的“在本机复现”或实验页命令为准。下文以 objection 为例走完一次复现和修改验证。

    1. 准备目录与工具

    下载示例包,解压到可写目录,并在包含 tools/tests/ 的目录执行后续命令。已有本仓库时可直接在仓库根目录操作。

    需要 Linux、uv、Python 3.11 或更新版本,以及可编译运行的 VCS 和 license。运行器仅使用 Python 标准库。用本机环境脚本配置工具;需要的变量如下:

    配置 用途
    VCS_HOME VCS 安装目录,内含两版 UVM 库及目标 compat 源码
    PATH 能找到 vcs 及 VCS 所需的编译工具
    license 配置 沿用实际环境,例如 SNPSLMD_LICENSE_FILELM_LICENSE_FILE

    包内 environment.example.sh 提供空值模板。按本机环境填写后加载;也可加载仓库内已有的本地 .env。两者任选其一,不需要创建同名文件才能运行示例。

    1
    2
    3
    4
    # 已有仓库本地环境文件时
    set -a
    source .env
    set +a
    

    2. 复现旧写法

    completed 为 test 中初值为 0 的成员。两段代码分别放在该 test 的 run_phase 中:

    1
    2
    3
    4
    5
    // Old run_phase body
    uvm_test_done_objection::get().raise_objection(this);
    #10;
    completed = 1;
    uvm_test_done_objection::get().drop_objection(this);
    
    uv run tools/run_uvm_review.py --case objection_probe --variants 12,20
    

    运行器分别编译和运行两版,固定 seed=1,并检查预期观察值。末尾应出现 "passed": true,其中关键差异为:

    观察内容 UVM 1.2 UVM 2.0
    completed 是否置 1 是,工作完成 否,run 提前结束

    此处断言通过表示成功复现差异。done=1 只是探针输出完成,不能代替 run_completed

    3. 验证修改后的写法

    改用 run_phase(uvm_phase phase) 传入的实际 phase:

    1
    2
    3
    4
    phase.raise_objection(this);
    #10;
    completed = 1;
    phase.drop_objection(this);
    
    uv run tools/run_uvm_review.py --case objection_probe --variants 12,20 --plusarg +MIGRATED --check tests/uvm_review/objection_migrated.expected.json
    

    两版应均为 run_completed=1。源码通过 +MIGRATED 选择实际 phase 的 raise/drop;查看完整修改与验收条件

    4. 找到输出并迁移到环境测试

    命令末尾 Results: 给出本次 results.json 的实际路径。构建和日志位于 .scratch/review/,每次运行及每个库使用独立目录。编译失败先读该变体的 compile.log,仿真或断言失败读 sim.log 和结果中的 mismatches

    将完成标志、事务计数和检查器排空检查移到真实 test,并在迁移清单中记录 S2 的结果与证据位置。

    随后可阅读字段比较漏检案例codec backdoor 案例,或从全部示例选择实际命中的模块。

    版本适用范围