[UVM源代码研究] 当我们driver中使用put_response却最终导致Reponse queue overflow的UVM源代码解决思路(uvm-1.2版)
引言
开始本文讨论之前我们先来以一个具体的例子来引出我们今天将要讨论的问题。
put_response/get_response的常规用法实例
图1是apb_master_driver中的一段代码,106-109行是关于driver中将transaction信息通过response的方式返回给发起这次req的sequence中。
图1 apb_master_driver中put_response代码示例

而我们通过在sequence中调用get_response的方式就能获取到该返回的rsp,如图2所示。
图2 sequence中调用get_response示例

如此一来通过put_response() —— get_response()的组合就可以实现将driver中接口上返回的signal信息以transaction的形式返回给发起此次transaction行为的sequence中,实现一次完整总线操作的闭环行为。
出错情况
但是我们在使用UVM寄存器模型内建的sequence跑寄存器模型仿真时却报出来如图3所示的UVM_ERROR,我们直接从log的字面意思简单分析一下不难发现这里报的是response queue出现了overflow的情况,原因在于我们在用寄存器模型的内建sequence跑仿真时FRONTDOOR的操作最终还是会通过driver来drive到interface上并最终通过put_response返回结果,而我们寄存器模型内建的sequence并不会显式的调用get_response(后面经过分析我们会知道内建sequence默认直接将driver中的req作为返回结果使用了),那必然response会越积越多最终造成了overflow的情况,虽然我们现在还不清楚这个response信息在UVM源代码中是以怎么一种形式存在的,后面我们会抽丝剥茧一点点寻求解决此问题的方法。
图3 UVM内建sequence报出的UVM_ERROR信息

在寻求这个问题的答案之前,我们首先想到的是为什么以前我们写driver调用寄存器模型内建sequence的时候为什么没有报类似的UVM_ERROR,回顾一下发现原来是我们并没有使用put_response,而是直接将返回的结果通过req直接带出给sequence了,毕竟sequence中发起的req跟driver中get到的req本质是同一个handler。既然都不存在put_response的调用了,那自然也就不会出现response overflow的情况,那么这个put_response存在的意义为何呢?
put_response意义
寄存器操作通常

本文探讨了在UVM环境中,使用put_response和get_response时遇到Responsequeueoverflow的问题,通过源代码分析给出了两种解决方案:一是调整响应队列深度或关闭错误报告,二是通过adapter适配器正确设置返回响应。
最低0.47元/天 解锁文章





