在UVM框架下,使用sequence来产生测试激励的方法非常高效,用户可以根据测试场景来构造和复用不同抽象层次的测试序列(sequence)。
01
多sequence的执行和控制
多个sequence被启动之后的执行流,根据串并行关系,大致有这么几种类型:串行执行、并行执行和层次执行,如上图所示。图中黄色框是串行执行,绿色框是并行执行,蓝色框是层次执行。
02
Virtual Sequence
实际上,代码是自由的,virtual sequence也只是一个名字而已,谁也没有规定叫了这个名字就不能去发送sequence item,也没有谁规定一个验证环境只能有一个virtual sequence。只不过,这种多sequence的管理方法比较好用和科学,才被单独提出来和介绍,一切要根据实际情况去做决定。
上图是使用了virtual sequence的UVM测试结构。可以看到virtual sequence包含了多个sequencer句柄,这些句柄在virtual sequence被实例化的时候需要指向具体的sequencer对象。示例代码如下:
Virtual sequence的常见使用方法就是在test类的run phase中被实例化,完成sequencer句柄的引用分配,最后将其启动。这也只是常用方法,并不是必须要这么用,比如virtual sequence也可以在其他地方被启动,有需要的话它也可以包含其他句柄来引用验证环境中的更多对象。
03
Sequence Library
关于sequence library,在应用上两个方面需要关注:一个是如何将sequence注册到sequence library;另一个是如何配置或者控制sequence library中sequence。
注册sequence到sequence library
在sequence library类中,有两个队列。一个是通过宏`uvm_sequence_library_utils定义的静态队列m_typewide_sequences[$],另一个是uvm_sequence_library类成员sequences[$]。我们最终要使用的是sequences[$]。下面用LIBTYPE表示我们定义的sequence library类名。
第一种方法:在sequence_library类被实例化之前,我们可以在test类的build_phase中,将sequence通过LIBTYPE::add_typewide_sequence或者LIBTYPE::add_typewide_sequences这两个静态方法,逐个或者批量添加到LIBTYPE::m_typewide_sequence[$]队列中,作为候选sequence。
同时,UVM还提供了宏`uvm_add_to_seq_lib(TYPE, LIBTYPE)来提供相同的功能,在具体sequence类定义时,跟调用工厂注册宏一起调用。
另外,在sequence library类的构造函数中,需要调用init_sequence_library,该函数会将LIBTYPE::m_typewide_sequence[$]中的sequence搬到sequence library的sequences[$]中。
第二种方法:在sequence_library类被示例化之后,通过调用类方法add_sequence或者add_sequences逐个或者批量直接添加到sequences[$]队列中。
对sequence library的控制
在uvm_sequence_library类中有三个用于控制的成员变量:selection_mode、min_random_count和max_random_count,分别控制从sequences[$]队列中选取sequence的算法、最少执行多少个sequence以及最多执行多少个sequence。
其中max/min_random_count都是int类型,而seleciton_mode是枚举类型uvm_sequence_lib_mode,有四个枚举值:
至于配置方法,可以在例化完sequence library之后直接修改对象中成员变量,也可以在使用default_sequence时通过uvm_config_db来传递配置参数。
//
总结全文,如果你有一堆sequence,可以玩的方案有很多,但一定要注重可重用性和结构性,比如规划不同层次sequence以及定义一个在验证环境中具有伸缩性的virtual sequence结构。