原标题:SV及UVM接口应用篇之五(终):脚本语言与UVM的交互
脚本语言在验证日常中是一位好帮手,除了在不同工具、环境和流程之间可以起到粘合剂的作用,也可以提高验证的灵活性。我们在验证激励的产生和控制上面谈到过,验证序列的产生可以分为:
线下生成(offline generation),即在仿真之前产生
线上生成(online generation),即在仿真过程中产生
同时控制也可以类似地分为线下控制和线上控制。如果将这两种测试元素组合在一起,那么会有下面的几种组合:
线下生成控制和激励,这部分往往由脚本语言来实现决定测试场景和激励数据,而在仿真时由SV/UVM解析文本继而发起激励。
线下生成控制而线上产生激励,这是典型的SV/UVM测试场景,线上生成激励是由每一个周期内新产生的随机数完成的,而每次的测试所需要的参数往往是在测试之前固定下来的。
线上生成控制和产生激励, 为了提供测试控制更多的灵活性,脚本可以在仿真时对SV/UVM环境发起命令控制,即线上控制的方式。
线上生成控制和线下产生激励,这一交互方式会由SV/UVM一端首先发起仿真,在线生成随机配置模式,而在需要激励数据时与Python交互,要求Python生成激励数据文本,再分析该文本发送激励。
本节主要针对脚本语言与UVM的交互场景,即主要介绍上面的线上控制和线下激励、以及线上控制和线上激励两种场景介绍它们交互的各种可能,同时会有实际的应用场景来启发读者们的思路。
线上控制和线下激励的交互应用
SV语言的长处在于随机控制,而对于一些在信号处理、浮点运算的应用在使用上面并不想传统的C和脚本语言那么得心应手。譬如其它的软件语言对于信号处理有着专业的库,可以在提供底层支持的同时,方便用户构建更上层的算式,这一点对于SV而言就是一个门槛。那么对于数据运算有着更高要求的应用在随机测试时,如果使用SV来生成相关的数据,则意味着需要先开发类似的数据计算库,进而才能创建一些可用的随机数据。除了这种增加额外成本的选择,我们还可以考虑用其它语言的数据计算优势来弥补SV这一点的不足。
另外,对于后期的数据采样比较时,由于也需要高等数据计算的结束,也可以由外部的语言完成数据比较。这样一来,数据的生成和比较由外部语言完成,而数据的激励和采样由UVM完成。下面我们给出一个运用Python语言来实现生成测试数据的用例,而在仿真开始UVM一侧会在线生成配置数据,进而影响测试数据的参数传入。由UVM调用Python来生成测试数据并,通过文本的方式由UVM一侧来分析并且生成激励。同时,在仿真过程中,环境中的monitor会采样数据,写入到采样文本中,待仿真结束后,由Python一侧的线下scoreboard完成复杂的数据比较。
在下面的例码中,我们主要摘出了跟数据生成的例码。通过这段例码,读者们可以看到,借助了Python丰富的库和文本处理,我们可以很方便地运用高等计算来生成需要的数据和相应的配置参数,而这一点在后期的数据比较中也同样重要。
Python提供复杂数据的生成类,同时等待外部的参数传递,并将数据最终生成文本
UVM一侧提供生成测试数据源的参数,继而通过$system()系统函数来调用Python脚本,利用Python脚本生成测试数据
UVM接下来会继续解析生成的数据文本,并且将其送往DUT的数据接口,这一部分文本解析的代码我们在文中省略了。
这段例码主要解释了数据生成的流程,可以看到触发端是由UVM一侧发起的,而在发起之前,用于呼叫Python脚本的配置参数则是UVM随机生成的。这便是线上控制(UVM)和线下激励(Python)的交互方式。而要注意的一点是,生成的数据可能并不是一次全部生成的,会伴随着仿真和调用Python次数,每次生成新的数据以供UVM的激励使用。另外,可以从这个测试DSP的用例看到,关于数据的比较部分也是在仿真结束时来调用的比较脚本,这一交互关系也是由UVM来呼叫Pytyon部分的。至于数据比较的部分,还有一种可行的方案时,为了保证数据检查的实时性,可以在两侧采样文本都达到一定要求时,就采用周期性地比较,这种比较方式可以更好地“保鲜”,在第一时间将错误和“案发地点”锁定,也便于调试。
线上控制和线上激励的交互应用
在通常的UVM测试中,往往在测试中就会给定UVM环境的配置参数。无论是给固定值的配置方式,还是给随机限定条件的方式,都无法在仿真时做动态改变。那么有没有场景需要动态调整测试时的配置情况呢?
如果需要在测试时可以动态地控制测试结构和场景,而又在不重新编译的情况下,如何实现呢?如果有的时候,由于修改了测试代码而需要额外编译和链接的时间过久,又或者加载大型SoC仿真对象过久,那么在已启动的仿真环境中,可以不做二次编译,且能够修改测试结构和配置参数的话,那是一种更好的选择。
如果环境面对的是UVM新手,让他们写UVM测试代码可能会需要额外的学习时间。那么有没有其它好的方法呢?在之前的测试平台自动化生成一章中我们就提到过一个良好结构化的测试平台Pangu。该平台除了会自动生成测试平台,同时也支持标准化的测试命令,降低了UVM初级用户的使用门槛。而如果可以在仿真时,通过一些简易可读的脚本来控制测试环境,那么这种线上控制的方式也可以使得UVM的验证更容易。
无论是哪一种要求,如果在UVM仿真时,让仿真器和脚本(通常是Tcl)之间构建线上的命令接口,使得从命令窗口(console)给入的Tcl指令也可以控制验证环境,那么这就会让测试变得更容易和更灵活。Tcl是各种仿真器的命令语言,用来控制仿真的开始、结束、打印报告信息和更多复杂的操作。Tcl同时也是一种非常强大的脚本语言,一般在Perl和Python中可以做的处理Tcl也可以代劳。为了让Tcl可以在线地对UVM环境和DUT进行控制,我们需要修改原有的UVM环境,添加一个面向Tcl的代理。通过这个代理,可以一方面接收Tcl的命令,继而解析和执行,同时也能够返回一些数据,通过Tcl命令接口来返回到仿真器一侧。
对于Tcl的命令接口,考虑到Tcl可以实现信号、参数以及变量的修改,事件和时间的等待,我们可以利用这些丰富的功能实现具体的要求,最终完成对UVM测试的线上控制。这些可以实现的要求可以包括但不局限于:
定义基本的配置列表
定义哪些参数可以随机化
定义可随机化变量的边界值
选择可以挂载到sequencer的sequence
修改和读回目标信号值
对DUT做一些基本的配置
下面给出在MentorGraphics QuestaSim中建立的一些Tcl方法,通过这些方法可以实现一些简答的测试场景。读者如果对这些方法感兴趣,可以在不同仿真器支持的Tcl命令集上实现用来控制UVM环境的方法,并最终在仿真时完成对UVM环境的控制。
通过上面这些基本的命令,在仿真时可以写出一些易用易读的测试指令。这些指令如果控制UVM的配置变量、随机条件,就可以实现UVM测试的控制。值得注意的还有,如果上面的这些基本指令编码易维护移植的话,可以作为EDA厂商的Tcl指令的开源库。因为很多的情况下,用户不再需要一个简单的信号赋值,而可能需要等待一个事件;用户可能不只是需要读回信号的值,可能还需要将数值进行判断和记录。同时关于UVM控制的Tcl指令,EDA厂商和UVM标准委员会也可以在不久的将来考虑推出更为广泛的Tcl指令集,以此来规范在线仿真时的UVM环境控制和随机数据生成。
目前UVM支持的还只停留在内置的命令行处理器(command line processor)来与仿真时传入的参数交互。这些参数都是预定义好的,通过仿真时命令行传入的特定参数可以用来设置UVM的测试(+UVM_TESTNAME)、冗余度(+UVM_VERBOSITY)、退出时间(+UVM_TIMEOUT)等等,或者用户也可以实现自定义的参数传递的分析,例如:
无论是使用上面预定义好的“UVM_”前缀命令行参数,还是用户自定义好的命令行参数解析,这些仍然都停留在仿真时的命令传入控制,依然无法满足在仿真时对UVM环境控制的要求。因此,路桑认为有必要在EDA厂商与UVM标准委员会之间设定新的Tcl命令标准,再由各个EDA厂商根据他们原有的仿真环境和底层指令来实现这些一致化的命令集。这一要求类似于之前讲到的SystemC与UVM之间的UVM Connect开源库,该库同时也支持SC/C/C++一侧控制UVM的环境。只不过与Tcl脚本实现不同的地方在于,UVM到C的控制命令接口是更直接和便于移植的,不会因为仿真器的差别而遇到多少移植的阻力;而UVM到Tcl的控制命令移植则更依赖于不同仿真器底层的Tcl指令集,因此有必要由EDA厂商和UVM标准委员会一起商定这个事情。
介绍完上面两种脚本语言与UVM的交互方式,我们可以发现这些交互都不是“直接”的方式,并不想SV DPI-C的命令接口一样属于“天生”的方法。如果再联想之前SystemC与UVM的交互,它们之间也是间接通过的DPI-C的接口。那么有没有可能脚本语言与C之间有接口呢?关于这一问题我们需要就不同的脚本语言区别对待。例如Python与C/C++之间的接口就可以通过Python官方提供的实现方式来实现,而一旦脚本语言与C/C++有良好接口实现,那么就可以通过C/C++为数据交换中转的地方,继而实现Python与SV/UVM之间更丰富的互相调用了。
至此,我们就将目前主要的一些语言与SV/UVM的混合仿真和交互实例介绍完了。希望通过这些丰富的手段,读者们可以在日后遇到其它语言的模型时可以轻松将它们装入到UVM环境中,实现快速的集成和混合仿真。
下一章我们将进入《
SV及UVM高级话题篇
》。
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。