UVM response_handler和get_response机制

很多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两个操作分开处理,尽量减少耦合。例子如下流程图。

 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)函数,这个函数的定义为:

 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)方法的代码如下:

 从以上代码可以看出,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为止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7467.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CleanMyMac X4.20最新mac电脑优化工具好用吗?

如果你的Mac运行速度变慢&#xff0c;很有可能是因为RAM内存被过度占用了。本文将向Mac用户&#xff0c;尤其是小白用户归纳一些常见的Mac内存清理方法。通过释放RAM内存&#xff0c;你将会看到自己Mac的运行速度有显著提升。 你的Mac运行速度是否变得慢到让人抓狂&#xff1f;…

项目下载中心-超简单版解决方案

简单的下载中心的设计流程 直接上设计流程&#xff1a; 以上就是步骤了&#xff0c;至于每个步骤怎么实现&#xff0c;那方法就很多了 &#xff0c;随意&#xff0c;达到目的就行。 至于各种问题&#xff0c;比如队列性能&#xff0c;消息重复或丢失&#xff0c;等等&#…

130亿参数,8个A100训练,UC伯克利发布对话模型Koala

平替再平替&#xff0c;可以在消费级 GPU 上运行的 Koala 模型能实现 ChatGPT 一半的性能。 自从 Meta 发布并开源了 LLaMA 系列模型&#xff0c;来自斯坦福大学、UC 伯克利等机构的研究者们纷纷在 LLaMA 的基础上进行「二创」&#xff0c;先后推出了 Alpaca、Vicuna 等多个「…

Solon v2.2.7 发布,支持 Java 20

Solon 是一个高效的 Java 应用开发框架&#xff1a;更快、更小、更简单。也是一个有自己接口标准规范的开放生态。 150来个生态插件&#xff0c;覆盖各种不同的应用开发场景&#xff1a; 相对于 Spring Boot 和 Spring Cloud 的项目&#xff1a; 启动快 5 &#xff5e; 10 倍…

【无功优化】基于改进遗传算法的电力系统无功优化研究【IEEE30节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

4.5--计算机网络之基础篇--1.模型分层--(复习+深入)---好好沉淀,加油呀

1.TCP/IP模型的分层 1.1.为什么要有 TCP/IP 网络模型&#xff1f; 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff1b; 而对于不同设备上的进程间通信&#xff0c;就需要网络通信&#xff0c;而设备是…

2021蓝桥杯真题大写 C语言/C++

题目描述 给定一个只包含大写字母和小写字母的字符串&#xff0c;请将其中所有的小写字母转换成大写字母后将字符串输出。 输入描述 输入一行包含一个字符串。 输出描述 输出转换成大写后的字符串。 输入输出样例 示例 输入 LanQiao 输出 LANQIAO 评测用例规模与约定 对于…

python 生成器、迭代器、动态新增属性及方法

目录 一、生成器 1、生成器定义 2、生成器存在的意义 3、创建生成器方式一&#xff08;生成器表达式&#xff09; 4. 创建生成器方式二&#xff08;生成器函数&#xff09; 1. 生成器函数 2. 生成器函数的工作原理 5. 总结 1. 什么是生成器 2. 生成器特点 二、迭代器…

365天深度学习训练营-第J8周:Inception v1算法实战与解析

目录 一、前言 二、论文解读 1. Inception 模块 2. 网络深度问题 3. 全局平均池化 4. 卷积层的并行结构 5. 1x1 卷积核 6.详细的网络结构 三、代码复现 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#x…

微服务+springcloud+springcloud alibaba学习笔记【Eureka服务注册中心】(3/9)

Eureka服务注册中心 3/91、服务注册与发现1.1 什么是服务治理&#xff1a;1.2 什么是服务注册与发现&#xff1a;1.3 Eureka服务注册与发现2、单机版eureka2.1 创建module2.2改pom依赖2.3写yml配置文件:2.4主启动类2.5 修改服务提供者 cloud-provider-payment8001 模块&#xf…

Github库中的Languages显示与修改

目录 前言 【.gitattributes】文件 修改GitHub语言 前言 上传一个项目到GitHub时&#xff0c;发现显示的语言并非是自己项目所示的语言&#xff0c;这样的情况是经常发生的&#xff0c;为了能到达自己所需快速检索&#xff0c;或者是外部访问者能很好的搜索我们的项目&#…

Sentinel滑动时间窗限流算法原理及源码解析(中)

文章目录 MetricBucketMetricEvent数据统计的维度WindowWrap样本窗口实例 范型T为MetricBucket windowLengthInMs 样本窗口长度 windowStart 样本窗口的起始时间戳 value 当前样本窗口的统计数据 其类型为MetricBucket MetricBucket MetricEvent数据统计的维度 1、首先计算27t位…

【花雕学AI】09:发挥ChatGPT最大潜力——产生高质量内容的九种方法和建议

人工智能&#xff08;AI&#xff09;是当今科技领域最热门和最有前景的话题之一&#xff0c;它已经渗透到了我们生活和工作的方方面面&#xff0c;给我们带来了许多便利和惊喜。而在AI的众多分支中&#xff0c;自然语言处理&#xff08;NLP&#xff09;是最贴近人类的一个领域&…

6-python异常、错误、模块、包

文章目录1.异常2.错误3.模块4.包[综合练习]1.异常 打开一个不存在的文件会引发异常 FileNotFoundError: [Errno 2] No such file or directory: ‘D:/不存在的文件.txt’ fopen(file"D:/不存在的文件.txt",mode"r", encodingutf-8) print(f.read())&…

springboot-gateway注册nacos失败,控制台没有报错

目录 前言现象描述前言 最近springboot的gateway注册到nacos上,没有注册成功 现象描述 我是在common里面引入了nacos的依赖,依赖如下: <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-confi…

文件的随机读写

fseek fseek这个函数的作用是什么&#xff1f; 我们知道&#xff0c;如果对一个文件指针进行加减操作的话&#xff0c;这个文件指针会指向下一个文件&#xff0c;那么问题来了&#xff0c;我们如果想访问这个文件中的某一个内容&#xff0c;这个时候该怎么办呢&#xff0c;我们…

基于支持向量机SVM的脑部肿瘤识别,脑电波样本熵提取

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的的脑部肿瘤识别分类预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它…

下一代的新操作系统就是ChatGPT!

什么是CHatgpt&#xff1f; ChatGPT是人工智能研究实验室OpenAI在2022年11月30日推出的聊天机器人模型&#xff0c;它使用Transformer神经网络架构&#xff0c;训练数据来自包括维基百科&#xff0c;以及真实对话在内的庞大语料库。2023年1月30日消息称&#xff0c;中国搜索巨…

数据分析-统计基础

day1&#xff1a;集中趋势&#xff0c;离散测度&#xff0c;均值&#xff0c;中位数&#xff0c;众数&#xff0c;方差等。点估计&#xff0c;区间估计等相关的知识 现代数据分析&#xff1a;把数据放到一个数据空间中&#xff0c;通过这个空间的个各种形变与分析而挖掘除数据…

Android RenderScript 浅谈

前言 RenderScript是一个Google出品的&#xff0c;在Android平台上的并行计算框架&#xff0c;官方的简介是说RenderScript运行时可在设备上提供的多个处理器&#xff08;如多核 CPU 和 GPU&#xff09;间并行调度工作。在日常Android开发中&#xff0c;RenderScript主要用于图…