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

验证平台中所有的组件应该派生自UVM中的类

验证平台中所有的组件应该派生自UVM中的类

这句话的核心含义是:​​在基于UVM(Universal Verification Methodology,通用验证方法学)构建的验证平台中,所有的功能模块(如Agent、Driver、Monitor、Sequencer、Sequence、Scoreboard、Test等)都应该继承自UVM库中预定义的基类(base class)​​,而不是直接用SystemVerilog的原生类(如class my_driver)或模块(module)实现。

​​1. 为什么需要派生自UVM类?​​

UVM提供了一套 ​​标准化、模块化、可重用、可配置​​ 的验证组件基类,这些基类封装了验证平台开发中常见的功能(如通信机制、任务调度、层次管理、配置数据库等)。通过派生自UVM类,可以:

•​​复用UVM的标准功能​​(如Sequence的自动事务生成、Driver的run_phase任务调度)。

•​​遵循统一的接口规范​​(例如所有Component都支持uvm_config_db配置,所有Sequence都能与Sequencer交互)。

•​​简化组件间的通信​​(通过Port/Export/Imp机制或Sequencer-Sequence模型)。

•​​支持层次化管理和调试​​(UVM提供丰富的日志宏uvm_info/uvm_error,便于追踪问题)。

•​​实现自动化和可扩展性​​(例如通过Factory机制动态替换组件)。

如果直接用SystemVerilog原生类或模块实现验证组件,虽然功能上可能可行,但会失去UVM的核心优势(标准化、可维护性差、难以复用)。

​​2. UVM中的核心基类(验证平台组件的“父类”)​​

UVM为不同类型的验证组件提供了专门的基类,常见的包括:

​​UVM基类​​​​用途​​​​典型派生类示例​​
uvm_component所有验证平台组件的​​根基类​​(提供层次结构、配置数据库、日志等基础功能)uvm_agent, uvm_test, uvm_scoreboard
uvm_driver #(T)负责将Transaction驱动到DUT的接口信号(如APB的PCLK/PRESETn)apb_driver(驱动APB协议信号)
uvm_monitor监测DUT的接口信号和响应(如采集APB的读写数据)apb_monitor(采集APB事务)
uvm_sequencer #(T)管理Sequence的调度(决定何时发送哪个Transaction)apb_sequencer(管理APB事务序列)
uvm_sequence #(T)生成一组相关的Transaction(如连续发送10个APB写操作)apb_write_sequence(生成APB写事务)
uvm_test验证平台的顶层控制类(启动Sequence、配置环境参数)test_apb_basic(测试APB基本功能)
uvm_agent封装Driver、Monitor和Sequencer的组合(可选配置为Active/Passive模式)apb_agent(包含APB Driver+Monitor)
uvm_scoreboard比较DUT的实际输出和预期结果(验证功能正确性)apb_scoreboard(校验APB读写一致性)

