UVM sequence机制提供了生成和控制事务级(transaction level)测试激励的方式,这种方式来源于工程实践,让测试用例的开发更加高效,同时也提高了测试激励的可重用性。
在UVM框架下,测试激励从产生到最终作用于DUT接口的这一过程,遵守Sequence-Sequencer-Driver这一基本结构。这其中就有非常多的话题可以讨论,本系列文章也将就这些话题逐一展开。
Sequence item是游走在Sequence-Sequencer-Driver这一基本结构中的数据结构类型,在有些地方也直接叫transaction,可以说是UVM的必用品。本文不做为基础篇介绍sequence item是什么,而会介绍sequence item是实际应用中应该包含哪些东西。
01 Seq Item 框架
Sequence item作为事务级测试激励中的数据结构,自然承载着上下游赋予它的使命。
对于上游,用户通常对sequence item有控制的需求,比如将某些成员变量限制在某个合理的范围内,或者传递延迟控制信息给下游的driver,或者对整个sequence item做比较操作等等。
对于下游,sequence item需要包含当前事务所有必要的信息,这些信息最终会通过driver驱动到接口信号上;另一方面,sequence item可以收集接口返回来的信息,比如总线返回数据或响应类型等。
基于以上这些需求,在UVM类库提供的代码示例基础上,整理成以下一般框架,可用于指导日常开发。
02 用户自定义方法
在上面定义的sequence item框架中,有一部分是Utility方法。这些方法主要是提供给用户使用的,用于对sequence item本身的一些操作,包括复制、比较、打印、打包等等。
本来我们可以用UVM提供的uvm_field_*宏去做配置,然后使用默认的功能,这样就不需要用户自己去实现这些方法了。不过默认的方法执行比较低效,同时也不好调试,所以有条件的话建议用户自己实现。
下面列举几个用户常用的方法:
上表中“用户调用接口”指的是,在UVM环境开发或调试的时候,用户通过sequence item对象可以调用的方法名,比如seq_item_demo.print()。
“对应可自定义的虚函数”指的是,在开发sequence item本身的时候,我们可以通过重载该虚函数来实现自定义功能,比如print()方法被调用之后,它会间接地调用到do_print()。
原作者:JKZHAN
|