| ||
对于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高级话题篇》。
谢谢你对路科验证的关注,也欢迎你分享和转发真正的技术价值,你的支持是我们保持前行的动力。