0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UVM response_handler和get_response机制

冬至子 来源:CSDN 作者:谷公子 2023-05-23 16:56 次阅读

很多UVM用户平时更多的使用get_response()方式去获得uvm_driver的response,但get_response有些缺点:由于 get_response() 是一种阻塞方法,它会阻塞直到收到来自 UVM 驱动程序 (put_response()) 的响应。

因此,如果我们使用 get_response() 方法实现并按此顺序将 start_item()、finish_item() 和 finally get_response() 放置在序列的 body() 方法中,这将导致非流水线序列实现,因为下一个序列项可以只有在 get_response() 方法收到前一个请求序列项的响应项后,才提供给 UVM 驱动程序。

为了实现背靠背的传输,我们可以使用response_handler()机制,它可以将sequence中发送request和处理response两个操作分开处理,尽量减少耦合。例子如下流程图。

image.png

1. 如何使用response_handler

如果想要实现response_handler机制的话,第一步需要在要使用这个机制的sequence里使能它,即调用use_response_handler(1)函数把m_use_response_handler变量设置为1就行,m_use_response_handler是uvm_sequence_base类里的一个成员变量,默认值为0,也就是不打开。第二步需要override uvm_sequence_base类里的response_handler函数,实现自己对response任意处理的需求。它的原型为:

// Function: response_handler
  // When the use_reponse_handler bit is set to 1, this virtual method is called
  // by the sequencer for each response that arrives for this sequence.
  virtual function void response_handler(uvm_sequence_item response);
    return;
  endfunction

response_handler对uvm_driver没有任何影响,也就是不可见,uvm_driver仍然用之前的put_response机制就行。

2. response_handler背后机制

sequence里的response_handler(xxx)函数在uvm_driver调用seq_item_export.put_response(rsp)的时会自动被调用执行,故此我们从seq_item_export.put_response(rsp)讲起。

uvm_driver调用put_response(rsp)时,会调用uvm_sequencer_param_base里的put_response(rsp)函数,这个函数的定义为:

image.png

313行到326行就是对传参进来的rsp做一些检查。328行会根据rsp里携带的sequence_id去调用m_find_sequence函数在reg_sequences关联数组里找对应sequence的句柄,如果找到了就返回sequence句柄,没有找到的话,就直接返回null,并报告没有找到原始sequence的信息。通常我们返回的是非null的,因此会进入330行到337行。

如何避免返回null,在我的另一篇博客中说了,有兴趣读者可以瞄一眼(UVM中使用put_response的一个注意点)。在332行,会判断m_use_response_handler变量的值,如果为1就执行333行sequence里的response_handler函数,如果为0就执行337行response_handler的put_response。可想而知,这是1个关键分叉点。我们分别介绍这两个方法。

2.1 sequence_ptr.response_handler(t)

sequence里的response_handler()函数我们在第一小节里也提到了,原型是个空函数,需要用到这个机制的用户自己去override它来实现需要的功能。

2.2 sequence_ptr.put_response(t)

在uvm_sequence_base类的put_response函数又会继续调用put_base_response函数,它们俩的代码为:

virtual function void put_response (uvm_sequence_item response_item);
    put_base_response(response_item); // no error-checking
  endfunction
virtual function void put_base_response(input uvm_sequence_item response);
    if ((response_queue_depth == -1) ||
        (response_queue.size() < response_queue_depth)) begin
      response_queue.push_back(response);
      return;
    end
    if (response_queue_error_report_disabled == 0) begin
      uvm_report_error(get_full_name(), "Response queue overflow, response was dropped", UVM_NONE);
    end
  endfunction

可以看出,在put_base_response函数里会将uvm_driver送过的rsp放到response_queue队列了,response_queue队列定义为:protected uvm_sequence_item response_queue[$]。另外说下response_queue_depth这个int类型变量,它的默认值为8,也就是response_queue队列默认只能放8个rsp,如果超过的话,会被直接忽视掉(用户可以打开response_queue_error_report_disabled来报错)。

但如果用户想要让response_queue队列可以放更多的rsp呢?需要调用uvm_sequence_base里的set_response_queue_depth(xx)来设置新值,xx就是传进去的int类型数值。也可以调用get_response_queue_depth()来返回当前设置的值。

response_queue队列里的值会给get_reponse(xxx)使用。

3. get_response背后机制

在sequence中调用get_response(xxx)的时候,对调用uvm_sequence_base类里的get_base_response(xxx)方法。

virtual task get_response(output RSP response, input int transaction_id = -1);
    uvm_sequence_item rsp;
    get_base_response( rsp, transaction_id);
    $cast(response,rsp);
  endtask

