资讯动态

[UVM] uvm_reg学习

发布时间:2026/8/17 19:15:39 来源:尧图企业网站定制
一、定义单个寄存器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 namectrl_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, 1b0, 1, 1, 0); mode.configure(this, 2, 1, RW, 0, 2b00,1,1,0); endfunction endclass二、建寄存器块 uvm_reg_blockclass reg_model extends uvm_reg_block; uvm_object_utils(reg_model) // 声明寄存器 ctrl_reg ctrl_reg; // 地址映射表 uvm_reg_map reg_map; function new(string namereg_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, 32h00, 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 namemy_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 namemy_test); super.new(name); endfunction virtual task run_phase(uvm_phase phase); phase.raise_objection(this); // 1. 前门写走总线发写操作 env.rm.ctrl_reg.write(status, 32h00000005, 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(32h00000007); // update把期望值同步写到硬件 env.rm.ctrl_reg.update(status); // 4. 后门直接写DUT寄存器零延时 env.rm.ctrl_reg.poke(32h00000009); // 后门直接读 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);

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价