跳转至

输入查询内容

    本页内容

    内置 reg/mem sequence 的随机数据序列变化

    影响范围

    要求内建 reg/mem sequence 在相同 seed 下生成旧随机值序列。

    具体差异

    测试值从返回 32 位的 $random 改为随机化 uvm_reg_data_t 字段,随机算法、状态对象及宽度均可能变化;不能将旧 $random 一概描述为全局共享流,也不能承诺跨库相同 seed 产生相同向量。回归应比较功能约束和覆盖,固定向量需求须显式传入数据。

    修改方案

    保留内置 sequence 调用;回归允许因 uvm_reg_randval 随机源变化而出现同 seed 的数据序列变化,使用访问约束、合法地址及 scoreboard 判定结果。外部 golden 若要求固定激励,应显式提供并保存激励数据,不能只凭同 seed 假定两库逐拍相同。

    兼容措施与范围:兼容措施不恢复旧随机数据轨迹;固定向量需求须显式保存与提供数据。

    迁移后验证

    固定 seed 记录访问地址和数据;区分随机源改变与协议错误,验收覆盖率和数据约束而非要求无依据的逐笔相同。

    记录本条结果M07-006 · 状态与证据

    补充查阅

    扫描定位与记录结果

    有扫描规则,覆盖部分可识别写法。脚本检查名称、参数和部分 FLAG 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。

    • S38 · 启发式RAL Backdoor 伪 map、内置 sequence 访问次数与随机激励。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules S38
    

    核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。

    扫描器下载、输入范围与报告说明

    源码与标准依据

    核查方式:源码核对。未单独进行 VCS 行为实测。

    VCS 内置 UVM-1.2uvm_mem_access_seq.svh:112$random 生成测试值)

    VCS 内置 uvm-ieee-2020-2.0uvm_mem_access_seq.svh:61/uvm_mem_access_seq.svh:119;新文件 uvm_reg_randval.svh:35class uvm_reg_randval,含 rand uvm_reg_data_t randval

    引用代码(高亮为引用行);上方行号链接可直接定位。

    src/vcs-uvm-1.2/reg/sequences/uvm_mem_access_seq.svh
             // - Write complement of random value via back door
             // - Read via front door and expect inverted random value
             for (int k = 0; k < mem.get_size(); k++) begin
                val = $random & uvm_reg_data_t'((1'b1<<n_bits)-1);
                if (n_bits > 32)
                  val = uvm_reg_data_t'(val << 32) | $random;
                if (mode == "RO") begin
                   mem.peek(status, k, exp);
                   if (status != UVM_IS_OK) begin
                      `uvm_error("uvm_mem_access_seq", $sformatf("Status was %s when reading \"%s[%0d]\" through backdoor.",
                                                  status.name(), mem.get_full_name(), k))
                   end
                end
                else exp = val;
    
                mem.write(status, k, val, UVM_FRONTDOOR, maps[j], this);
                if (status != UVM_IS_OK) begin
                   `uvm_error("uvm_mem_access_seq", $sformatf("Status was %s when writing \"%s[%0d]\" through map \"%s\".",
                                               status.name(), mem.get_full_name(), k, maps[j].get_full_name()))
    

    完整源码 · SHA256:35411f92e83ed0e73fc70a67dff8bc7d5cda021ed7eafff8617aaf8f788e0b6b

    src/vcs-uvm-ieee-2020-2.0/reg/sequences/uvm_mem_access_seq.svh
       // The memory to be tested
       //
       uvm_mem mem;
       rand uvm_reg_randval rand_reg_val;
    
       `uvm_object_utils(uvm_mem_single_access_seq)
    
       // @uvm-ieee 1800.2-2020 auto E.5.1.3
       function new(string name="uam_mem_single_access_seq");
         super.new(name);
         rand_reg_val = new();  
       endfunction
    
       virtual task body();
          string mode;
          uvm_reg_map maps[$];
          int n_bits;
    
          if (mem == null) begin
    

    src/vcs-uvm-ieee-2020-2.0/reg/sequences/uvm_mem_access_seq.svh
             // - Write complement of random value via back door
             // - Read via front door and expect inverted random value
             for (int k = 0; k < mem.get_size(); k++) begin
                void'(rand_reg_val.randomize()); 
                val = rand_reg_val.randval & uvm_reg_data_t'((1'b1<<n_bits)-1);
                if (mode == "RO") begin
                   mem.peek(status, k, exp);
                   if (status != UVM_IS_OK) begin
                      `uvm_error("uvm_mem_access_seq", $sformatf("Status was %s when reading \"%s[%0d]\" through backdoor.",
                                                  status.name(), mem.get_full_name(), k))
                   end
                end
                else exp = val;
    
                mem.write(status, k, val, UVM_FRONTDOOR, maps[j], this);
                if (status != UVM_IS_OK) begin
                   `uvm_error("uvm_mem_access_seq", $sformatf("Status was %s when writing \"%s[%0d]\" through map \"%s\".",
                                               status.name(), mem.get_full_name(), k, maps[j].get_full_name()))
                end
    

    完整源码 · SHA256:7a689bcbef8609d849bede822610f9c6344b8a20f005fe534a43ce1f4d283beb

    src/vcs-uvm-ieee-2020-2.0/reg/sequences/uvm_reg_randval.svh
    // and may be randomized in order to generate a random register value
    // based on the context of the sequence's random seed without altering
    // the state of other random members of the sequence 
    
    class uvm_reg_randval;
    
      rand uvm_reg_data_t randval;
    
    endclass
    

    完整源码 · SHA256:3e759eb4af9865980fc88fa3f57e7e8ef02dd38456d12d325bec5ef8f88f56ee

    术语解释 · 兼容配置

    返回RAL(寄存器模型) · 迁移清单

    版本适用范围