1. 简介
什么是虚拟sequencers和虚拟sequences,在什么时候使用它们?当我们需要使用多种驱动agents协调生成激励的测试用例,则需要使用虚拟sequences来完成。今天学习的这篇论文[1]充分详细的介绍了m_sequencer和p_sequencer句柄以及与这些句柄一起使用的宏(`uvm_declare_p_sequencer)和方法。
2. 什么时候需要一个virtual sequencer?
如果只有一个激励驱动的 agent,则不需要virtual sequencer。如果你有多个驱动agent,但不需要激励之间的协调(在设计上是相互独立的),则不需要virtual sequencer。如果您有多个驱动 agent并且需要激励间的协调,则需要一个virtual sequencer。如果测试平台将来需要扩展成有多个agent,或者多个独立激励的测试平台需要设计成相互协调的激励,那么环境就要更新到包括一个或多个virtual sequencer。很明显在项目后期执行的这些更新可能会很痛苦(如果你对这个平台不了解),相反的如果从一开始就添加了virtual sequencer并在需要时利用虚拟sequencer就好多了。工程师可能要养成在大多数UVM测试台中添加virtual sequencers的习惯。
图片来源于论文
3. 为什么是“虚拟”的sequencers和sequences?
SystemVerilog具有虚拟类,虚[2]拟方法和虚拟接口,所有这三个都需要“ virtual”关键字。 UVM具有虚拟sequencers和虚拟sequences,但没有一个要求使用“virtual”关键字。 UVM中没有uvm_virtual_sequencer或uvm_virtual_sequence基类。所有sequencers和虚拟sequencers都是uvm_sequencer类的派生类,所有sequence和虚拟sequences都是uvm_sequence类的派生类。
4. 为什么虚拟的sequencers和sequences是虚拟的?
虚拟sequencers的三个属性是:
- 控制其他sequencers。
- 未连接到driver。
- 本身不处理事务。
虚拟sequencer未连接到driver。 它不是通过sequencers端口在driver上执行单个sequence items,而是通过句柄到sub-sequencer目标执行sub-sequences和在sequencers上的sequence items。《UVM用户指南》有时将sub-sequences称为“driver-sequence”。 虚拟sequencer是“虚拟的”,因为通常我们不会真正在此sequencer上运行sequence,而是通过虚拟sequencer中定义的句柄在sub-sequencer上运行序列。
虚拟sequence可以在多个实际sequencers上运行多种事务类型。 虚拟sequence通常只是在适当的子sequencer上协调其他sequences的执行。
在vsqr中声明了2个sqr
5.三种virtual sequencer模式
《UVM用户指南》描述了用户可以使用虚拟sequence与sub-sequnecer进行交互的三种方式:(1)“Business as usual”(也称为产生并行流量,多条流交替),(2)关闭sub-sequencers,(3)使用grab()和 ungrab()。
《UVM用户指南》声称“大多数用户关闭sub-sequencers仅从虚拟sequence中调用sequences”,但是我们的经验以及许多验证同事的经验是,最流行的virtual sequencer模式是产生并行流量,也称为“Business as usual”。
6.如何实现virtual sequencers?
virtual sequencer只不过是一个组件,它提供了一个位置和作用域来配置virtual sequence,并为virtual sequence所需的子序列提供句柄。virtual sequencer的代码非常简单,它在构建完所有组件之后(在buildphase()之后),通常通过在env中的connectphase()中设置虚拟sequencer中声明的子序列句柄,这些子句柄将通过配置数据库(uvm_config_db)进行指定。
例1-简单的virtual sequencer
例1是virtual sequencer的典型结构。在此示例中,用户定义的类名称是vsequencer。 可以看出virtual sequencer是从uvm_sequencer扩展的。 与普通sequencer不同,例1的virtual sequencer没有参数化事务类型,因为该sequencer将能够执行多种事务类型。 从uvm_sequencer基类扩展virtual sequencer而没有任何参数意味着virtual sequencer将使用uvm_sequence_item的默认参数化值。
virtual sequencerz中要声明sub-sequencer句柄。 在例1中,sub-sequencer句柄分别称为ahb_sqr和eth_sqr。 这两个子sequencer句柄将在end_of_elaboration_phase()期间由配置数据库中指定的值分配。
与用于连接UVM测试平台中大多数组件的事务级模型&#x