get_base_response(xxx)方法的代码如下:

image.png

从以上代码可以看出,get_reponse(xxx)就是从response_queue队列里拿数据,response_queue里的数据是put_response在没有使能response_handler机制情况下放进去的。因此用户要注意一旦采用response_handler机制后,在当前sequence里一定不能用get_response,反则它会get不到response,一直block在get_base_response方法的991行。

如果transaction_id为-1,也就是用户没有指定要得到特定transaction_id的response时,get_base_response会默认返回response_queue里的第一个response,类似于FIFO。如果transaction_id不为-1,那么get_base_response会在response_queue里检索,直到找到1个匹配对应transaction_id的response为止。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18964
  • FIFO存储
    +关注

    关注

    0

    文章

    102

    浏览量

    5894
收藏 人收藏

    评论

    相关推荐

    详解Android Handler机制和原理

    在Android开发中,Handler机制是一个很重要的知识点,主要用于消息通信。
    的头像 发表于 03-26 14:32 2063次阅读

    TC387的lin主节点在没有从节点连接时主response无法发出如何解决?

    前提TC387的lin为主节点,没有从节点连接,当仅有主response时,主response可以可以发出。当同时有主response和从response时,主
    发表于 02-01 08:04

    esp8266透明传输下发送数据模块response是什么意思?

    现在ESP8266通过路由器访问到了云服务器,在透明传输模式下,我发送了一些数据,然后下图是给出的response。我设置了ESP8266为TCP客户端,传输模式为TCP,这是说明传输的协议为TCP
    发表于 04-02 06:35

    怎么将完整的GCX Cal降级为Enhanced Response Cal

    Response - > Cal - > Mange Cals - > Correction Methods ...导航到“Select Calibration Type”页面,然后取消
    发表于 04-19 14:42

    IC验证“UVM验证平台加入objection机制和virtual interface机制“(七)

    在上一节中,**《IC验证"UVM验证平台加入factory机制"(六)》**虽然输出了“main_phase is called”,但是“data is drived”并没有
    发表于 12-09 18:28

    什么是UVM Report机制

    UVM Report机制概述
    发表于 12-21 06:55

    介绍两种交互方法来完成Sequencer和Driver的握手机制

    get_response()去等待响应item,driver中也不需要set_id_info()和put()返回响应item。坏处是,如果裁掉响应部分的握手,sequence也就不知道driver什么时候完成
    发表于 09-23 14:39

    AT报错Read response buffer failed的解决办法分享

    “read response buffer failed. the response buffer size is out of buffer size(64)!”的错误且无法正常运行后续功能,将
    发表于 11-24 14:31

    谈谈UVM中的uvm_info打印

    =UVM_INFO, string id=“”);  if (get_report_verbosity_level(severity, id) 《 verbosity ||  get
    发表于 03-17 16:41

    TPS76801,pdf(fast transient response and be stable)

    This device is designed to have a fast transient response and be stable with 10 µF capacitors.
    发表于 10-18 23:43 25次下载

    Get Fast Stable Response From Im

    Get Fast Stable Response From Improved Unity-Gain Followers
    发表于 03-24 15:46 0次下载

    ADuCM330WFS/ADuCM331WFS Digital Filter Frequency Response Calculator

    ADuCM330WFS/ADuCM331WFS Digital Filter Frequency Response Calculator
    发表于 01-28 11:25 5次下载
    ADuCM330WFS/ADuCM331WFS Digital Filter Frequency <b class='flag-5'>Response</b> Calculator

    LT3070-1 Demo Circuit - Low Voltage, UltraFast™ Transient Response Linear Regulator (1.2V to .9V @ 5A)

    LT3070-1 Demo Circuit - Low Voltage, UltraFast™ Transient Response Linear Regulator (1.2V to .9V @ 5A)
    发表于 02-01 16:00 5次下载
    LT3070-1 Demo Circuit - Low Voltage, UltraFast™ Transient <b class='flag-5'>Response</b> Linear Regulator (1.2V to .9V @ 5A)

    UVM sequence机制response的简单使用

    sequence作为UVM几个核心机制之一,它有效地将transaction的产生从driver中剥离出来,并且通过和sequencer相互配合,成功地将driver的负担降低至仅聚焦于根据协议
    的头像 发表于 09-22 09:26 1954次阅读

    UVM driver和sequencer的通信

    sequencer生成激励数据,并将其传递给driver执行。UVM类库提供了uvm_sequencer基类,其参数为request和response数据类型。
    的头像 发表于 06-07 11:58 1026次阅读
    <b class='flag-5'>UVM</b> driver和sequencer的通信