背景
《uvm实战》书上介绍的uvm验证平台,往往只有一个in_agent
(即包括driver、in_monitor
和sequencer)。
然而,一个agent代表一种协议。
由sequence机制的简单理解,可以知道,1个sequencer负责多个sequence的顺序调度。如果出现多个driver或者多个sequencer,必然出现顺序执行的调度问题。
举个例子,一个IP,包括APB寄存器配置接口、AXIslaver数据接口、AXImaster数据接口。像这样的IP,搭建其验证平台,往往需要3个in_agent
;于是出现了3个driver、3个sequencer,另外还有N个sequence。(类似IP env环境,重用到Chip env环境里。)
virtual sequence机制,就是为了解决N个sequence、多个sequencer同时调度的冲突问题。
实现步骤
- 定义virtual sequencer,里面包含各个env里的sequencer类型的指针。
base_test
作为uvm_test_top
,即uvm树形结构的最顶层。负责chip_env和virtual sequencer的规划。
- 实例化virtual sequencer;
- virtual sequencer与各env的sequencer连接在一起,具体实现是通过function connect_phase对virtual sequencer的指针,赋值为各个env的sequencer实例层次。
- 定义virtual sequence。
- 多个sequence的实例化
- 利用`uvm_do_on类型宏,实现指定某个sequencer(这个由vritual sequencer的`uvm_declare_p_sequencer宏和
p_sequencer
公共变量来指定)负责各个sequence的顺序调度。
注意:`uvm_do这样的宏,针对的处理对象,不仅仅是transaction,还可以处理sequence。
- 在my_case0类似的case定义中,使用uvm_config_db方式实现virtual sequencer和virtual sequence的default_sequence设置。
细节分析
- 在
base_test
类里,实例化virtual sequencer。并在其function connect_phase里实现virtual sequencer的指针(其中,virtual sequencer类里定义sequencer的指针)与各env(envA、envB、envC)的sequencer层次连接在一起。 - sequence里组织事务的产生。其中virtual sequence里组织的是sequence的顺序调度。所以,在uvm验证平台里,有一个现象,sequence类的参数类型是my_transaction;而virtual sequence类的定义是没有参数的。
- virtual sequence里负责start_phase的raise_objection和drop_objection,避免不必要的重复定义。这是uvm实战里约定的。其中drop_objection代码注释后,可以使验证平台不自动$finish。
- 4.