UVM实战指南——第3部分

合集下载

UVM初级开发指南

UVM初级开发指南

UVM初级开发指南本文完成于13年10月,是自己在做验证过程中的第一个文档。

文档中以张强的《UVM1.1应用指南及源代码分析》中的第一章的示例作为模型,简单讲述了UVM1.1d在QuestaSim中的应用,并添加了C语言和SV语言的联合仿真,对初学UVM验证的同学提供实际操作方面的帮助。

因为自己的毕业设计需要用到文档中的部分内容,所以直到现在才将其分享出来,希望更多的人能够受益。

写在前面时光荏苒、岁月如梭,转眼已到自己毕业的时间。

回首自己将近三年的研究生学习生活,一路坎坎坷坷,幸而得到身边许多良师益友的关怀和指导、帮助和激励,使自己得以勤奋自勉,顺利完成学业。

以前自己主要是做单片机、MSP430、STM32,写过LDPC的译码Verilog 代码,偶尔做做安卓客户端,玩过新浪的SAE,总体来说做得比较杂,对于验证方面的知识从来没有接触过。

之后自己分到的任务是用SystemVerilog做一个CPU模型,用于测试我们的RTL代码。

于是自己开始学习SV,在学习SV的过程中钟文枫的《SystemVerilog与功能验证》这本书给自己提供了很大的帮助,自己基本上将里面的代码都敲了一遍,就这样摸索了大约两周吧,摸索到了UVM (Universal Verification Methodology)这个陌生的东西,到这里,自己才算是摸到了验证的门沿。

同时期间由于北大的需求(要实现两个软件自动执行然后文件夹比较的功能,也是用于验证),自己学习了批处理语言,给下一步工作打下了基础。

然后找到张强的《UVM1.1应用指南及源代码分析》(去年8月张强出了一本《UVM实战-1》的书,可喜可贺,建议阅读该书)开始看啊看,主要看了其中的前两章,总共能看三遍吧,因为后面基本上都是源码的分析,我又用不到理论的东西(其实有空了还是要看一看的,这样出现问题了好排查),因此没有往后看,算是对UVM有个初步的了解,期间各种百度和google,UVM的中文资料还是比较少,最后在EETOP的IC验证板块中找到一些信息,后面自己有什么问题都在上面问。

UVM实战指南——第3部分

UVM实战指南——第3部分

UVM实战指南——第3部分第3部分:UVM实战在前两部分中,我们介绍了UVM框架的基本概念和基本用法。

在这一部分,我们将进一步探讨UVM的实际应用,并提供一些实战技巧和建议。

1.重要性分析在开始UVM实战前,首先需要进行重要性分析。

这包括确定哪些功能是需要覆盖的,哪些功能是必要的,以及哪些可能引发错误的功能需要特殊关注。

这些分析可以帮助您确定测试计划的优先级,并在测试开发过程中更好地分配资源。

2.测试计划开发根据重要性分析的结果,您可以开始开发测试计划。

测试计划应该详细描述实施哪些测试以及对每个测试的期望结果。

它还应包括测试开发和验证团队的人员分配和时间表安排。

通过制定清晰的测试计划,您可以确保测试开发工作有条不紊地进行,并及时识别和解决问题。

3.环境开发在开发测试计划后,您可以开始开发UVM环境。

环境是UVM中最关键的部分之一,它包含了用于模拟验证环境的各种组件和接口。

在环境开发过程中,您需要根据测试计划中的需求,选择和实例化适当的UVM组件,并将它们连接在一起以形成完整的验证环境。

4.测试用例开发测试用例是验证过程中的核心功能。

在开发测试用例时,您需要通过实例化适当的测试类,指定测试目标,并配置测试环境。

您还需要定义测试封包,设置或生成输入数据,以及从模拟输出中提取和分析结果。

测试用例的开发应该遵循UVM的最佳实践,并确保测试覆盖范围广泛且有效。

5.仿真运行和调试一旦测试用例开发完成,您可以开始运行仿真并进行调试。

在仿真过程中,您可能会遇到各种问题,如信号不正确、仿真停滞、错误输出等。

为了有效解决这些问题,您可以使用UVM提供的调试功能,如消息和日志记录、波形查看和追踪。

