story · 2021年07月19日

在UVM中,什么是p_sequencer和m_sequencer?

在UVM方法学中,UVMsequences 是寿命有限的对象。

UVM sequences从uvm_sequence_item基类扩展得到,uvm_sequence_item进一步从uvm_object基类扩展得到。

UVM sequences不是在仿真的开始,而是在仿真的过程中生成并分配内存的,也没有类似uvm_component的层次结构。

随着仿真的进行,将创建一个或多个UVM sequences ,并在sequencer上启动这些序列。sequencer-driver之间的接口 将一个或多个sequences 作为激励发送给DUT。一旦sequences 发送完成,对应的内存将得到释放。

往往我们在书写测试用例或者sequences的时候会有查询验证平台组件uvm_component的需求,比如env/driver/monitor。

由于sequences不是测试平台层次结构的一部分,实现这种需求就比较困难 。sequences唯一可以访问的句柄是它当前运行的sequencer 。因此,sequences需要通过sequencer 访问测试平台中层次结构。

这就是m_sequencer/p_sequencer概念的用处。

m_sequencer是uvm_sequencer_base类型的句柄,默认情况下在每个sequence中都可用。连接到driver 的真正的sequencer 是从uvm_sequencer_base类派生出来的,其 被参数化为用于与driver 通信的sequence item类型。

因此要访问正在运行sequence 的真实sequencer ,我们需要将m_sequencer类型转化为真实sequencer ,通常称为p_sequencer

WeChat Image_20210719100803.jpg

下面是一个简单的示例,sequence 希望访问sequencer的 clock monitor组件

class test_sequencer_c extends uvm_sequencer;
    clock_monitor_c clk_monitor;
endclass
class test_sequence_c extends uvm_sequence;
    test_sequencer_c p_sequencer;
    clock_monitor_c my_clock_monitor;
    task pre_body()                   //Typecast the m_sequencer base type to p_sequencer
    if(!$cast(p_sequencer, m_sequencer)) begin
        `uvm_fatal("Sequencer Type Mismatch:", " Worng Sequencer");
    end
//get access to clock monitor
    my_clock_monitor = p_sequencer.clk_monitor;
    endtask
endclass
作者:XinXinHu
原文链接:https://mp.weixin.qq.com/s/KdcYfSOcyIysGRWXhjCHxA
微信公众号:
数字芯片实验室.jpg
授权转自数字芯片实验室公众号,请勿二次转载。

推荐阅读

更多数字IC设计技术干货等请关注数字芯片实验室专栏。
推荐阅读
关注数
12275
内容数
199
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息