当前位置: 首页 > news >正文

拓扑结构图解析

一、顶层结构(uvm_test_top)

  • 类型dadd_rand_test
  • 角色:UVM 验证的顶层测试用例,是整个验证环境的 “启动入口”,负责实例化验证环境(dadd_environment)、序列(dadd_rand_sequence ,代码中已声明但图中未完整展开),并通过 main_phase 控制验证流程(如启动序列、管理仿真 objection )。

二、验证环境层(env)

  • 类型uvm_env(实际是 dadd_environment ,继承自 uvm_env )
  • 角色验证子系统的容器,聚合并连接与 DUT 验证相关的核心组件(iagtoagtrefmdlscb 及 TLM FIFO ),使这些组件形成一个可复用的 “验证子系统”。

三、TLM FIFO 层(env 内的 3 个 FIFO)

UVM 中 uvm_tlm_analysis_fifo #(T) 是 “线程安全的异步通信缓冲区”,用于解耦 “数据生产者” 和 “数据消费者”,避免因速度不匹配导致数据丢失。以下是 3 个 FIFO 的作用:

1. dadd_iagt_to_refmdl_fifo
  • 关联类型:传递 dadd_item 类型的事务
  • 角色:连接 iagt(输入代理)与 refmdl(参考模型)
    • 生产者iagt.imonitor(通过 iagt.ap 端口写入数据 )
    • 消费者refmdl(通过 refmdl.port 端口读取数据 )
    • 作用:将 iagt 采样的 DUT 输入数据,安全传递给 refmdl,让参考模型基于这些输入计算 “预期输出”。
2. dadd_oagt_to_scb_fifo
  • 关联类型:传递 dadd_item 类型的事务
  • 角色:连接 oagt(输出代理)与 scb(计分板)
    • 生产者oagt.omonitor(通过 oagt.ap 端口写入数据 )
    • 消费者scb(通过 scb.act_port 端口读取数据 )
    • 作用:将 oagt 采样的 DUT 实际输出数据,传递给 scb,用于和 “预期输出” 比对。
3. dadd_refmdl_to_scb_fifo
  • 关联类型:传递 dadd_item 类型的事务
  • 角色:连接 refmdl(参考模型)与 scb(计分板)
    • 生产者refmdl(通过 refmdl.ap 端口写入数据 )
    • 消费者scb(通过 scb.exp_port 端口读取数据 )
    • 作用:将 refmdl 计算出的 预期输出数据,传递给 scb,用于和 “实际输出” 比对,判断验证是否通过。

四、输入代理层(iagt)

  • 类型uvm_agent(实际是 dadd_iagent ,继承自 uvm_agent )
  • 角色管理 DUT 输入接口的 “激励注入” 和 “输入采样”,包含以下子组件:
1. drvdadd_driver ,类型 uvm_driver #(REQ, RSP) )
  • 角色“激励执行者”,从 iagt.sqr(序列器)获取 dadd_item 事务,将其转换为 物理信号时序(如 clkaddrdata 等引脚信号 ),驱动 DUT 执行操作。
  • 关键端口
    • rsp_portuvm_analysis_port ):可用于回传响应(若需双向通信,如读操作应答 ,代码中未完整体现时可能仅单向驱动 )。
    • seq_item_portuvm_seq_item_pull_port ):与 iagt.sqr.seq_item_export 连接,从序列器拉取 dadd_item 事务。
2. imondadd_imonitor ,类型 uvm_monitor )
  • 角色“输入数据观察者”,直接从 DUT 输入接口采样真实信号(如 addrdatadata_en ),封装成 dadd_item 事务,通过 ap 端口发给 TLM FIFO(dadd_iagt_to_refmdl_fifo ),供 refmdl 做 “预期输出计算”。
  • 关键端口
    • apuvm_analysis_port ):向 dadd_iagt_to_refmdl_fifo.analysis_export 写入采样的 dadd_item 。
3. sqrdadd_rand_sequencer ,类型 uvm_sequencer #(dadd_item) )
  • 角色“激励调度器”,仲裁来自 sequence(如 dadd_rand_sequence )的 dadd_item 事务,按规则(如优先级、顺序 )转发给 driver 执行。
  • 关键端口
    • rsp_exportuvm_analysis_export ):若需接收 driver 的响应,可通过此端口连接(代码未完整体现时可能闲置 )。
    • seq_item_exportuvm_seq_item_pull_imp ):与 driver.seq_item_port 连接,向 driver 转发 sequence 生成的事务。
    • arbitration_queuearray ):存储待调度的 sequence_item 队列,由 sequencer 仲裁后转发。

五、输出代理层(oagt)

  • 类型uvm_agent(实际是 dadd_oagent ,继承自 uvm_agent )
  • 角色管理 DUT 输出接口的 “输出采样”,核心组件是 omondadd_omonitor )。
1. omondadd_omonitor ,类型 uvm_monitor )
  • 角色“输出数据观察者”,直接从 DUT 输出接口采样真实信号(如 dadd_outdadd_out_endadd_out_addr ),封装成 dadd_item 事务,通过 ap 端口发给 TLM FIFO(dadd_oagt_to_scb_fifo ),供 scb(计分板)做 “实际输出比对”。
  • 关键端口
    • apuvm_analysis_port ):向 dadd_oagt_to_scb_fifo.analysis_export 写入采样的 dadd_item 。