​​注​​:T是泛型参数,表示该组件处理的Transaction类型(例如 uvm_driver #(apb_transaction)表示该Driver处理 apb_transaction类型的事务)。

​​3. 具体组件的派生关系(以APB验证平台为例)​​

​​(1) 基础组件必须派生自UVM基类​​

​​① Driver(驱动DUT信号)​​

•​​派生自​​:uvm_driver #(apb_transaction)

•​​作用​​:将Transaction(如APB的地址、数据、读写标志)转换为DUT的实际接口信号(PADDR、PWDATA、PWRITE等),并通过时序逻辑驱动到DUT。

•​​为什么派生自UVM Driver​​:

UVM的 uvm_driver基类提供了标准的 run_phase任务框架(自动循环获取事务并驱动信号),开发者只需实现 drive_one_pkt()方法(将单个Transaction映射到DUT信号)。

​​② Monitor(监测DUT信号)​​

•​​派生自​​:uvm_monitor

•​​作用​​:监听DUT的接口信号(如APB的PADDR、PRDATA),将其转换为Transaction并发送给Scoreboard或Reference Model。

•​​为什么派生自UVM Monitor​​:

UVM的 uvm_monitor基类提供了通用的监测框架(例如通过Port将事务发送给其他组件),开发者只需实现信号采样逻辑。

​​③ Sequencer(管理事务序列)​​

•​​派生自​​:uvm_sequencer #(apb_transaction)

•​​作用​​:调度Sequence生成的Transaction,决定何时将哪个事务发送给Driver。

•​​为什么派生自UVM Sequencer​​:

UVM的 uvm_sequencer基类实现了事务队列管理和与Sequence的交互协议(通过 TLM传输接口),确保事务按正确顺序发送。

​​④ Sequence(生成事务序列)​​

•​​派生自​​:uvm_sequence #(apb_transaction)

•​​作用​​:生成一组相关的Transaction(如连续发送10个APB写操作,或交替发送读写操作)。

•​​为什么派生自UVM Sequence​​:

UVM的 uvm_sequence基类提供了 body()任务(事务生成入口)和与Sequencer的通信机制(通过 start_item()/finish_item()发送事务)。

​​⑤ Test(验证平台顶层控制)​​

•​​派生自​​:uvm_test

•​​作用​​:启动验证环境(如创建Agent、配置参数、运行Sequence),是验证平台的入口点。

•​​为什么派生自UVM Test​​:

UVM的 uvm_test基类集成了UVM的全局配置(如 uvm_config_db)和测试生命周期管理(通过 run_phase控制仿真流程)。

​​(2) 派生自UVM类的实际代码示例​​

​​① APB Driver(派生自uvm_driver)​​

class apb_driver extends uvm_driver #(apb_transaction);  // 派生自uvm_driver,处理apb_transaction类型事务`uvm_component_utils(apb_driver)  // 注册UVM工厂,支持动态创建virtual apb_if vif;  // 引用APB接口(包含PCLK/PADDR等信号)function new(string name, uvm_component parent);super.new(name, parent);endfunctiontask run_phase(uvm_phase phase);forever beginseq_item_port.get_next_item(req);  // 从Sequencer获取下一个Transactiondrive_one_pkt(req);                // 将Transaction驱动到DUT信号(具体实现)seq_item_port.item_done();         // 通知Sequencer事务已完成endendtasktask drive_one_pkt(apb_transaction txn);// 将txn的字段(addr/data/we等)赋值给DUT接口信号(例如vif.paddr = txn.addr;)// 添加APB协议时序(如PSEL拉高后延时1个时钟周期)endtask
endclass

​​② APB Test(派生自uvm_test)​​

class test_apb_basic extends uvm_test;  // 派生自uvm_test,作为验证平台顶层`uvm_component_utils(test_apb_basic)apb_agent apb_agt;  // 引用APB Agent(包含Driver/Monitor/Sequencer)function new(string name, uvm_component parent);super.new(name, parent);endfunctionfunction void build_phase(uvm_phase phase);super.build_phase(phase);apb_agt = apb_agent::type_id::create("apb_agt", this);  // 创建APB Agentendfunctiontask run_phase(uvm_phase phase);phase.raise_objection(this);// 启动一个Sequence(例如连续发送10个APB写操作)apb_write_sequence write_seq = apb_write_sequence::type_id::create("write_seq");write_seq.start(apb_agt.sqr);  // 通过Sequencer发送Sequencephase.drop_objection(this);endtask
endclass

​​4. 如果不派生自UVM类会怎样?​​

如果验证组件直接用SystemVerilog原生类或模块实现(例如 class my_driver或 module apb_driver),会导致以下问题:

1.​​无法使用UVM的核心功能​​:

•不能通过 uvm_config_db动态配置参数(如修改DUT地址范围)。

•不能利用Sequencer-Sequence模型生成复杂的事务序列。

•无法使用 uvm_info/uvm_error等标准日志宏(调试困难)。

2.​​组件间通信复杂​​:

•需要手动实现Transaction的传递(例如通过全局变量或事件触发),而UVM提供了标准的TLM端口(如 uvm_seq_item_pull_port)。

3.​​难以复用和维护​​:

•原生类没有统一的基类接口(例如所有Driver的驱动逻辑可能各不相同),导致代码复用率低。

•缺乏层次化管理(UVM的 uvm_component支持父子层次结构,便于定位问题)。

​​5. 总结​​

•​​验证平台中所有的组件应该派生自UVM中的类本质是:​​遵循UVM方法学的标准化设计原则,通过继承UVM预定义的基类(如 uvm_driver、uvm_sequence、uvm_test),利用其内置功能快速构建可维护、可扩展的验证环境​​。

•​​核心优势​​:复用标准功能、统一接口规范、简化组件通信、支持自动化测试和动态配置。

•​​实践建议​​:在开发验证平台时,始终优先使用UVM基类派生组件(如用 uvm_driver #(apb_transaction)实现APB Driver),而非从头编写原生类。

通过这种设计,您的验证平台将具备工业级的可靠性、可维护性和扩展性!


文章转载自:

http://er8EmgnI.bfycr.cn
http://EtYt8XJK.bfycr.cn
http://d4yIRNQY.bfycr.cn
http://tAVM1umH.bfycr.cn
http://O55PjSZ0.bfycr.cn
http://T5dFqQ1t.bfycr.cn
http://U2G5sXQb.bfycr.cn
http://dFVz56o7.bfycr.cn
http://XNQQtYc6.bfycr.cn
http://t291PxHY.bfycr.cn
http://l1dQtr8F.bfycr.cn
http://6oIz6Bmk.bfycr.cn
http://Txjph9iB.bfycr.cn
http://rxkwQ3sk.bfycr.cn
http://45jo4vf6.bfycr.cn
http://6S3tVt9a.bfycr.cn
http://Vh4qpR05.bfycr.cn
http://4T4XdyVL.bfycr.cn
http://vZrP2RLp.bfycr.cn
http://K8tfw8Ch.bfycr.cn
http://gRXi8ijn.bfycr.cn
http://qKuXHllx.bfycr.cn
http://YBLvd4am.bfycr.cn
http://lpzhJMS5.bfycr.cn
http://RYGVcXlv.bfycr.cn
http://8gh1zaXM.bfycr.cn
http://96QoazEO.bfycr.cn
http://zV072Pl0.bfycr.cn
http://A8CQxGZJ.bfycr.cn
http://idDYuKHt.bfycr.cn
http://www.dtcms.com/a/370483.html

相关文章:

  • 企业微信智能表格高效使用指南
  • 自动化运维之ansible
  • 2025年上海市星光计划第十一届职业院校技能大赛高职组“信息安全管理与评估”赛项交换部分前6题详解(仅供参考)
  • Orin-Apollo园区版本:订阅多个摄像头画面拼接与硬编码RTMP推流
  • 多线程(六) ~ 定时器与锁
  • OpenSSL 1.0.1e 下载解压和运行方法(小白适用 附安装包)​
  • Qt图表功能学习
  • 【营销策略算法】关联规则学习-购物篮分析
  • 部署AIRI
  • 深度学习基础概念回顾(Pytorch架构)
  • 基于LSTM深度学习的网络流量测量算法matlab仿真
  • 【PyTorch实战:Tensor变形】5、 PyTorch Tensor指南:从基础操作到Autograd与GPU加速实战
  • 【基础-判断】@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。
  • 驱动开发系列71 - GLSL编译器实现 - 指令选择
  • 贪心算法应用:化工反应器调度问题详解
  • OpenAvatarChat项目在Windows本地运行指南
  • canal+DataX实现数据全量/实时同步
  • Jenkins运维之路(自动获得分支tag自动构建)
  • 服务器内存和普通计算机内存在技术方面有什么区别?
  • 同一台nginx中配置多个前端项目的三种方式
  • 【LeetCode热题100道笔记】排序链表
  • Shell 脚本实现系统监控与告警
  • 【算法--链表】86.分割链表--通俗讲解
  • 基于区块链的IoMT跨医院认证系统:Python实践分析
  • 用内存顺序实现 三种内存顺序模型
  • rh134第五章复习总结
  • Java包装类型
  • Linux awk 命令使用说明
  • 一个正常的 CSDN 博客账号,需要做哪些基础准备?
  • 文件I/O与I/O多路复用