UVM Subscriber:一个订阅者,多种用途
广播出去的数据不止 Scoreboard 想收在 UVM 验证环境中monitor 通过uvm_analysis_port将观察到的 transaction 广播给所有感兴趣的组件。Scoreboard 是最常见的接收者但并非唯一。覆盖率收集器需要知道哪些激励被发送了协议检查器需要监视总线行为参考模型也需要输入数据来进行预测寄存器预测器也要同步镜像值……这些组件都需要接收 monitor 的数据。如果每个组件都去实现一遍uvm_analysis_imp就需要写一堆样板代码声明 imp、实现write()、创建连接等。而uvm_subscriber正是为了简化这一过程而生的。它把uvm_analysis_imp和uvm_analysis_export封装在一起让你只需关注write()函数里做什么而不必关心端口类型和连接细节。uvm_subscriber 是什么uvm_subscriber #(type T)是 UVM 提供的一个基类它继承自uvm_component并内置了一个uvm_analysis_imp和一个uvm_analysis_export。当你从它派生时只需实现write(T t)函数即可。当有事务从连接的 analysis port 发来时UVM 会自动调用这个write()函数。继承关系与内置端口uvm_subscriber的类定义大致如下简化class uvm_subscriber #(type T uvm_sequence_item) extends uvm_component; typedef uvm_subscriber #(T) this_type; uvm_analysis_imp #(T, this_type) analysis_export; // 注意实际是 imp但命名为 export function new(string name, uvm_component parent); super.new(name, parent); analysis_export new(analysis_export, this); endfunction // 用户需要覆盖这个函数 virtual function void write(T t); // 默认空实现 endfunction endclass注意这里名为analysis_export的成员实际上是一个uvm_analysis_imp。这是 UVM 的命名习惯它对外表现为一个可以连接的端口内部会自动调用用户的write()函数。我们只需在派生类中覆盖write()然后通过analysis_export连接到 monitor 的 analysis port 即可。与直接使用 uvm_analysis_imp 的对比如果我们不使用uvm_subscriber而是自己写一个组件来接收事务通常需要使用uvm_analysis_imp_decl(_suffix)宏声明一个带后缀的 imp 类型。在类中实例化该 imp。在build_phase中new这个 imp。实现对应的write_suffix(T t)函数。在环境中连接 monitor 的 port 到该 imp。这样至少需要 5 行额外的样板代码。而uvm_subscriber已经将这些封装好你只需要继承uvm_subscriber #(T)。覆盖write(T t)。在环境中连接monitor.ap.connect(subscriber.analysis_export)。重点subscriber 让代码更简洁专注于业务逻辑非常适合小型组件尤其是覆盖率收集器、协议检查器等。一个覆盖率收集 Subscriber下面展示一个典型的覆盖率收集器它继承uvm_subscriber并在write()中采样覆盖组。class my_cov extends uvm_subscriber #(my_trx); uvm_component_utils(my_cov) my_trx m_last; // 覆盖组定义 covergroup cg; option.per_instance 1; cp_op: coverpoint m_last.op { bins read_bin {READ}; bins write_bin {WRITE}; } cp_addr: coverpoint m_last.addr { bins low_addr {[0:1023]}; bins high_addr {[1024:4095]}; } endgroup function new(string name, uvm_component parent); super.new(name, parent); cg new(); endfunction // 核心处理接收到的事务 virtual function void write(my_trx t); m_last t; cg.sample(); uvm_info(COV, $sformatf(Sampled trx: op%0d addr%0h, t.op, t.addr), UVM_DEBUG) endfunction endclass代码解析class my_cov extends uvm_subscriber #(my_trx)声明一个订阅my_trx类型事务的订阅者。uvm_component_utils(my_cov)宏用于注册到工厂。covergroup cg内部引用了成员变量m_last并在write()中采样。virtual function void write(my_trx t)是唯一必须实现的方法当有事务到达时被自动调用。使用时只需在环境connect_phase中连接monitor.ap.connect(my_cov.analysis_export);重点整个组件没有出现任何uvm_analysis_imp声明或new代码量极少清晰易懂。Subscriber 的角色与实际使用场景uvm_subscriber的角色就是事务流的被动处理单元它接收来自 analysis port 的事务执行特定任务如采样、检查、预测等但不产生输出也不影响主数据流。它非常适合以下场景覆盖率收集器Coverage Collector这是uvm_subscriber最典型的应用。验证工程师需要收集功能覆盖率了解哪些测试场景被执行过。将覆盖率收集器实现为 subscriber连接到各个 monitor 上每当有事务发生就采样覆盖组。这样覆盖率收集与激励产生、数据比对完全解耦结构清晰。协议检查器Protocol Checker协议检查器用于验证总线事务是否符合协议规范例如检查 AXI 的握手信号、数据有效窗口等。它可以作为 subscriber 接收 monitor 观察到的事务然后在write()中执行断言或协议规则检查。一旦发现违规立即报错。参考模型Reference Model在闭环验证中参考模型接收输入激励通过一个 subscriber产生期望输出并送入 scoreboard。虽然参考模型通常需要同时接收多个输入并生成输出但输入部分往往可以用 subscriber 实现避免手动实现 analysis imp。寄存器预测器Register PredictorUVM 的uvm_reg_predictor本身就是一个uvm_subscriber它连接到总线 monitor 的 analysis port接收总线事务并调用 adapter 将其转换为寄存器操作从而更新 RAL 镜像值。这正是uvm_subscriber在实际应用中的典型范例。性能计数器、日志记录器任何需要观察事务流但不需要主动请求数据的组件都可以用uvm_subscriber来实现。比如统计特定事务的数量、记录仿真日志等。总结subscriber 是 analysis port 的默认消费者它将复杂的端口细节隐藏起来让你专注于“收到数据后做什么”。使用 Subscriber 时的常见错误忘记uvm_component_utils宏如果类中没有使用uvm_component_utils(my_subscriber)注册工厂将无法创建该组件导致运行时错误。务必在每个 subscriber 派生类中加入该宏。重复声明 analysis_impuvm_subscriber已经内置了analysis_export本质是 imp。如果你在自己的类中又声明了一个uvm_analysis_imp就会产生冲突或冗余甚至导致连接错误。不要重复定义直接使用内置的analysis_export。多个 Subscriber 时执行顺序无定义Analysis port 的广播是并发执行的多个 subscriber 的write()调用顺序在仿真中是不确定的。如果你的 subscriber 之间存在顺序依赖例如一个必须先于另一个处理应该显式地管理顺序或者避免这种依赖。在write()中执行阻塞耗时操作write()被 monitor 的ap.write()调用monitor 的采样循环可能因此被阻塞。不要在write()中加入(posedge clk)、等待事件或长时间的循环。应保持write()快速返回耗时操作可放入单独的进程或延迟处理。连接时漏写或写错连接路径最常见的错误是在环境connect_phase中忘记连接monitor.ap.connect(subscriber.analysis_export)导致 subscriber 根本收不到事务。连接后最好打印一条信息或检查连接计数确保连接成功。Subscriber 是便捷之选但要注意边界uvm_subscriber是一个小而美的工具它把uvm_analysis_imp的繁琐封装起来让我们能用更少的代码实现事务接收。对于大多数只需“接收-处理”的组件它都是首选。但也要清楚它的局限性一个 subscriber 只能有一个write()入口。如果你需要同时接收两种不同类型的事务例如 expected 和 actual就不能直接使用uvm_subscriber而应该使用带有uvm_analysis_imp_decl宏的自定义组件或者使用多个 subscriber 实例。它不提供背压或阻塞机制所以不适合需要 flow control 的场景。它不负责管理 objection因此它不能决定仿真何时结束。如果你需要在完成一定数量的事务后结束仿真应该在更高层如 test 或 sequence处理。最后记住subscriber 是 analysis port 的忠实听众它让覆盖率收集、协议检查、参考模型等任务变得简单。用好它你的验证环境会更清晰、更可维护。