通过运用这些工具,您可以更快地找到问题所在,并采取适当的措施进行修复。

6.结果分析和测试报告当仿真运行完成后,您需要对结果进行分析,并生成测试报告。

在UVM中,您可以通过访问测试类中的结果和统计信息来执行结果分析。

您还可以使用UVM提供的报告和日志功能,将结果以易于阅读和理解的方式呈现给项目团队和其他相关人员。

UVM Lab Guide自学笔记——快速入门UVM

UVM Lab Guide自学笔记——快速入门UVM

UVM Lab Guide自学笔记——快速入门UVMfrom Monchy(蒙奇)在2020年秋招前根据Synopsys的SystemVerilog Verification UVM1.1Lab Guide自学UVM验证,在此分享前两章详细的学习笔记,几乎是指南的中文翻译,大量的过程截图对初学者很友好。

(UVM Lab Guide是Synopsys给出的UVM官方入门指南,里面包涵源码和实验指导,可以在网上自行下载。

建议参考《UVM实战》(张强))1UVM Environment1学习目标创建一个简单的UVM测试环境嵌入报告消息编译测试环境运行仿真并观察结果将数据、sequencer和驱动程序类添加到环境编译并仿真环境以观察行为2实验准备UVM由一组编码准则以及一组基类和宏组成。

这组基类和宏可帮助你开发外观和感觉上一致的测试平台。

这套编码准则使您能够开发鲁棒且高度可重复使用的测试平台组件,从而减少了修改、维护验证基础架构的时间,并花费更多时间验证您的设计。

第一个实验将按照UVM编码准则,使用UVM基类和宏开始构建UVM验证环境的过程:UVM lab文件夹有3个目录:labs(实验文件夹,里面的程序待补充)、solutions(lab的参考代码)和rtl(被测试的rtl代码)。

3搭建UVM测试平台任务1.创建简单的UVM 测试文件test_collection.svSolution:`ifndef TEST_COLLECTION_SV `define TEST_COLLECTION_SV `include "router_env.sv"class test_base extends uvm_test;`uvm_component_utils(test_base)router_env env;function new(string name,uvm_component parent);super.new(name,parent);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);endfunction:newvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);env =router_env::type_id::create("env",this);endfunction:build_phasevirtual function void start_of_simulation_phase(uvm_phase phase);super.start_of_simulation_phase(phase);`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);//Note:If you want to see the topology as a tree format try://uvm_top.print_topology(uvm_default_tree_printer);uvm_top.print_topology();factory.print();endfunction:start_of_simulation_phase endclass:test_base`endiftest.sv Solution:program automatic test;import uvm_pkg::*;`include "test_collection.sv"initial begin$timeformat(-9,1,"ns",10);run_test();end endprogram编译并仿真简单的UVM 测试平台:$vcs -sverilog -ntb_opts uvm-1.1test.sv 编译开关-ntb_opts 用于使能UVM$simv +UVM_TESTNAME=test_base 可以通过factory configuration 修改测试。

UVM实战指南

UVM实战指南

1. 这个callback结构并不能够真的改变widget对象的内部成员,以及处理的数据内容,仅仅能够输出一些讯息。

2. 对每一个widget的对象,都需要单独添加相关callback对象,假如程序中又创建了一个新的widget对象,那么这个对象的callback queue初始是空的,也就是没有callback。

必须再次添加才能让这个新的widget 调用相应的callback功能。

3. c allback只有一个地方,可以扩展到多个地方。

另外也可以使用function,而不仅仅是task.工厂模式的简单理解首先,如果一个客户要用到一款手机,一般的做法是客户去创建一款手机,然后拿来用:这时,客户需要知道怎么去创建一款手机,客户和手机就紧密耦合在一起了.为了降低耦合,就出现了工厂类,把创建手机的操作放到了工厂里面去,客户直接使用工厂的创建手机方法,传入想要的手机型号就行了,而不必去知道创建的细节.随着手机种类越来越多,简单工厂模式出现了弊端,每次新加入手机品种,工厂类都要加入新的创建逻辑.这时我们就可以把工厂类定义成了接口,而每增加一种新的手机,就增加该手机对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码:随着工厂规模的继续扩大,工厂开始生产充电器了.这时候工厂有二个系列的产品:手机和充电器.而手机必须使用对应的充电器才能使用.这时候分别使用一个手机工厂和一个充电器工厂都不能满足我们的需求,我们必须确认手机跟充电器的对应关系.我们把工厂改造一下,把手机工厂跟充电器工厂联系在一起:这一章主要包括:∙使用UVM库∙基本类∙TLM端口∙工厂模式∙消息和汇报∙配置机制4.1 使用UVM库为了使用UVM库,用户需要:∙编译UVM包的顶层文件:uvm_pkg.sv∙在所需要的地方导入uvm_pkg∙包含UVM宏4.1.1 Hello World例子下面的例子功能是在屏幕上显示消息:"Hello World!”1 // Compile the UVM package2 `include ―uvm_pkg.sv‖3 module hello_world_example;4 // Import the UVM library and include the UVM macros5 import uvm_pkg::*;6 `include ―uvm_macros.svh‖7 initial begin8 `uvm _info(“info1”,“Hello World!”, UVM _LOW)9 end10 endmodule: hello_world_example第1-2行:注释用来提醒需要编译UVM库。

