SystemVerilog验证方法手册:提升测试平台可重用性

需积分: 9 3 下载量 181 浏览量 更新于2024-07-16 收藏 8.65MB PDF 举报
"vmm_sv.pdf 是一份关于SystemVerilog验证方法的手册,旨在指导如何使用VMM(Virtual Machine Model)构建测试平台,提高仿真复用性。该手册由Janick Bergeron、Eduard Cerny、Alan Hunter和Andrew Nightingale等人撰写,涵盖了Verilog硬件描述语言在集成电路验证中的应用。" SystemVerilog是一种强大的硬件描述语言,它扩展了传统的Verilog,增加了面向对象的编程特性,使得验证工作更加高效和结构化。VMM(Verification Methodology Manual for SystemVerilog)是基于SystemVerilog的一种验证方法论,它提供了一套框架和库,用于构建可复用的验证环境。 在VMM中,重点在于模块化和组件化的测试平台设计。这包括验证组件(Verification Components)、类库(Class Libraries)以及验证机制(Verification Mechanisms)。验证组件是验证环境的基本构建块,它们可以被重用并组合在一起,以模拟待验证设计的行为。类库则包含了各种预定义的类,如随机化器(Randomizers)、覆盖驱动器(Cover Drivers)和监控器(Monitors),这些工具帮助开发者编写更有效的测试用例和验证覆盖。 VMM的关键概念包括: 1. **OOP(面向对象编程)**:利用SystemVerilog的类和继承,VMM允许创建可复用的验证类,增强了代码的组织性和可维护性。 2. **抽象层(Abstraction Layers)**:VMM通过不同的抽象层次,如接口层、事务层和原始数据层,简化了复杂设计的验证。 3. **环境(Environments)**:VMM的环境是验证的核心,它包含组件、激励源、监控器和覆盖点,用于全面验证设计的功能和性能。 4. **共享变量(Shared Variables)**:VMM利用SystemVerilog的共享变量实现组件间的通信,确保了在并发执行时的数据一致性。 5. **覆盖(Coverage)**:VMM提供了丰富的覆盖模型,帮助确保验证的完整性,确保测试用例能够充分探索设计空间。 通过遵循VMM方法论,开发者可以创建高效、结构化且可扩展的验证环境,从而加速IC验证过程,降低出错风险,并提高整体的设计质量。这份手册是学习和应用VMM的重要参考资料,包含了丰富的实例和最佳实践,对于任何从事SystemVerilog验证工作的工程师来说都是宝贵的资源。

class vbase_test extends uvm_test; `uvm_component_utils(vbase_test) env m_env; vseqr m_vseqr; int unsigned simSeed; function new(string name, uvm_component parent); super.new(name, parent); endfunction : new extern function void build_phase (uvm_phase phase); extern function void connect_phase (uvm_phase phase); extern task reset_phase(uvm_phase phase); extern task reset_reg_model(); extern function void end_of_elaboration_phase(uvm_phase phase); extern function void start_of_simulation_phase(uvm_phase phase); extern task main_phase(uvm_phase phase); // report test result extern virtual function void report_phase(uvm_phase phase); endclass : vbase_test function void vbase_test::build_phase (uvm_phase phase); super.build_phase(phase); m_env = env::type_id::create(.name("m_env"), .parent(this)); // virtual sequencer m_vseqr = vseqr::type_id::create(.name("m_vseqr"), .parent(this)); uvm_config_db# (uvm_object_wrapper)::set(this,"m_vseqr.main_phase","default_sequence",vBaseSeq::type_id::get()); //uvm_config_db# (uvm_object_wrapper)::set(this,"m_vseqr.main_phase","default_sequence",vUniBaseSeq#()::type_id::get()); endfunction : build_phase function void vbase_test::connect_phase (uvm_phase phase); m_vseqr.p_rm = m_env.m_reg_model; m_vseqr.i2c_seqr = m_env.m_i2c_agent.m_seqr; endfunction : connect_phase task vbase_test::reset_phase(uvm_phase phase); //`uvm_info(get_type_name(), {"REGISTER MODEL:\n", m_reg_model.sprint()}, UVM_MEDIUM) reset_reg_model(); super.reset_phase(phase); endtask task vbase_test::reset_reg_model(); forever begin wait (tb_top.reset_n == 0); m_env.m_reg_model.reset(); `uvm_info(get_type_name(), "Reseting Complete", UVM_MEDIUM) wait (tb_top.reset_n == 1); end endtask function void vbase_test::end_of_elaboration_phase(uvm_phase phase); int handle; $system("rm -rf TEST_RUNNING"); simSeed = $get_initial_random_seed(); handle = $fopen($psprintf("TEST_RUNNING_%0d",simSeed),"w"); $fclose(handle); handle = $fopen("caseSeed","w"); $fwrite(handle,"%0d",simSeed); $fclose(handle); if($test$plusargs("uvm_tree")) uvm_top.print_topology(); endfunction : end_of_elaboration_phase function void vbase_test::start_of_simulation_phase(uvm_phase phase); `uvm_info(get_type_name(), {"start of simulation for ", get_full_name()}, UVM_HIGH); endfunction : start_of_simulation_phase task vbase_test::main_phase(uvm_phase phase); phase.phase_done.set_drain_time(this, 200ns); endtask : main_phase // report test result function void vbase_test::report_phase(uvm_phase phase); uvm_report_server server; int handle; int unsigned err_num; super.report_phase(phase); server = get_report_server(); err_num = (server.get_severity_count(UVM_ERROR) + server.get_severity_count(UVM_FATAL)); simSeed = $get_initial_random_seed(); $display("\n********************************************************************************************\n"); if (err_num != 0) begin $display("TEST CASE FAILED!!!"); handle = $fopen($psprintf("TEST_FAILED_%0d",simSeed),"w"); end else begin $display("TEST CASE PASSED!!!"); handle = $fopen($psprintf("TEST_PASSED_%0d",simSeed),"w"); end $fclose(handle); $display("\n********************************************************************************************\n"); $system("rm -rf TEST_RUNNING*"); endfunction `endif

2023-07-25 上传