相关新闻

基于SpringBoot小说在线阅读平台(源码+文档+讲解视频)

基于SpringBoot小说在线阅读平台(源码+文档+讲解视频)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/18 10:25:16 阅读更多 →
嵌入式开发实战:7大技巧提升代码质量与可靠性

嵌入式开发实战:7大技巧提升代码质量与可靠性

1. 项目概述:为什么嵌入式代码质量是生死线干了十几年嵌入式开发,从8位单片机玩到现在的多核Cortex-A系列,我最大的感触就是:嵌入式软件的代码质量,直接决定了产品的生死。这绝不是危言耸听。你写的代码,最…

2026/8/18 10:25:16 阅读更多 →
你用 Claude 写的字,正在自带隐形章

你用 Claude 写的字,正在自带隐形章

Anthropic 官宣:Claude 生成的文字将内嵌隐形水印——读者看不出,轻微修改也洗不干净,持有密钥就能算出它出自 Claude 的概率。这不是 Claude 一家的动作,是欧盟死命令下,把整套原理摊得最开的一份公开答卷。设想一个场…

2026/8/18 10:25:16 阅读更多 →

最新新闻

不买Steam版游戏,照样能下创意工坊模组?聊聊WorkshopDL这个免费小工具

不买Steam版游戏,照样能下创意工坊模组?聊聊WorkshopDL这个免费小工具

