跳转至

输入查询内容

    本页内容

    codec 的 backdoor 回调替代

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

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

    修改前后对比

    观察内容 1.2 旧写法 2.0 旧写法 1.2 改写后 2.0 改写后
    编码写入后的硬件数据(十六进制) encoded_hardware 54 1 54 54
    后门读取并解码后的数据(十六进制) decoded_value 1 54 1 1

    运行命令

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

    uv run tools/run_uvm_review.py --case backdoor_probe --variants 12,20 --plusarg +MIGRATED --check tests/uvm_review/backdoor_migrated.expected.json
    

    旧写法运行命令

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

    最小源码

    backdoor_probe.sv

    backdoor_probe.sv
    `timescale 1ns/1ps
    `include "uvm_macros.svh"
    import uvm_pkg::*;
    class value_codec extends uvm_reg_cbs;
      function new(); super.new("codec"); endfunction
      virtual function void encode(ref uvm_reg_data_t data[]);
        if (!$test$plusargs("MIGRATED")) foreach(data[i]) data[i] ^= 'h55;
      endfunction
      virtual function void decode(ref uvm_reg_data_t data[]);
        if (!$test$plusargs("MIGRATED")) foreach(data[i]) data[i] ^= 'h55;
      endfunction
      virtual task pre_write(uvm_reg_item rw);
        if ($test$plusargs("MIGRATED")) foreach(rw.value[i]) rw.value[i] ^= 'h55;
      endtask
      virtual task post_read(uvm_reg_item rw);
        if ($test$plusargs("MIGRATED")) foreach(rw.value[i]) rw.value[i] ^= 'h55;
      endtask
    endclass
    class observed_backdoor extends uvm_reg_backdoor;
      uvm_reg_data_t hardware;
      function new(); super.new("backdoor"); endfunction
      virtual task write(uvm_reg_item rw);
        do_pre_write(rw);
        hardware = rw.value[0];
        rw.status = UVM_IS_OK;
        do_post_write(rw);
      endtask
      virtual function void read_func(uvm_reg_item rw);
        rw.value[0] = hardware;
        rw.status = UVM_IS_OK;
      endfunction
    endclass
    module backdoor_probe;
      initial begin
        observed_backdoor bd = new();
        value_codec codec = new();
        uvm_reg_item rw = new("rw");
        uvm_callbacks#(uvm_reg_backdoor,uvm_reg_cbs)::add(bd,codec);
        rw.value[0] = 1;
        bd.write(rw);
        $display("REVIEW|encoded_hardware|%0h", bd.hardware);
        bd.hardware = 'h54;
        bd.read(rw);
        $display("REVIEW|decoded_value|%0h", rw.value[0]);
        $display("REVIEW|done|1");
        $finish;
      end
    endmodule
    

    全部用例 · 证据摘要

    版本适用范围