跳转至

输入查询内容

    本页内容

    资源连续改写:入池、scope、precedence 与单侧 override

    环境:VCS W-2024.09-SP2-8。1.2 使用 uvm-1.2,2.0 使用 uvm-ieee-2020-2.0

    实验检查观察值是否符合预期;成功复现问题不代表问题已修复。

    结果对比

    观察内容 UVM 1.2 UVM 2.0
    普通资源入池前显式 scope 匹配成功(1=是) scope_before_insert 1 1
    普通资源入池前数据库查询为空(1=是) absent_before_insert 1 1
    按名查询资源的读回值 named_value 42 42
    按类型查询得到原资源对象(1=是) typed_identity 1 1
    资源加入资源池后的优先级 precedence_after_insert 2000 2000
    显式选择最高 precedence 后的资源值 highest_value 42 42
    name-only override 后按名查询的值 name_override_value 22 22
    name-only override 后按类型查询的值 type_order_value 11 11

    运行命令

    目录与环境准备;从解包根目录执行:

    uv run tools/run_uvm_review.py --case resource_migration_probe --variants 12,20
    

    最小源码

    resource_migration_probe.sv

    resource_migration_probe.sv
    `timescale 1ns/1ps
    `include "uvm_macros.svh"
    import uvm_pkg::*;
    
    module resource_migration_probe;
      initial begin
        uvm_resource_pool rp = uvm_resource_pool::get();
        uvm_resource#(int) r, selected, other, replacement;
        uvm_resource_base winner;
        uvm_resource_types::rsrc_q_t candidates;
    
        r = new("limit", "env.agent");
        r.write(42);
        $display("REVIEW|scope_before_insert|%0d", r.match_scope("env.agent"));
        selected = uvm_resource_db#(int)::get_by_name("env.agent", "limit", 0);
        $display("REVIEW|absent_before_insert|%0d", selected == null);
    `ifdef REVIEW_UVM20
        rp.set_scope(r, "env.agent");
        rp.set_precedence(r, 2000);
    `else
        r.set();
        r.precedence = 2000;
    `endif
        selected = uvm_resource_db#(int)::get_by_name("env.agent", "limit");
        if (selected == null) `uvm_fatal("RESOURCE", "Missing resource")
        if (selected.read() != 42) `uvm_fatal("RESOURCE", "Unexpected value")
        $display("REVIEW|named_value|%0d", selected.read());
        selected = uvm_resource_db#(int)::get_by_type("env.agent");
        if (selected != r) `uvm_fatal("RESOURCE", "Unexpected resource")
        $display("REVIEW|typed_identity|%0d", selected == r);
        $display("REVIEW|precedence_after_insert|%0d", r.precedence);
    
        // Competing priorities: use the explicit selection described in M05-010.
        other = new("limit", "env.agent");
        other.write(99);
        rp.set(other);
        other.precedence = 1000;
        candidates = rp.lookup_name("env.agent", "limit", uvm_resource#(int)::get_type());
        winner = rp.get_highest_precedence(candidates);
        if (winner == null) `uvm_fatal("RESOURCE", "Empty selection")
        if (!$cast(selected, winner)) `uvm_fatal("RESOURCE", "Unexpected resource type")
        $display("REVIEW|highest_value|%0d", selected.read());
    
        // Equal priorities: a name-only override must leave type order unchanged.
        other = new("choice", "override_case");
        replacement = new("choice", "override_case");
        other.write(11); replacement.write(22);
        rp.set(other);
    `ifdef REVIEW_UVM20
        rp.set_name_override(replacement, "override_case");
    `else
        replacement.set_override(uvm_resource_types::NAME_OVERRIDE);
    `endif
        selected = uvm_resource_db#(int)::get_by_name("override_case", "choice");
        if (selected == null) `uvm_fatal("RESOURCE", "Missing name override")
        $display("REVIEW|name_override_value|%0d", selected.read());
        selected = uvm_resource_db#(int)::get_by_type("override_case");
        if (selected == null) `uvm_fatal("RESOURCE", "Missing typed resource")
        $display("REVIEW|type_order_value|%0d", selected.read());
        $display("REVIEW|done|1");
        $finish;
      end
    endmodule
    

    全部用例 · 证据摘要

    版本适用范围