当前位置: 首页 > 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) begin
                tx = my_transaction::type_id::create("tx");
                start_item(tx);       // 请求发送权限
                assert(tx.randomize());// 随机化事务
                finish_item(tx);      // 将事务提交给Sequencer
            end
        endtask
    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 begin
                my_transaction req;
                seq_item_port.get_next_item(req);  // 阻塞获取事务
                drive_to_dut(req);                // 驱动到DUT
                seq_item_port.item_done();        // 通知事务完成
            end
        endtask
    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++) begin
            my_transaction tx;
            tx = my_transaction::type_id::create("tx");
            start_item(tx);
            tx.data = i;
            finish_item(tx);  // 阻塞直到Driver调用item_done()
        end
    endtask
endclass

// Driver代码
class my_driver extends uvm_driver #(my_transaction);
    task run_phase(uvm_phase phase);
        forever begin
            my_transaction req;
            seq_item_port.get_next_item(req);  // 阻塞直到事务到达
            $display("Driving transaction: data=%0d", req.data);
            #10ns;  // 模拟驱动时序
            seq_item_port.item_done();         // 解除finish_item阻塞
        end
    endtask
endclass

相关文章:

  • 电路笔记(信号):串联电容变小、并联电容增大的分析和计算
  • JUC并发—8.并发安全集合二
  • 为AI聊天工具添加一个知识系统 之113 详细设计之54 Chance:偶然和适配 之1
  • 支持批量导出的软件,效率拉满!
  • DeepSeek在企业中的有那些具体应用?
  • MapReduce 第二部:深入分析与实践
  • pyside6学习专栏(二):程序图像资源的加载方式
  • Python中常见库 PyTorch和Pydantic 讲解
  • Python Cookbook-2.2 写入文件
  • ollama run deepseek-r1:1.5b改变默认下载路径
  • 国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑
  • LeetCode刷题---哈希表---648
  • 基于springboot校园健康系统的设计与实现(源码+文档)
  • deepseek:推荐一个免费没有广告的电脑桌面备忘录
  • TikTok账户安全指南:如何取消两步验证?
  • easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题
  • 【Python爬虫(27)】探索数据可视化的魔法世界
  • Pytorch实现之ISRGAN高分辨率图像生成训练自己的低分辨率图像
  • 3dmax噪波制作镜头震动动画
  • 【网络编程】TCP连接connect几次syn之后一直返回EINVAL问题
  • 敲定!今年将制定金融法、金融稳定法
  • 钱学森数据服务中心在沪上线,十万个数字资源向公众开放
  • 往事|学者罗继祖王贵忱仅有的一次相见及往来函札
  • 见微知沪|最大力度消费补贴,最大程度满足人们对美好生活的向往
  • 海关总署牵头部署开展跨境贸易便利化专项行动
  • 停止水资源共享、驱逐武官,印度对巴基斯坦宣布多项反制措施