欢迎光临
我们一直在努力

UVM 虚拟序列 vsequence 与 vsequencer:SOC 验证的“调度艺术”

从单个 Agent 到多 Agent 协同,需要一位“总指挥”

在模块级验证中,一个 uvm_sequence 运行在对应 Agent 的 sequencer 上,产生激励,一切顺理成章。但到了 SOC 级验证,系统由 CPU、DMA、IO 等多个子模块组成,每个子模块都有自己的 agent 和 sequencer。测试用例往往需要同时协调多个接口,比如让 CPU 先配置 DMA 寄存器,然后 DMA 启动搬移,同时 IO 持续产生中断。这种情况下,单个 sequencer 上的 sequence 无法控制其他 sequencer,我们急需一个“总指挥”来统一调度。

UVM 提供的解决方案就是 virtual sequence(虚拟序列) 与 virtual sequencer(虚拟序列器) 的组合。上一节我们初步了解了 vsequencer 作为“调度席”的角色,本节将深入剖析 vsequence 如何利用 p_sequencer 访问多个 real sequencer,并通过 fork/join 实现多路激励的并行与协调。

重点:vsequence + vsequencer 是 SOC 验证的核心调度机制,掌握它们,你才能从模块级验证顺利过渡到系统级验证。

vsequence 与 vsequencer 的配合关系

vsequencer:只持句柄,不生产数据

uvm_sequencer 的子类 my_vseqr 通常被扩展为 virtual sequencer,它内部包含多个 real sequencer 的句柄,例如 m_cpu_sqr、m_dma_sqr、m_io_sqr。它不产生任何 item,也不直接与 driver 交互,它的作用仅仅是提供一个统一的“通讯录”,让 vsequence 能够找到所有需要调度的 real sequencer。

class my_vseqr extends uvm_sequencer;
cpu_sequencer m_cpu_sqr;
dma_sequencer m_dma_sqr;
io_sequencer m_io_sqr;

`uvm_component_utils(my_vseqr)

function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
endclass

这些句柄通常由上层环境(env)在 connect_phase 或 build_phase 中赋值,指向真实的 sequencer 实例。

vsequence:运行在 vsequencer 上的调度员

my_vseq 是一个普通的 uvm_sequence,但它不是直接在某个 real s

赞(0)
未经允许不得转载:171主机测评 » UVM 虚拟序列 vsequence 与 vsequencer:SOC 验证的“调度艺术”
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址