[UVM] uvm_reg学习

一、定义单个寄存器(uvm_reg)

复制代码
// 自定义寄存器:32位
class ctrl_reg extends uvm_reg;
  `uvm_object_utils(ctrl_reg)

  // 1. 声明寄存器字段
  rand uvm_reg_field en;
  rand uvm_reg_field mode;

  // 构造函数:寄存器位宽32
  function new(string name="ctrl_reg");
    super.new(name, 32, UVM_NO_COVERAGE);
  endfunction

  
  virtual function void build();
    // 实例化字段
    en   = uvm_reg_field::type_id::create("en");
    mode = uvm_reg_field::type_id::create("mode");

    // configure(所属reg,位宽,起始位,权限,volatile,复位值,有复位,可随机,假访问)
    en.configure  (this, 1, 0, "RW", 0, 1'b0, 1, 1, 0);
    mode.configure(this, 2, 1, "RW", 0, 2'b00,1,1,0);
  endfunction

endclass

二、建寄存器块 uvm_reg_block

复制代码
class reg_model extends uvm_reg_block;
  `uvm_object_utils(reg_model)

  // 声明寄存器
  ctrl_reg ctrl_reg;
  // 地址映射表
  uvm_reg_map reg_map;

  function new(string name="reg_model");
    super.new(name, UVM_NO_COVERAGE);
  endfunction

  virtual function void build();
    // 1. 创建寄存器
    ctrl_reg = ctrl_reg::type_id::create("ctrl_reg");
    ctrl_reg.build();  

    // 2. 创建map:基地址0,地址步长4字节,小端
    reg_map = create_map("reg_map", 0, 4, UVM_LITTLE_ENDIAN);

    // 3. 寄存器挂到偏移地址 0x00
    reg_map.add_reg(ctrl_reg, 32'h00, "RW");

    // 4. 锁定ral模型,不能再改
    lock_model();
  endfunction
endclass

三、在 env 环境里实例化寄存器模型

复制代码
class my_env extends uvm_env;
  `uvm_object_utils(my_env)
  reg_model rm;   // 寄存器模型

  function new(string name="my_env");
    super.new(name);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    rm = reg_model::type_id::create("rm");
    rm.build();    // 必须调用build
    rm.reset();    // 复位寄存器默认值
  endfunction
endclass

四、test 用例里操作寄存器

复制代码
class my_test extends uvm_test;
  `uvm_object_utils(my_test)
  my_env env;
  uvm_status_e status;
  uvm_reg_data_t rdata;

  function new(string name="my_test");
    super.new(name);
  endfunction

  virtual task run_phase(uvm_phase phase);
    phase.raise_objection(this);

    // 1. 前门写:走总线发写操作
    env.rm.ctrl_reg.write(status, 32'h00000005, UVM_FRONTDOOR);
    #100ns;

    // 2. 前门读
    env.rm.ctrl_reg.read(status, rdata, UVM_FRONTDOOR);
    `uvm_info("READ",$sformatf("reg read = 0x%0h",rdata),UVM_MEDIUM)

    // 3. 只改期望值,不发总线
    env.rm.ctrl_reg.set(32'h00000007);
    // update:把期望值同步写到硬件
    env.rm.ctrl_reg.update(status);

    // 4. 后门直接写DUT寄存器(零延时)
    env.rm.ctrl_reg.poke(32'h00000009);
    // 后门直接读
    env.rm.ctrl_reg.peek(rdata);

    phase.drop_objection(this);
  endtask
endclass

五、顶层 TB 关联寄存器模型(绑定总线 agent)

在 top_tb 里,把reg_model 的 map 和 bus_agent 绑定

复制代码
env.rm.default_map.set_sequencer(env.bus_agent.sqr);
env.rm.default_map.set_adapter(env.reg_adapter);
相关推荐
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2026.05.29 题目:3300. 最小元素
笔记·leetcode
中屹指纹浏览器3 小时前
2026指纹浏览器代理链路适配原理与多线路集群调度方案
经验分享·笔记
不羁的木木3 小时前
ArkWeb实战学习笔记05-综合实战:构建混合应用
笔记·学习·harmonyos
CC大煊3 小时前
一个Javaer的AI转型笔记(1):入坑LangChain,我的第一个hello world
笔记·langchain
元气少女小圆丶5 小时前
SenseGlove Nova 2+Unity开发笔记1
笔记·学习·unity
冰暮流星6 小时前
javascript之history对象介绍
前端·笔记
jialiguo7 小时前
博客摘录「 尚硅谷Vue3入门到实战,最新版Vue3+TypeScript前端开发教程」2024年8月7日
笔记
風清掦8 小时前
【STM32学习笔记-14】WDG看门狗 - 14.2 WWDG窗口看门狗
笔记·stm32·单片机·嵌入式硬件·学习·fpga开发
晓梦林8 小时前
bughush靶场学习笔记
笔记·学习
sakiko_9 小时前
Swift学习笔记34-MVC架构,SwiftUI与UIkit混编练习
笔记·学习·swiftui·mvc·swift