不买Steam版游戏,照样能下创意工坊模组?聊聊WorkshopDL这个免费小工具 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 先说个身边的故事。我有个朋友在G…

2026/8/18 12:14:35 阅读更多 →
Packmol从零到实战:分子动力学模拟初始结构构建完整配置手册

Packmol从零到实战:分子动力学模拟初始结构构建完整配置手册

Packmol从零到实战:分子动力学模拟初始结构构建完整配置手册 【免费下载链接】packmol Packmol - Initial configurations for molecular dynamics simulations 项目地址: https://gitcode.com/gh_mirrors/pa/packmol 你是否遇到过这样的困境:分子…

2026/8/18 12:14:35 阅读更多 →
Java地址解析库 address-parse 实测:把乱成一团的发货信息拆成姓名、手机、省市区,5个问答说清楚

Java地址解析库 address-parse 实测:把乱成一团的发货信息拆成姓名、手机、省市区,5个问答说清楚

Java地址解析库 address-parse 实测:把乱成一团的发货信息拆成姓名、手机、省市区,5个问答说清楚 【免费下载链接】address-parse Java 版智能解析收货地址 项目地址: https://gitcode.com/gh_mirrors/addr/address-parse 做二手闲置平台的你&…

2026/8/18 12:14:35 阅读更多 →
NCM 转 MP3 免费工具 ncmdump 上手:3 分钟拖出你的第一首歌

NCM 转 MP3 免费工具 ncmdump 上手:3 分钟拖出你的第一首歌

NCM 转 MP3 免费工具 ncmdump 上手:3 分钟拖出你的第一首歌 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 手机里明明能听的歌,一拷进车载音响就变成"打不开的文件"?别慌,歌…

2026/8/18 12:14:35 阅读更多 →
如何快速截取整个网页?免费开源的 Full Page Screen Capture 帮你一键成片

如何快速截取整个网页?免费开源的 Full Page Screen Capture 帮你一键成片

如何快速截取整个网页?免费开源的 Full Page Screen Capture 帮你一键成片 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-c…

2026/8/18 12:14:35 阅读更多 →
3 步完成 Switch 手柄 PC 适配:BetterJoy 快速上手与避坑指南

3 步完成 Switch 手柄 PC 适配:BetterJoy 快速上手与避坑指南

3 步完成 Switch 手柄 PC 适配:BetterJoy 快速上手与避坑指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitco…

2026/8/18 12:13:34 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →