浅析UVM中的Virtual Sequences

描述

在一个系统级的验证环境中,多个验证组件并行地产生激励。测试用例开发者可能希望协调多个通道激励之间的时序和数据。

Virtual sequences与virtual sequencer相关联,用于协调测试平台中的激励生成。一般来说,一个virtual sequencer包含对其子sequencer的引用,即driver sequencers或其他virtual sequencers。

Virtual sequences可以调用其他virtual sequences,以及每个子sequencer中的sequences(driver  sequences)。

在下图中,virtual sequencer在ethernet和cpu验证组件上调用配置sequences。这些配置sequences是在模块级测试期间开发的,可以在系统级测试时复用

sequence

有三种方式可以让virtual sequencer与它的subsequencers交互:

Virtual sequencers和subsequencers同时发送激励。

禁用subsequencers。Virtual sequencers是唯一的驱动。

使用grab()和ungrab()--Virtual sequencers在有限的时间内控制激励发送。

当使用virtual sequences时,大多数测试用例开发用户都会只从virtual sequences中调用sequences。要调用sequences,需要执行以下操作之一:

使用'uvm_do宏 。

使用sequence start()方法。

创建一个Virtual Sequencer 

为了从一个sequencer中对多个sequencers进行控制,可以使用一个不附属于driver的sequencer,这就是virtual sequencer。要创建一个virtual sequencer,需要:

从uvm_sequencer类派生出一个virtual sequencer类。

在virtual sequencer中添加对其他subsequencer的指针(在更高层次的验证组件(通常是top-level environment)中)。

下面的例子声明了一个有两个subsequencers的virtual sequencer。

sequence

Subsequencers可以是driver sequencers或其他virtual sequencers。

创建一个Virtual Sequence

要创建一个virtual sequence:

从uvm_sequence派生出一个sequence类。

定义一个body()方法。

使用`uvm_ do_on(或` uvm_do_on_with)宏来调用subsequencers的sequences。

使用`uvm_do(或`uvm_do_with)宏来调用当前virtual sequencer中的其他virtual sequences。

一个virtual sequence不能使用`uvm_do或`uvm_do_with来执行数据项的发送,只能执行sequences。

下面的例子显示了一个简单的virtual sequence控制两个subsequencers:cpu sequencerethernet sequencer。假设cpu sequencer有 一 个 cpu_config_seq sequence,ethernet sequencer有一个 eth_large_payload_seq序列。

sequence

sequence

控制其他Sequencers 

当使用virtual sequencer时,需要考虑subsequencers和virtualsequence之间的关系。有三种典型的可能性:

virtual sequencer和subsequencers同时产生激励。subsequencers产生的数据项和virtual sequencer产生的数据项被混合在一起,并由driver以任意顺序执行。

禁用subsequencers。使用uvm_config_db::set将subsequencers的default_sequence属性设置为null。

sequence

使用grab()/lock()和ungrab()/unlock()。在这种情况下,一个virtual sequence可以在有限的时间内实现对其subsequencers的完全控制,然后让原始sequences继续工作。grab和lock防止其他sequence在被锁定的sequencer上被执行。

grab()方法将lock request放在sequencer仲裁队列的头部,允许调用者阻止当前等待授予的数据项被处理,而lock()方法将lock request放在队列的末端,允许数据项在授予lock之前被处理。

sequence

将Virtual Sequencer连接到Subsequencers上

要连接一个virtual sequencer和它的subsequencers,需要在验证环境的connect() phase将sequencer的实例赋值给virtual sequencer中指定的sequencer指针。

 

v_sequencer.cpu_seqr = cpu_seqr; 
v_sequencer.eth_seqr = eth_seqr;

 

下面这个例子显示了一个top-level environment,它实例化了ethernet和cpu验证组件以及控制这两个组件的virtual sequencer。

在top-level environment中,各个组件内部的sequencers的路径是已知的,可以根据该路径将sequencers连接到virtual sequencer上。

sequence





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分