UVM_CALLBACK 应用举例

UVM_CALLBACK是一种基于回调函数的设计模式,允许用户在特定事件发生时插入自定义的行为。UVM提供了uvm_callback类作为基类,用户可以通过继承该类来定义自己的回调行为。采用uvm_callback基类,用户可以在不更改原始代码的情况下轻松插入调试代码或者功能代码。

实际使用时,大概有以下几种场景会用到callback:

(1)异常测试激励,需要在正常激励的基础上,随机插入一些额外的错误激励或者延迟;

(2)监控driver发送的事务是否符合预期;

(3)捕获monitor接收的数据并分析是否合理;

举例:

以第一种使用场景为例,现有如下具体场景:APB寄存器配置接口的验证,环境中已有组件apb_driver可以发送常规激励,但无法发送psel为低,paddr超范围等异常激励。

需求:不改动driver基本逻辑,不额外增加seq,不force接口,需要在每一笔apb激励驱动前,随机插入一些异常激励。

解决方案:采用callback成为了最佳解决方案。

具体实现步骤如下:

(1)定义callback类,完成pre_transmit task;

class my_apb_driver_callback extends uvm_callback;
     `uvm_object_utils(my_apb_driver_callback)

    // 回调任务
    virtual task pre_transmit(apb_driver drv, apb_pkt pkt);
        bit add_en;
        int add_cycl;
        `uvm_info("MY_APB_DRV_CALLBACK", "Pre-transmit callback executed", UVM_LOW)
        
        if(`PLUS_ARG.plus_psel_low_mode == 1)begin
            add_en   = $urandom_range(0,1);
            add_cycl = $urandom_range(1,6);
            if(rand_en == 1)begin //随机插入
                repeat(add_cycl)begin //插入数量随机
                    drv.delay_n_apb_cyc(1);
                    drv.vif.psel <= 0;
                    drv.vif.penable <= $urandom_rang(0,1);
                    drv.vif.pwrite <= $urandom_rang(0,1);
                    drv.vif.pwdata <= $urandom_rang(0,'hffff_ffff);
                    drv.vif.paddr  <= $urandom_rang(0,'hffff_ffff);
                end
            end
        end
    endtask

    virtual task post_transmit(apb_driver drv, apb_pkt pkt);
        `uvm_info("MY_APB_DRV_CALLBACK", "Post-transmit callback executed", UVM_LOW)
    endtask

    function new(string name = "my_apb_driver_callback");
        super.new(name); 
    endfunction
endclass

(2)在dirver组件中注册回调,调用回调;

class my_apb_driver extends uvm_driver #(apb_pkt pkt);
    `uvm_component_utils(my_apb_driver)

    // 注册回调
    `uvm_register_cb(my_apb_driver, my_apb_driver_callback)

    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction

    task run_phase(uvm_phase phase);
        forever begin
            seq_item_port.get_next_item(req);

            // 调用回调方法
            `uvm_do_callbacks(my_apb_driver, my_apb_driver_callback, pre_transmit(this,req))

            // 执行主要功能
            drive_transaction(req);

            // 调用回调方法
            `uvm_do_callbacks(my_apb_driver, my_apb_driver_callback, post_transmit(this,req))

            seq_item_port.item_done();
        end
    endtask

    virtual task drive_transaction(my_transaction tr);
        // 驱动事务的逻辑
    endtask
endclass

(3)在agent组件中inst回调,并将回调和对应driver连接;

class my_apb_agent extends uvm_agent;
    `uvm_component_utils(my_apb_agent)

    my_apb_driver drv;
    my_apb_driver_callback cb;

    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction

    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        drv = my_apb_driver::type_id::create("drv", this);

        // 创建回调实例
        cb = my_apb_driver_callback::type_id::create("cb");
    endfunction

    function void connect_phase(uvm_phase phase);
        super.connect_phase(phase);

        // 将回调实例添加到driver中
        uvm_callbacks#(my_apb_driver, my_apb_driver_callback)::add(drv, cb);
    endfunction
endclass

仿真效果:

按照如上方式调用callback,将会在正常的apb激励发送前,随机插入数量不等的psel为低的apb激励:

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

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

相关文章

优选算法大集合(待更新)

1.双指针 1.1.移动零 leetcode链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09;​​​​​​ 移动零的问题我们可以将它归类为数组划分的问题&#xff0c;我们将数组划分为非零部分和零部分。我们会使用到双指针的算法&#xff0c;在这里&#xff0c;我…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本&#xff0c;而结构化数据的方法通常是让 LLM 编写和执行 DSL&#xff08;例如 SQL&#xff09;中的查询。 我们将演练在使用基于 langchain 链 &#x…

在 Mac mini M2 上 MaxKb配置ollama,API域名无效的解决方案

环境说明 docker方案安装与使用的maxkb 本地ollama安装deekseek r1 解决方案 参考https://bbs.fit2cloud.com/t/topic/4165 mac m1用户&#xff0c;根据github的以下回复&#xff0c;成功绑定域名api 如果你想调用本地的ollama 中的大模型&#xff0c;域名试试&#xff1a;…

【STL专题】优先级队列priority_queue的使用和模拟实现,巧妙利用仿函数解决优先级

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;优先级队列priority_queue的使用和模拟实现&#xff0c;巧妙利用仿函数解决优先级 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a; C | C语言 | 数据结构与算法 | Linux…

【NLP 23、预训练语言模型】

人类发明后悔&#xff0c;来证明拥有的珍贵 —— 25.1.15 Bert的优势&#xff1a;① 预训练思想 ② Transformer模型结构 一、传统方法 VS 预训练方式 Pre-train&#xff1a; ① 收集海量无标注文本数据 ② 进行模型预训练&#xff0c;并在任务模型中使用 Fine-tune&#xff1a…

阳光高考瑞数6vmp算法还原

URL aHR0cHM6Ly9nYW9rYW8uY2hzaS5jb20uY24v这个站平时没有防护的&#xff0c;只有在平时填报高峰期&#xff0c;才会出来防护&#xff0c;也是为了防护自动脚本吧瑞数就是典型的cookie反爬 O开头cookie 6开头6代vmp&#xff0c;P值是加密的cookie&#xff0c;只有带上0开头的…

危化品经营单位安全管理人员的职责及注意事项

危化品经营单位安全管理人员肩负着保障经营活动安全的重要责任&#xff0c;以下是其主要职责及注意事项&#xff1a; 职责 1. 安全制度建设与执行&#xff1a;负责组织制定本单位安全生产规章制度、操作规程和生产安全事故应急救援预案&#xff0c;确保这些制度符合国家相关法…

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息&#xff1a;微软宣布推出一款免费的Office版本&#xff0c;允许用户进行基础文档编辑操作&#xff0c;但限制颇多&#xff0c;其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论&#xff0c;业界人士对其背后的商业策略和用户体验…

VMware虚拟机安装win10系统详细图文安装教程(附安装包) 2025最新版详细图文安装教程

文章目录 前言一、软件下载二、安装步骤1.创建新的虚拟机2.安装 Windows 10 系统: 前言 在计算机使用中&#xff0c;有时需借助虚拟机来拓展功能。VMware 虚拟机是强大的工具&#xff0c;能让我们在同一台电脑上运行多个系统。Windows 10 系统功能丰富、应用广泛。本教程将详细…

开源基准测试模拟器:BlueROV2 水下机器人的控制

拜读An Open-Source Benchmark Simulator: Control of a BlueROV2 Underwater Robot 非常感谢Esben Uth的帮助。 本文介绍了在 Simulink™ 中实现的常用且低成本的遥控潜水器 &#xff08;ROV&#xff09; BlueROV2 的仿真模型环境&#xff0c;该环境已针对水下航行器的基准控…

联想 SR590 服务器 530-8i 更换损坏的硬盘

坏了的硬盘会自动亮黄灯。用一个空的新盘来替换&#xff0c;新盘最好不要有东西。但是有东西可能也没啥&#xff0c;因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机&#xff0c;电源键进入绿色闪烁状态 2. 断电&#xff0c;推开塑料滑块拉出支架&#xff0c;…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

Bybit事件技术分析

事件概述 2025年2月21日UTC时间下午02:16:11&#xff0c;Bybit的以太坊冷钱包&#xff08;0x1db92e2eebc8e0c075a02bea49a2935bcd2dfcf4&#xff09;因恶意合约升级遭到资金盗取。根据Bybit CEO Ben Zhou的声明&#xff0c;攻击者通过钓鱼攻击诱骗冷钱包签名者错误签署恶意交易…

002简单MaterialApp主题和Scaffold脚手架

002最简单的MaterialApp主题和Scaffold脚手架使用导航栏_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1RZ421p7BL?spm_id_from333.788.videopod.episodes&vd_source68aea1c1d33b45ca3285a52d4ef7365f&p1501.MaterialApp纯净的 /*MaterialApp 是主题,自带方向设…

本地部署AI模型 --- DeepSeek(二)---更新中

目录 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 问题描述&#xff1a; &#x1f972; Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…

FastAPI系列:Ubuntu部署FastAPI项目实战

这篇文章提供了在Ubuntu上部署FastAPI应用程序的详细指南。首先&#xff0c;读者将学习如何创建项目目录并设置Python虚拟环境&#xff0c;接着安装FastAPI、Uvicorn和Gunicorn等必要依赖。随后&#xff0c;文章指导用户编写基本的FastAPI应用程序代码&#xff0c;并使用Gunico…

【ECMAScript6】

【ECMAScript6】 01. ES6介绍02. let和const命令03. 模板字符串04. 函数之默认值、剩余参数05. 函数之扩展运算符、箭头函数06. 箭头函数this指向和注意事项07. 解构赋值08. 扩展的对象的功能&#xff08;简写&#xff09;09. Symbol类型10. Set集合数据类型11. Map数据类型12.…

基于 sklearn 的均值偏移聚类算法的应用

基于 sklearn 的均值偏移聚类算法的应用 在机器学习和数据挖掘中&#xff0c;聚类算法是一类非常重要的无监督学习方法。它的目的是将数据集中的数据点划分为若干个类&#xff0c;使得同一类的样本点彼此相似&#xff0c;而不同类的样本点相互之间差异较大。均值偏移聚类&…

浅谈HTTP及HTTPS协议

1.什么是HTTP&#xff1f; HTTP全称是超文本传输协议&#xff0c;是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断 目录 故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断分类效果基本介绍模型描述DBO-BP-Bagging蜣螂算法优化多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目的与方法 二…