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

uvm中的激励是如何发送出去的

在UVM中,Sequence生成的激励(Transaction)通过以下协作流程发送到Driver并最终驱动到DUT,其核心机制如下:

+---------------+       +---------------+       +------------+       +-----+
| Sequence      | →     | Sequencer     | →     | Driver     | →     | DUT |
+---------------+       +---------------+       +------------+       +-----+生成事务(Transaction)  管理事务队列与仲裁     拉取并处理事务       实际驱动信号

2. 激励发送的详细步骤

步骤1:Sequence生成事务
  • Sequence通过uvm_do宏或手动调用start_item/finish_item生成事务。

  • class my_sequence extends uvm_sequence #(my_transaction);task body();my_transaction tx;repeat(10) begintx = my_transaction::type_id::create("tx");start_item(tx);       // 请求发送权限assert(tx.randomize());// 随机化事务finish_item(tx);      // 将事务提交给Sequencerendendtask
    endclass

步骤2:Sequencer管理事务队列

 事务缓存finish_item()将事务放入Sequencer的请求队列。

 仲裁机制:Sequencer根据配置的仲裁算法(如优先级、公平性)选择下一个发送的事务。

  • Driver在run_phase中循环调用get_next_item从Sequencer获取事务。

步骤3:Driver拉取事务
  • Driver在run_phase中循环调用get_next_item从Sequencer获取事务。

  • class my_driver extends uvm_driver #(my_transaction);virtual task run_phase(uvm_phase phase);forever beginmy_transaction req;seq_item_port.get_next_item(req);  // 阻塞获取事务drive_to_dut(req);                // 驱动到DUTseq_item_port.item_done();        // 通知事务完成endendtask
    endclass

    get_next_item 的作用:

    •         功能:从Sequencer的请求队列中阻塞获取下一个事务

      • 关键行为

        • 阻塞等待:若Sequencer的队列为空,Driver会在此处挂起,直到Sequence产生新事务。

        • 获取事务对象:返回的requvm_sequence_item类型,通常需要转换为具体的Transaction类型。

  • item_done 的作用

  • 功能:通知Sequencer当前事务已处理完毕,允许Sequencer释放资源并继续后续操作。

  • 关键行为

    • 同步握手:解除Sequence中finish_item()的阻塞,使Sequence能继续发送下一个事务。

    • 可选响应传递:通过参数返回响应数据(如读操作结果)

  • Sequence与Driver的交互
+-------------------+       +-------------------+       +-------------------+
| Sequence          |       | Sequencer         |       | Driver            |
+-------------------+       +-------------------+       +-------------------+
| start_item(req)   | -->   | 将req放入队列      | <--   | get_next_item(req)|
|                   |       |                   |       |                   |
| finish_item(req)  | <--   | 等待item_done()   | --(阻塞)-+                 |
|                   |       |                   |       | 处理req并驱动DUT |
|                   |       |                   |       | item_done()       |
+-------------------+       +-------------------+       +-------------------+

 

 步骤4:事务完成确认

  • Driver调用item_done()通知Sequencer事务处理完毕,触发以下行为:

    • 释放Sequence阻塞:解除finish_item()的阻塞,允许Sequence继续发送下一个事务。

    • 响应传递(可选):若需要返回响应数据(如读取DUT结果),可通过item_done(rsp)传递。

3. 关键交互机制

(1) 阻塞握手协议
  • start_item():请求发送权限,若Sequencer未授权则阻塞。

  • finish_item():将事务提交到Sequencer队列,等待Driver处理完成(item_done)后解除阻塞。

(2) 事务生命周期
Sequence生成事务 → Sequencer缓存 → Driver拉取 → 驱动到DUT → 确认完成 → Sequence继续

4. 多Sequence并发场景

当多个Sequence同时向同一个Sequencer发送事务时:

  • Sequencer仲裁:通过set_arbitration方法设置仲裁策略(如UVM_SEQ_ARB_FIFOUVM_SEQ_ARB_PRIORITY)。

  • 优先级控制:可通过set_priority调整Sequence优先级。

5. 示例:完整交互流程

// 场景:一个Sequence发送3个事务
// ----------------------------
// Sequence代码
class test_sequence extends uvm_sequence #(my_transaction);task body();for (int i=0; i<3; i++) beginmy_transaction tx;tx = my_transaction::type_id::create("tx");start_item(tx);tx.data = i;finish_item(tx);  // 阻塞直到Driver调用item_done()endendtask
endclass// Driver代码
class my_driver extends uvm_driver #(my_transaction);task run_phase(uvm_phase phase);forever beginmy_transaction req;seq_item_port.get_next_item(req);  // 阻塞直到事务到达$display("Driving transaction: data=%0d", req.data);#10ns;  // 模拟驱动时序seq_item_port.item_done();         // 解除finish_item阻塞endendtask
endclass

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

相关文章:

  • 一只企鹅如何改变世界
  • 拦截器VS过滤器:Spring Boot中请求处理的艺术!
  • C语言预处理学习笔记
  • LLM基础环境准备-云服务器
  • 网络协议相关知识有哪些?
  • 基于Llama 3.2-Vision的医学报告生成
  • 离线部署大模型:ollama+deepseek+open-webui
  • 如何看nginx.conf文件?
  • 3月营销日历:开启春日盛宴,绽放生活魅力
  • pdf预览在vue项目中的使用兼容ie浏览器
  • Unity面板介绍_Project工程面板(23.1.1)
  • 使用Termux将安卓手机变成随身AI服务器(page assist连接)
  • MacOS安装Emacs
  • OpenCV机器学习(10)训练数据的一个核心类cv::ml::TrainData
  • 3.1 actor基本框架(c#的Akka.Actor模式)
  • Git使用[同一电脑多个账户ssh-key的管理]
  • 使用Python结合`stable-baselines3`库(包含PPO和TD3算法)以及`gym`库来实现分层强化学习的示例代码
  • 【论文笔记】MambaGlue: Fast and Robust Local Feature Matching With Mamba
  • 基于 Stanford CoreNLP 的中文自然语言处理
  • python 量化交易入门到提升详细教程,python量化交易教程
  • 如何设置爬虫的访问频率?
  • 前端循环全解析:JS/ES/TS 循环写法与实战示例
  • 大气体育直播模板赛事扁平自适应模板源码
  • vue3学习1
  • java机器学习计算指标动态阈值
  • mac os设置jdk版本
  • Python正则表达式学习
  • ShenNiusModularity项目源码学习(10:ShenNius.FileManagement项目分析)
  • mysql查看binlog日志
  • Node.js高频面试题精选及参考答案