UVM_mentorpaper_使用手册

UVM_mentorpaper_使用手册

UVM:下一代验证方法学Mark Glasser,方法学建构师2011年2月4日UVM是验证业界为自身研发的一种新验证方法学。

UVM代表着验证技术的最新进展,使用它可创建坚实、可重用、具互操作性的验证IP和测试流程(testbench)组件。

UVM最新奇、最令人兴奋的方面之一却是它是如何被开发的。

UVM不是由一家EDA供应商开发的,也并非作为营销活动的一部分而推出,它是由众多业内专家联合开发的,他们来自微处理器公司、网络公司、验证顾问机构以及EDA供应商。

UVM的全部开发工作是在Accellera(一个标准化组织,致力于开发电子设计自动化领域里的标准和开放接口)架构下完成的。

在一个标准组织的旗帜下,各家公司(其中一些是市场上的对手)才能够在协作的环境中携起手来,以迎战建构一个先进验证方法学所面临的技术挑战。

每位代表为这一协同努力都贡献了他们所在行业的专业知识和视角。

其结果是为建构验证环境贡献出一个强大、多维的软件层和方法学。

当然,UVM已经在主要EDA供应商的所有模拟器上都进行了测试。

UVM的确是种真正的行业创举,Mentor以亲历其中而自豪。

UVM并非从天而降。

它集许多独立验证方法学的成果之大成。

其承继的资产包括AVM、URM,VMM和OVM。

图1. UVM的继承UVM承继的这些方法学提供了UVM得以建立其上的丰富的方法学库。

最值得注意的是,OVM-2.1.1是UVM的“起点”,是UVM得以孕育成功的种子代码库。

因此,UVM与OVM最相近,且大体上向后兼容OVM。

作为VMM一部分的RAL 包被转化为UVM的寄存器功能。

虽然上面提到的一系列方法学是UVM得以成就的种子,但UVM并非其前辈代码的简单叠加。

UVM为测试流程(testbench)建构提供了新功能和新的使用模式,从而将验证方法学提升到一个新高度。

寄存器在现代SoC设计中,寄存器集合是作为设计的接口。

通过寄存器——器件得以复位和配置;数据得以接收和发送。

《UVM实战》代码示例

《UVM实战》代码示例

《UVM实战》代码⽰例⾸先是top_tb:`timescale 1ns/1ps`include "uvm_macros.svh"import uvm_pkg::*;`include "my_if.sv"`include "my_transaction.sv"`include "my_sequencer.sv"`include "my_driver.sv"`include "my_monitor.sv"`include "my_agent.sv"`include "my_model.sv"`include "my_scoreboard.sv"`include "my_env.sv"`include "base_test.sv"`include "my_case0.sv"`include "my_case1.sv"module top_tb;reg clk;reg rst_n;reg[7:0] rxd;reg rx_dv;wire[7:0] txd;wire tx_en;my_if input_if(clk, rst_n);my_if output_if(clk, rst_n);dut my_dut(.clk(clk),.rst_n(rst_n),.rxd(input_if.data),.rx_dv(input_if.valid),.txd(output_if.data),.tx_en(output_if.valid));initial beginclk = 0;forever begin#100 clk = ~clk;endendinitial beginrst_n = 1'b0;#1000;rst_n = 1'b1;endinitial beginrun_test();endinitial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif", output_if);endendmodule定义了时钟频率,传递了接⼝以链接TB,和⼀个run_test()。