六、参考模型层(refmdl)

  • 类型uvm_component(实际是 dadd_refmodel ,继承自 uvm_component )
  • 角色“理想行为模拟器”,根据 iagt 采样的 “DUT 输入数据”(从 dadd_iagt_to_refmdl_fifo 读取 ),按照 设计文档预期的 DUT 逻辑(如数据加 1、协议转换等 ),计算出 “预期输出数据”,再通过 ap 端口发给 TLM FIFO(dadd_refmdl_to_scb_fifo ),供 scb 比对。
  • 关键端口
    • apuvm_analysis_port ):向 dadd_refmdl_to_scb_fifo.analysis_export 写入 “预期输出” 的 dadd_item 。
    • portuvm_blocking_get_port ):从 dadd_iagt_to_refmdl_fifo.blocking_get_export 读取 “DUT 输入数据”,是 阻塞式读取(若无数据则等待,确保拿到数据后再计算 )。

七、计分板层(scb)

  • 类型uvm_component(实际是 dadd_scoreboard ,继承自 uvm_component )
  • 角色“验证裁决者”,从两个 TLM FIFO 分别获取:
    • dadd_oagt_to_scb_fifo 传递的 DUT 实际输出(来自 oagt.omonitor )。
    • dadd_refmdl_to_scb_fifo 传递的 参考模型预期输出(来自 refmdl )。
      比对两者的 addrdata 等字段,判断 DUT 行为是否符合预期,输出 PASS/FAIL 结果(代码中逻辑需结合 main_phase 实现,此处从结构看是核心比对点 )。
  • 关键端口
    • act_portuvm_blocking_get_port ):从 dadd_oagt_to_scb_fifo.blocking_get_export 读取 DUT 实际输出 的 dadd_item ,阻塞式读取。
    • exp_portuvm_blocking_get_port ):从 dadd_refmdl_to_scb_fifo.blocking_get_export 读取 参考模型预期输出 的 dadd_item ,阻塞式读取。

八、总结 - 数据流动与验证闭环

通过上述组件,完整的 “激励→采样→模拟→比对” 验证闭环如下:

  1. 激励注入dadd_rand_sequence(序列)→ iagt.sqr(序列器)→ iagt.drv(驱动)→ DUT 输入接口。
  2. 输入采样iagt.imon(输入监视器)→ 采样 DUT 输入 → 写入 dadd_iagt_to_refmdl_fifo → refmdl(参考模型)读取并计算 “预期输出”。
  3. 输出采样oagt.omon(输出监视器)→ 采样 DUT 输出 → 写入 dadd_oagt_to_scb_fifo → scb(计分板)读取 “实际输出”。
  4. 预期输出传递refmdl(参考模型)→ 计算 “预期输出” → 写入 dadd_refmdl_to_scb_fifo → scb(计分板)读取 “预期输出”。
  5. 比对裁决scb(计分板)→ 比对 “实际输出” 与 “预期输出” → 输出验证结果(PASS/FAIL )。

每一层组件各司其职,通过 TLM 端口和 FIFO 解耦,既保证了数据流动的顺畅,又让各组件可独立复用、维护,是 UVM 模块化验证的典型体现。

http://www.lryc.cn/news/619547.html

相关文章:

  • iscc2025区域赛wp
  • GitHub宕机时的协作方案
  • 软考备考——三、操作系统
  • 【计组】指令与CPU
  • 建设有人文温度的智能社会:规划与实施路径
  • Apple 的 GPU 加速框架
  • setsockopt函数详解
  • 利用 Makefile 高效启动 VIVADO 软件:深入解析与实践
  • 哈希算法(摘要算法)
  • 超实用!ToDesk/网易UU/向日葵:远程办公文件协作效率与安全实测
  • C++冒泡、选择、快速、桶排序超超超详细解析
  • PCBA:电子产品制造的核心环节
  • 深度学习赋能汽车制造缺陷检测
  • MFC/C++ 如何弹窗选择具体文件或某种类型文件路径,又是如何选择路径
  • 记录RK3588的docker中启动rviz2报错
  • 【论文笔记】DOC: Improving Long Story Coherence With Detailed Outline Control
  • 【114页PPT】基于SAPSRM数字化采购解决方案(附下载方式)
  • XCZU6CG-2FFVC900I Xilinx FPGA AMD ZynqUltraScale+ MPSoC
  • 002.从0开始,实现第一个deepseek问答
  • h5bench(3)
  • 疯狂星期四文案网第38天运营日记
  • 【递归、搜索与回溯算法】综合练习
  • 双椒派E2000D系统盘制作全攻略
  • 2025 电赛 C 题完整通关攻略:从单目标定到 2 cm 测距精度的全流程实战
  • RS485转profinet网关接M8-11 系列 RFID 读卡模块实现读取卡号输出
  • [Oracle数据库] Oracle的表维护
  • npm安装时一直卡住的解决方法
  • Redis宝典
  • PromptPilot — AI 自动化任务的下一个环节
  • 51c自动驾驶~合集14