VMM验证方法学精华指南

需积分: 10 2 下载量 27 浏览量 更新于2024-07-27 收藏 2.03MB PDF 举报
"vmm_golden_reference_guide_jan_2010.pdf——VMM金标准参考指南" 《VMM Golden Reference Guide》是一本详细介绍VMM(Virtual Machine Monitor)验证方法论的指南,第一版发行于2010年1月。VMM是一种广泛应用于系统级验证的框架,尤其在使用System Verilog语言进行硬件验证时,它提供了强大的库和方法论支持。该书由Doulos Ltd.出版,并可在vmmcentral.org免费下载。书中所有信息归Doulos Ltd.所有,未经许可,不得使用、存储、传输或以任何形式复制。 VMM是基于Apache Software Foundation的Apache License 2.0授权的,这意味着它遵循开放源代码的规则,允许自由使用、修改和分发。Apache License 2.0的完整文本可以在http://www.apache.org/licenses/找到。此书还提及了所有其他商标的归属权,尊重并承认其各自的持有者。 该书的内容包括: 1. 前言:提供对VMM方法论的基本介绍和使用本书的指导。 2. 使用指南:详细解释如何利用VMM进行验证工作,可能涵盖环境搭建、模型复用、覆盖率评估等方面。 3. VMM简介:概述VMM的核心概念,如虚拟机监视器的角色、基本组件(例如类库、环境、代理、驱动等)、以及其在验证流程中的应用。 4. 字母顺序参考:按照字母顺序列出VMM中的关键术语和概念,方便读者查找和理解。 5. 索引:提供全书的详细索引,帮助读者快速定位到特定主题或概念。 VMM方法论是系统验证领域的一个重要工具,它通过提供一组预定义的类和接口,使得验证工程师能够构建可重用的验证环境。VMM的关键特性包括模块化、可扩展性和可复用性,这使得复杂的SoC(System on Chip)验证变得更加高效和可控。通过VMM,开发者可以构建基于组件的验证平台,这些组件可以独立开发和测试,然后集成到一个全面的验证环境中。 在实际应用中,VMM通常与UVM(Universal Verification Methodology)一起被提及,UVM是SystemVerilog标准的一部分,它在VMM的基础上进行了标准化,增加了更多通用的功能和更友好的API,但VMM仍然是许多验证团队的基础框架,尤其是在那些已经建立VMM基础的项目中。 《VMM Golden Reference Guide》是学习和掌握VMM验证方法论的重要资源,无论你是验证新手还是有经验的工程师,都能从中获得宝贵的指导和实践建议。

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 上传