uvm实战学习笔记

uvm实战学习笔记

《UVM 实战(卷 1 )》学习笔记看了第1/2/3/4/5/6/8/ 这几个章节。

第一章是综述,第二章是一个具体的例子,学习笔记从第三章相关内容开始。

我个人觉得UVM重要的部分(特点的部分):1)factory 机制(override config_db )2)TLM传递3)phase 机制4)sequence-sequencer 以及virtual seq/sqr内容中的截图基本来自于UVM源代码、书自带的例子和《应用指南及源代码分析》这个PDF里的。

需要结合书(《UVM实战(卷1)》第1版)来看这个笔记。

第3章UVM基础uvm_component 和口uvm_object常用的类名字:这个图是从作者张强的《应用指南及源代码分析》里截得,不如书上里的图好。

uvm_sequencer也是代码里必须有的,所以我加了uvm_seque nceruvm_void是一个空的虚类。

在src/base/中定义:红框的是我们搭testbench的时候用的比较多的基类。

常用的uvm_object派生类:sequencer 给driver 的transaction 要派生自uvm_sequence_item,不要派生自uvm_transaction所有的sequenee 要派生自uvm_sequenee 或者uvm_sequenee 的派生类,可以理解为sequenee 是sequence_item 的组合(集合)。

driver 向sequencer 索要item,sequencer 检查是否有sequenee 要发送item,当发现有item待发送时,就把这个item发给driver.常用的uvm_component 派生类:所有的driver要派生自uvm_driver. driver用来把sequence_item中的信息驱动到DUT端口上,从transaction-level 向signal-level 的转换。

UVM基础总结——基于《UVM实战》示例

UVM基础总结——基于《UVM实战》示例

UVM基础总结——基于《UVM实战》示例UVM(Universal Verification Methodology)是一种用于验证集成电路设计和系统级设计的方法学。

它提供了一种强大的框架,可以加速和规范验证过程,提高设计的质量和效率。

在《UVM实战》这本书中,通过讲解一系列示例,向读者介绍了UVM的基础知识和使用方法。

本书首先介绍了UVM的基本概念和工作原理。

UVM使用一种基于对象和类的面向对象方法来描述和组织验证环境。

它将验证环境划分为几个层次,包括顶层、环境、代理、驱动器、监视器等。

每个层次都包含不同的类和方法,用于实现不同的功能。

通过继承和实例化这些类,可以快速构建一个完整的验证环境。

接下来,本书介绍了UVM中的一些重要概念和方法。

例如,本书详细讲解了UVM的组件和接口。

组件是UVM中最基本的单元,用于实现特定的功能。

接口定义了组件之间的通信和数据交换方式。

UVM使用一种称为TLM(Transaction Level Modeling)的方法来进行通信,通过事务的方式传递数据。

本书还介绍了UVM中的一些重要机制,例如配置和工厂。

配置机制用于配置和管理验证环境中的各个组件和接口的参数。

它可以实现灵活的参数化配置,以适应不同的测试需求。

工厂机制用于管理对象的创建和销毁。

通过注册和继承,可以快速生成对象,并实现对象的多态。

本书还详细介绍了UVM中的测试用例和事务。

测试用例是验证环境中的最高层次,用于描述和控制验证过程。

测试用例可以包括多个事务,每个事务描述一个特定的操作或数据传输过程。

通过编写测试用例和事务,可以实现不同的功能和覆盖率要求。

最后,本书还介绍了一些高级的UVM特性和技术。

例如,本书介绍了UVM中的随机性和约束,用于实现随机的测试用例和事务。

本书还介绍了UVM中的一些重用机制,例如组件和测试用例的复用,以提高测试效率和质量。

通过《UVM实战》这本书的学习,我深入了解了UVM的基础知识和使用方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(*)题外话:TLM可能是UVM中最重要的概念,掌握了TLM,就可以开始尝试编写一些小程序了。

翻译这篇文章,也是为了巩固加强对TLM的理解。

