快讯|两项AI政策发布,范式智能战略布局与产业方向高度契合
2026/5/9 22:20:54
根据您的需求,我将详细说明UVM中常用的寄存器测试标准工具,包括它们的使用流程、详细代码示例及使用说明。UVM寄存器模型是验证过程中不可或缺的组件,用于验证寄存器的正确功能和行为。
| 工具名称 | 主要功能 | 测试重点 | 适用场景 |
|---|---|---|---|
uvm_reg_hw_reset_seq | 验证寄存器在硬件复位后的值 | 寄存器复位值是否符合预期 | 系统级复位验证 |
uvm_reg_bit_bash_seq | 验证寄存器中每个位的独立读写功能 | 位的独立操作、位间串扰 | 寄存器位级功能验证 |
uvm_reg_access_seq | 测试寄存器的读写功能、复位值和访问权限 | 读写一致性、访问权限 | 寄存器基础功能验证 |
uvm_reg_predictor | 预测寄存器操作的预期结果 | 与DUT交互的寄存器操作 | 寄存器模型与DUT同步验证 |
uvm_reg_frontdoor_seq | 通过前门访问寄存器进行测试 | 前门访问的正确性 | 前门访问路径验证 |
主要功能:验证寄存器在硬件复位后的值是否符合预期。
使用流程:
// 寄存器模型测试示例 - 硬件复位测试classuvm_reg_hw_reset_seqextends uvm_reg_sequence;`uvm_object_utils(uvm_reg_hw_reset_seq)uvm_reg_model model;uvm_reg_map map;uvm_path_e path=UVM_FRONTDOOR;bit update_bit=1;functionnew(string name="uvm_reg_hw_reset_seq");super.new(name);endfunctionvirtualtaskbody();uvm_reg rg;uvm_reg_data_t value;uvm_reg_addr_t addr;uvm_reg_map map;// 获取寄存器模型中的所有寄存器foreach(model.regs[i])begin rg=model.regs[i];// 读取寄存器在硬件复位后的实际值if(rg.read(value,.map(map),.path(path))==UVM_IS_OK)begin// 比较实际值与复位值if(value!=rg.get_reset())begin `uvm_error("REG_HW_RESET",$sformatf("Register %s reset value mismatch! Expected: 0x%0h, Got: 0x%0h",rg.get_name(),rg.get_reset(),value))end endelsebegin `uvm_error("REG_HW_RESET",$sformatf("Failed to read register %s after reset",rg.get_name()))end end endtask endclass// 测试用例中使用示例classreg_hw_reset_testextends uvm_test;mcdf_rgm rm;// 寄存器模型functionnew(string name,uvm_component parent);super.new(name,parent);endfunctionvirtualfunctionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);rm=mcdf_rgm::type_id::create("rm",this);rm.build();rm.lock_model();endfunction taskrun_phase(uvm_phase phase);uvm_reg_hw_reset_seq reset_seq;phase.raise_objection(this);reset_seq=uvm_reg_hw_reset_seq::type_id::create("reset_seq");reset_seq.model=rm;reset_seq.start(null);phase.drop_objection(this);endtask endclass主要功能:验证寄存器中每个位的独立读写功能,确保位间无串扰。
使用流程:
// 寄存器位位测试示例classuvm_reg_bit_bash_seqextends uvm_reg_sequence;`uvm_object_utils(uvm_reg_bit_bash_seq)uvm_reg_model model;uvm_reg_map map;uvm_path_e path=UVM_FRONTDOOR;functionnew(string name="uvm_reg_bit_bash_seq");super.new(name);endfunctionvirtualtaskbody();uvm_reg rg;uvm_reg_field field;uvm_reg_data_t init_value,write_value,read_value;intfield_index;// 遍历模型中的所有寄存器foreach(model.regs[i])begin rg=model.regs[i];// 遍历寄存器中的所有字段foreach(rg.fields[j])begin field=rg.fields[j];field_index=j;// 读取字段的初始值init_value=rg.get();// 测试写1操作write_value=init_value|(1<<field.get_lsb_pos());if(rg.write(.value(write_value),.map(map),.path(path))==UVM_IS_OK)beginif(rg.read(read_value,.map(map),.path(path))==UVM_IS_OK)beginif(read_value!=write_value)begin `uvm_error("BIT_BASH",$sformatf("Bit %d in register %s write 1 failed! Expected: 0x%0h, Got: 0x%0h",field.get_lsb_pos(),rg.get_name(),write_value,read_value))end end end// 恢复初始值if(rg.write(.value(init_value),.map(map),.path(path))==UVM_IS_OK)begin// 测试写0操作write_value=init_value&~(1<<field.get_lsb_pos());if(rg.write(.value(write_value),.map(map),.path(path))==UVM_IS_OK)beginif(rg.read(read_value,.map(map),.path(path))==UVM_IS_OK)beginif(read_value!=write_value)begin `uvm_error("BIT_BASH",$sformatf("Bit %d in register %s write 0 failed! Expected: 0x%0h, Got: 0x%0h",field.get_lsb_pos(),rg.get_name(),write_value,read_value))end end end end end end endtask endclass// 测试用例中使用示例classreg_bit_bash_testextends uvm_test;mcdf_rgm rm;functionnew(string name,uvm_component parent);super.new(name,parent);endfunctionvirtualfunctionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);rm=mcdf_rgm::type_id::create("rm",this);rm.build();rm.lock_model();endfunction taskrun_phase(uvm_phase phase);uvm_reg_bit_bash_seq bit_bash_seq;phase.raise_objection(this);bit_bash_seq=uvm_reg_bit_bash_seq::type_id::create("bit_bash_seq");bit_bash_seq.model=rm;bit_bash_seq.start(null);phase.drop_objection(this);endtask endclass主要功能:测试寄存器的读写功能、复位值和访问权限。
使用流程:
// 寄存器访问测试示例classuvm_reg_access_seqextends uvm_reg_sequence;`uvm_object_utils(uvm_reg_access_seq)uvm_reg_model model;uvm_reg_map map;uvm_path_e path=UVM_FRONTDOOR;functionnew(string name="uvm_reg_access_seq");super.new(name);endfunctionvirtualtaskbody();uvm_reg rg;uvm_reg_data_t value;uvm_reg_data_t init_value;uvm_reg_data_t rand_value;uvm_reg_data_t read_value;// 遍历模型中的所有寄存器foreach(model.regs[i])begin rg=model.regs[i];// 读取寄存器的初始值(复位值)if(rg.read(init_value,.map(map),.path(path))==UVM_IS_OK)begin// 验证复位值是否符合预期if(init_value!=rg.get_reset())begin `uvm_error("REG_ACCESS",$sformatf("Register %s reset value mismatch! Expected: 0x%0h, Got: 0x%0h",rg.get_name(),rg.get_reset(),init_value))end// 生成随机测试值rand_value=$urandom();// 写入随机测试值if(rg.write(rand_value,.map(map),.path(path))==UVM_IS_OK)begin// 读取回写值if(rg.read(read_value,.map(map),.path(path))==UVM_IS_OK)begin// 验证一致性if(read_value!=rand_value)begin `uvm_error("REG_ACCESS",$sformatf("Register %s write-read consistency failed! Written: 0x%0h, Read: 0x%0h",rg.get_name(),rand_value,read_value))end end end end end endtask endclass// 测试用例中使用示例classreg_access_testextends uvm_test;mcdf_rgm rm;functionnew(string name,uvm_component parent);super.new(name,parent);endfunctionvirtualfunctionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);rm=mcdf_rgm::type_id::create("rm",this);rm.build();rm.lock_model();endfunction taskrun_phase(uvm_phase phase);uvm_reg_access_seq access_seq;phase.raise_objection(this);access_seq=uvm_reg_access_seq::type_id::create("access_seq");access_seq.model=rm;access_seq.start(null);phase.drop_objection(this);endtask endclassUVM提供了uvm_resource_db机制,可以针对特定寄存器进行测试控制,避免某些寄存器参与测试。
// 使用uvm_resource_db控制特定寄存器测试classmy_uvm_testextends uvm_test;mcdf_rgm rm;functionnew(string name,uvm_component parent);super.new(name,parent);endfunctionvirtualfunctionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);// 创建寄存器模型rm=mcdf_rgm::type_id::create("rm",this);rm.build();rm.lock_model();// 设置要排除的寄存器string reg_path={"REG::",rm.some_register.get_full_name()};// 排除某寄存器的所有测试uvm_resource_db#(bit)::set(reg_path,"NO_REG_TESTS",1,this);// 仅排除硬件复位测试uvm_resource_db#(bit)::set({reg_path,".*"},"NO_REG_HW_RESET_TEST",1,this);endfunction taskrun_phase(uvm_phase phase);phase.raise_objection(this);// 运行寄存器访问测试序列uvm_reg_access_seq access_seq=uvm_reg_access_seq::type_id::create("access_seq");access_seq.model=rm;access_seq.start(null);// 运行硬件复位测试序列uvm_reg_hw_reset_seq hw_reset_seq=uvm_reg_hw_reset_seq::type_id::create("hw_reset_seq");hw_reset_seq.model=rm;hw_reset_seq.start(null);phase.drop_objection(this);endtask endclass