UVM-Connect与TLM-2.0基础指南

需积分: 10 6 下载量 22 浏览量 更新于2024-07-20 收藏 1.76MB PDF 举报
"UVM-Connect是Mentor Graphics公司提供的一个验证库,它支持Transaction Level Modeling (TLM) 1.0和2.0标准,用于构建可复用和可扩展的验证环境。该库旨在帮助工程师在系统级验证过程中实现组件之间的通信和连接。" UVM(Universal Verification Methodology)是一种广泛使用的硬件验证方法论,而UVM-Connect是UVM生态系统中的一个重要部分。它提供了一套工具和机制,允许不同的验证组件通过TLM接口进行高效的通信。TLM是一种抽象层次,使得验证组件可以独立于底层数据传输机制工作,从而提高设计验证的灵活性和效率。 TLM-2.0是TLM的一个增强版本,相比于TLM-1.0,它引入了更多的特性以解决复杂系统验证的需求,如多线程支持、动态配置、更强大的错误处理机制和更高效的传输机制。UVM-Connect库包含了对TLM-2.0的支持,使得用户能够利用这些高级特性来构建更加健壮和高效的验证环境。 UVM-Connect库中的关键组件包括: 1. Connectors:连接器是UVM-Connect的核心,它们负责在不同组件之间传递transaction。例如,`uvm_analysis_connect`用于将分析出口与分析港连接,`uvm_tlm_analysis_fifo`用于在分析端口间建立数据通道。 2. Buses and Protocols:库提供了多种预定义的总线和协议模型,如AHB、APB等,简化了与特定总线协议交互的组件设计。 3. TLM Ports and Endpoints:TLM端口和终点是组件间通信的基础,它们定义了transaction的发送和接收接口。 4. Transactors:Transactors是模拟硬件行为的软件实体,它们生成和响应transaction,通常与特定的协议或总线兼容。 5. Transaction Models:这些模型定义了transaction的结构和行为,可以被transactors和其它组件使用。 使用UVM-Connect的优势在于,它提供了一套标准化的方法来管理验证组件间的通信,降低了设计的复杂性,并提高了代码的可重用性。通过遵循TLM-2.0规范,用户可以创建模块化的验证组件,这些组件可以独立开发并在多个项目中重复使用。 在实际应用中,工程师可以通过参考Mentor Graphics提供的在线Cookbook和Methodology Documentation来学习如何有效地使用UVM-Connect。这些资源提供了详细的指导,帮助用户理解如何配置和连接验证组件,以及如何利用TLM-2.0特性优化验证流程。 UVM-Connect是UVM框架中一个强大且不可或缺的部分,它促进了基于TLM的组件间的高效通信,简化了复杂系统的验证工作,同时也为验证团队提供了可扩展性和重用性的解决方案。通过深入理解和熟练掌握UVM-Connect,工程师可以在系统级验证中实现更高的生产力和质量。

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