(*)几个名词:transaction翻译为事务或者交易;packet翻译为封包,packet属于transaction;monitor翻译为监视器;driver翻译为驱动器;scoreboard翻译为记分牌;有些词汇直接被运用到UVM源代码上,所以有时候用英文更容易描述清楚。

(*)语言的目的是为了交流,翻译不是为了纯粹的语言转换,而是为了传递思想。

4.6 UVM中事务级建模(TLM)20多年前,设计者从门级转向RTL级。

这次转换来自于标准Verilog/VHDL的RTL编码风格,以及RTL综合实现工具的推出。

使用RTL最大的好处是让设计者更多的专注于时序行为的设计以及功能的正确性,而很少考虑门级相关设计。

TLM(事务级建模)同样在抽象级别上更进了一步,在设计和验证领域都有出现。

通过TLM, 中心放在系统级别的各种事务流的建模,而更少关心时钟级别的行为。

TLM在测试向量中已经使用多年。

通常,在产生激励和覆盖率检查的时候使用事务而不是用时钟级别建模,这种方式就是TLM. 为了验证RTL级别的DUT(需要测试的模块),测试向量使用事务发生器(transactor)(有时也称为总线功能模型(BFM)),将RTL级和事务级进行转换。

在UVM中,此事务发生器也被叫做驱动(driver)或者收集器(collector)。

TLM中,事务通过方法调用和类对象来建模。

使用事务级而不是信号级别来建模有几个显著的好处:∙TLM比RTL更简洁,仿真速度快。

∙TLM模型的抽象级别更高,更加契合验证工程师或设计工程师对内部功能的考虑,从而使得建模更简单,并且更容易被其他工程师理解。

∙TLM模型将不符合复用的部分移到模型之外,因此TLM很适合复用。

并且,TLM使用面向对象的技术,比如继承、实现和接口分离的技术。

TLM的采纳依赖于标准的TLM建模技术的出现,就像RTL综合流程的采纳归功于标准RTL 编码风格的实现。

幸运的是,近些年来,几个重要的标准TLM应用程序接口(API)得到定义。

在EDA和ESL领域,两个最重要的标准是开放SystemC计划(OSCI)的TLM1.0以及TLM2.0标准。

OSCI TLM 1.0标准是一个简单通用的TLM API, 用来建模消息传递。

在消息传递时,对象(事务)在组件之间传递的方式和封包在网络之间传递的方式类似。

在发送封包的消息传递中,发送端和接收端之间没有共享的状态,他们之间的通讯讯息仅仅包含在消息中。

The OSCI TLM 2.0标准能够用来开发SystemC中的高速虚拟平台模型。

TLM2.0标准特别被用作片上存储映射的总线系统,包含许多能够进行片上总线互联的整合复用模块. OSCI TLM 1.0和TLM 2.0是互相独立的标准,满足不同的需要。

有人可能通过其命名方式认为TLM2.0优于TLM1.0,但是实际上并不是这样。

UVM提供的TLM 类和API是基于TLM1.0标准的。

这是因为TLM通用消息传递语法很好的满足了多种验证组件的事务级建模。

TLM1.0也适合多种语言之间的通信建模,比如SystemVerilog, SystemC以及e语言之间的建模。

UVM中TLM1.0接口甚至可以用来和SystemC中的TLM2.0模型进行通讯。

这一章节阐述了UVM中TLM的几个重要概念,让读者理解如何使用TLM来构造可复用的验证组件。

关于TLM各种类的更详细说明请参阅UVM参考手册。

4.6.1 UVM中TLM的关键概念4.6.1.1 对事务建模在UVM中, 从uvm_sequence_item继承而来的任何类都是事务。

用户根据需要定义事务类的字段和方法,用来在验证环境中不同组件之间进行信息交换。

例如,一个简单的包如下所示:1.class simple_packet extends uvm_sequence_item;2.rand int src_addr;3.rand int dst_addr;4.rand byte unsigned data[];5.constraint addr_constraint { src_addr != dst_addr; }6....7.endclass事务通常包含足够多的数据字段让驱动器(driver)或者事务产生器能够产生事务的真实信号级别的动作表示。

事务也可以包含更多的数据字段,来控制数据的随机产生,或者是验证环境中的其他目的。

可以通过继承方式来增加更多的数据成员,方法以及约束。

后续章节将会说明,如何通过继承事务,从而花费最小的代价来完成特定的验证任务。

4.6.1.2 TLM调用端口(Ports)和实现端口(Exports)UVM中的TLM使用一系列特殊的方法调用来进行模型之间的事务通讯。

在UVM中,一个port对象定义了一系列可以被调用的方法,而export对象提供了对这些方法的实现。

在构建验证环境的时候,port和export通过connect()函数进行连接,之后,调用port端的TLM方法将会执行export中对此TLM方法的实现。

实例4.7: 使用put方法将事务从生产者传递给消费者在UVM的TLM中,put接口能够被用来将transaction从生产者发送给消费者。

一个简单的生产者示例如下:class producer extends uvm_component;uvm_blocking_put_port #(simple_packet) put_port;function new(string name, uvm_component parent);put_port = new("put_port", this);endfunctionvirtual task run();simple_packet p = new();..put_port.put(p);endtaskendclass之前有提到,put port通过调用connect()函数连接到put export. 对上面的put方法的实现将由消费者组件来完成,如下:class consumer extends uvm_component;uvm_blocking_put_imp #(simple_packet, consumer) put_export;task put(simple_packet p);// consume the packetendtaskendclass将port连接到export之后,调用生产者的put方法将会触发消费者的put方法实现得到执行,从而使得simple_packet对象从生产者传递到了消费者。

TLM也引入了标准的图形化示意来描述不同类型的通讯。

put通讯流程的模块图如下:图4-2:简单的生产者/消费者的put通讯TLM接口定义了一些生产者和消费者都必须遵循的简单规则,在这个示例中,对于put接口,规则如下:∙put方法的实现在执行时有可能阻塞,因此对put方法调用的对象必须负责确保在put方法阻塞的时候能够正常工作。

∙生产者负责创建封包,而消费者不能修改封包(如果需要修改,必须先拷贝一份新的)满足了上述规则,能够很容易的将生产者或者消费者替换成其他的模型,只要这些模型满足相同的TLM接口即可。

TLM API提供了一个简单的能够互相操作的接口协议,类似硬件世界中的USB,以太网标准一样。

由于能够容易的替换模型,UVM的TLM在满足模型复用和验证目标上发挥了关键性的作用,我们可以在后续章节进一步了解。

上述示例,在生产者中存在单独一个进程,当调用put方法时,控制流转到消费者中的put 方法中。

put方法将事务沿着方法调用控制流相同的方向进行传送。

在某些情况,由于消费者中包含一个需要事务数据的进程,希望将事务沿着TLM方法调用控制流相反的方向传送。

在这种情形下,生产者/消费者将使用get接口来实现,示例如下:1.class producer_2 extends uvm_component;2.uvm_blocking_get_imp #(simple_packet, producer_2)get_export;3.task get(output simple_packet p);4.simple_packet p_temp = new();5. ...6.p = p_temp;7.endtask8.endclass9.class consumer_2 extends uvm_component;10.uvm_blocking_get_port #(simple_packet) get_port;11.function new(string name, uvm_component parent);12.get_port = new("get_port", this);13.endfunction14.virtual task run();15.simple_packet p;16. ...17.get_port.get(p);18.endtask19.e ndclass在上面的put接口示例中,UVM对使用put接口的生产者和消费者设定了如下规则:∙get方法实现可能被阻塞。

因此调用方必须确保当此方法阻塞的时候也能够正确工作。

∙get方法的实现必须创建并返回一个事务对象给get的调用方。

get接口通讯的图形化示意如下:图4-3:消费者调用生产者中的get方法4.6.1.3 连接port和export上面例子中,port对export的连接是通过调用connect方法完成的。

用户需要在消费者/生产者的父组件中的connect回调函数[仿真阶段函数connect())中调用此connect方法:class parent_comp extends uvm_component;producer producer_inst;consumer consumer_inst;...virtual function void connect();producer_inst.put_port.connect(consumer_inst.put_export);endfunctionendclass连接port和export的通用准则是:子组件中port的connect方法以子组件export作为参数进行调用.4.6.1.4 port和port的连接以及export和export的连接Verilog RTL中,模块的端口(port)代表信号级别的界面。

相关文档
最新文档