UVM验证环境中使用Matlab-Simulink模型进行协同仿真

 

UVM验证环境中使用Matlab-Simulink模型进行协同仿真...



1.简介

Linux系统依靠多核计算可以并行执行多个测试场景、帮助减少仿真时间。然而用行为模型去验证一个设计的过程仍然是一个连续不间断的仿真过程,并且需要在两种仿真结果之间进行单独的比对处理。验证过程中需要生成测试场景以及由精确的行为模型如C/C+或者Matlab计算处理产生期望的结果,然后进行RTL的仿真,最终将RTL仿真结果和行为模型计算处理的结果进行比对。如图1所示:



图1. 使用行为模型和RTL仿真的验证过程.

但是问题来了,随着设计规模的不断变大或者要对设计的功能进行充分的验证测试时却需要很长时间去仿真。并且要进行大量的数据结果的比对,整个验证过程被分割成段,这样做对于验证本身来说可能会引入或着曾加不必要的延时和错误。

针对RTL验证的完整性和准确性问题,通用验证方法学(UVM)支持RTL仿真环境可以与行为模型仿真环境进行连接耦合。如图2所示,本文中通过使用Mentor Graphics的Questaism和MATLAB/Simulink作为仿真工具,通过连接耦合这两个仿真器可以减少总的仿真时间,同时对于比对行为模型和RTL的最终结果将会更加可信。UVM验证方法学也可以用于减少测试场景的数量,使得仿真效率得以提高;并且提供的测试场景将会更加彻底、更加完整的去测试我们的设计,同时也可以在仿真时候提供一种自动化的方法去收集验证用的指标数据。



图2. 将Matlab/Simulink行为模型和RTL仿真汇集到一个仿真中去加速验证进程.

2.结果分析

2.1 协同仿真(Co-simulation)

Matlab 和Simulink 模块独立于设计和UVM验证环境,运行在Matlab仿真软件平台上。运行UVM验证环境的工具不能直接运行Matlab软件,但是通过使用Matlab里面的引擎和SystemVerilog的DPI,UVM验证环境可以以一种子程序调用的方式去调度运行嵌入在UVM中的Matlab环境。2.2 Matlab 引擎(Matlab Engine)

Matlab有一个可以被Mablab引擎库调用的C函数库,它用于进程的开始和结束,以及发送命令和数据在Matlab中去执行相应的处理,应用编程接口(API)中的函数包括打开和关闭Matlab引擎、发送和接收变量,同时还可以发送字符串到Matlab控制台。在Matlab中这些函数被包含在一个名为engine.h的头文件中,同时该engine.h文件必须被包括在可以调用Matlab引擎函数的源文件中【1】。下面图3是一个Matlab引擎函数调用的例子,该例子可以在Matlab安装目录下面的~/extern/examples/env_mat/engdemo.c目录下找到。如图3所示:



图3. 在C代码中创建Matlab Engine函数.

通常设计者会创建一个包含所需要Matlab函数的C源文件,然后将这些函数导入 UVM中去。2.3 SystemVerilog DPI

SystemVerilog 自身内置的功能可以通过直接编程接口(DPI)使用一个导入(import)函数与外界的编程语言进行交互。一个函数可以被写入到另一种编程语言中,譬如C代码,可以通过DPI将其导入到SystemVerilog原文件中去。一旦函数被导入,SystemVerilog中的源文件可以对它进行正常的函数调用。一个通过DPI在 Systemverilog原文件中导入C函数的例子如图4所示:



图4.通过DPI导入Matlab Engine函数到Systemverilog文件中.

在编译时,通过DPI导入的函数必须被编译到一个DPI头文件中。在Questasim中完成这样的操作是在编译的时候通过添加-dpiheader标记到DPI头文件完成的。支持上述功能的所有文件全部要被包括到一个SystemVerilog package里。在编译时候通过图5中的命令【2】将-dpiheader标记添加到编译命令中:



图5.Queatasim中使用简单的命令去创建DPI头文件,其中package文件包含了所有函数文件.

接下来通过用一个被声明的引擎类(engine class)去创建一个引擎对象(engine object),其中这个引擎对象包含了所有通过DPI接口导入的函数。而这个engine class文件要包含在图5的package包中。声明一个简单的engine class方法如如6所示:



图6. 在SystemVerilog代码中创建一个Matlab engine calss.

Matalb engine对象现在就可以在需要使用engine的模块中被创建。SystemVerilog源文件将会使用需要的Matlab Engine去导入已经被编译并带有DPI头文件的engine包文件。通常情况下,环境中的顶层模块中要包含Matlab命令和导入已经被编译的engine包。如图7所示:



图7. 将已经被编译的Matlab Eegine导入SystemVerilog模块的代码中.

随着导入的Matlab ngine包被声明后,Matlab engine函数现在就可以在SV模块中进行调用。首先SV模块要打开一个Matlab engine去运行需要用到的Matlab函数,然后在上述操作全部完成后关闭该Matlab engine。如图8所示:



图8. 在SystemVerilog代码中调用Matlab engine函数.

2.4 Simulink仿真模型

Simulink作为一种应用被集成到Matlab中。一旦在UVM环境中打开一个Matlab engine,对应的一个Simulink仿真模型就会被加载进来。Matlab engine 不能直接去控制Simulink仿真模型,但是可以在Matlab中的控制台(console)通过使用命令去加载和驱动一个Simulink仿真模型【3】。

engEvalString()是一个被包含在Matlab engine库中的字符串函数,这个库会直接给Matlab控制台发送命令。一旦当命令通过DPI接口被导入后,Matlab 控制台命令就可以由UVM代码构成。通过使用Matlab 控制台命令打开一个Simulink仿真模型,对应的操作如图9所示:



图9. 在SystemVerilog代码中使用Matlab Engine engEvalString()字符串函数去调用Matlab 控制台.

上面操作完成之后将会打开Simulink仿真模型,然后启动Simulink仿真,再一次使用engEvalString()函数给Matlab控制台发送一个命令就会再一次去启动Simulink仿真模型。通过被导入的Matlab Engine字符串函数,我们现在就可以直接从UVM环境给Matlab控制台发送命令以及控制我们的Simulink仿真模型。如图10所示:



图10. SystemVerilog和Matlab之间的通信.

由于Matlab engine不是直接与Simulink仿真模型进行连接的,因此数据不能再Matlab中的Simulink仿真模型和UVM环境之间直接进行传输。为了克服这一缺点,Simulink仿真模型要进行一些改进。在改进之后的仿真模型中需给将要与DUT设计进行比对的Simulink仿真模型添加监视器(monitors),在这一点上允许引入数组数据给Matlab工作区。一旦这些数组数据到了Matlab工作区,就会立刻被转发到中UVM环境中去,其中Matlab engine函数engGetVariable()会从Matlab工作站得到数据。

当通过使用DPI导入命令后,UVM环境就可以从Matlab工作站得到Simulink中monitor监控到的数据。当UVM环境中需要用一些带有约束随机变量的激励时,UVM环境就会生成带有约束随机变量的事物级数据包给仿真,这些数据包会被发送给Matlab engine,然后再进入Simulink仿真模型。在这一点上也允许在Simulink仿真模型中提供更进一步的测试但是就Matalb自身而言是做不到这一点的。Matlab与Simulink之间的数据通信如图11所示:



图11. 嵌入monitor的Simulink仿真模型.

2.5 UVM环境     

Matlab engine对象和命令可以包含在系统级验证环境中,Matlab engine的打开、关闭以及命令都是来自于系统级UVM环境。来自于Matlab engine的数据会被移植到UVM环境中去用于随后的数据比对和计分操作。

2.6 基于覆盖率统计的验证

对于这一点,允许Simulink仿真模型进行单一的迭代。UVM环境启动了Matlab engine去作为一个子进程,同时Simulink仿真开始并且转发数据到Matlab工作区,然后在将这些数据转发给UVM环境作为验证环境中的变量。到这里之后UVM环境就可以跑起来同时可以与Matlab那边的数据进行比对了。同样地,UVM环境也可以跑仿真时间设置固定的仿真,仿真环境发送激励给Simulink仿真模型,同时在这里也允许一个测试用例在时间设置固定的仿真中去跑,并且可以在基于覆盖率统计的验证过程中应用直接或随机的测试用例去完成覆盖率统计的目标。

2.7 基于覆盖率数据收敛目标的验证

通过跑测试用例,直到覆盖所有UVM环境无限期运行中遇到的需要去覆盖的目标,当一个MatlabEngine被嵌入到UVM环境后,Simulink仿真模型也需要能够无限期地去运行,以便于连续的运行仿真直到满足覆盖率目标。在UVM环境中Simulink仿真模型与DUT之间的时间相关性需要满足,Simulink仿真模型中的计时器需要在UVM环境中去匹配一个时间窗口,这个时间窗口将会有一定数量的数据在两个环境之间进行交互,并且用于交互的数据量也应该被相应地进行设计。当Simulink中的计时器到达给定的时间时,它会触发一个断言去用于暂停Simulink仿真模型,依据断言再去使用Matlab控制台命令就会将Simulink仿真模型暂停。

一旦暂停了Simulink仿真模型,数据需要从Simulink中的monitor传输给Matalab工作区。这一点可以通过在Matlab控制台使用一个带有暂停功能的DPI函数去完成,之后数据就可以被传输到UVM环境,通过对Simulink仿真模型运行相同的时间周期后在于DUT结果进行比对,一旦这些都被完成后,Simulink仿真模型就可以用一条控制台命令继续去进行Simulink仿真。这种迭代可以无限期地反复进行下去直到覆盖率目标完成。

2.8 基于断言的验证       

通过在UVM环境中嵌入Matlab / Simulink仿真模型后,仿真模型可视为一个黄金参考模型,仿真模型的数据可以直接与DUT的数据进行比对,同时断言也可以被创建到UVM环境中去更进一步验证设计功能的完整性。

2.9 协同仿真技术的优点 

用Matlab和UVM创建一个协同仿真环境可以带来许多好处。协同仿真直接在Matlab/Simulink模型和DUT之间进行数据比对,这将从仿真环境以及手工进行数据比对和断言等数据分析中节省时间。

在算法设计中,相比于UVM方法学,激励有时候更容易在Matlab中被创建。通过协同仿真使二者联系结合在一起,由Matlab产生的相同功能的激励可以给UVM环境中的DUT使用,这一特点将给UVM验证方法学节省了创建测试用例的时间。

给Matlab/Simulink模型创建激励已经是一种已知的模式。具有约束随机特点的UVM方法学已经有能力去创建带有覆盖率统计作为验证指标的约束化随机激励,并且这种随机化的测试用例可以反复用于仿真。

3.结论  

通过使用DPI接口给UVM环境导入Matlab Engine,使得一个嵌入式的Matlab环境可以在UVM中被创建。同时支持在UVM环境中进行Matlab / Simulink仿真模型与DUT之间进行协同仿真,这种协同仿真技术为用户带来了许多便利。协同仿真还可以节省总体设计和验证所需要的时间,同时也提高了行为模型和RTL代码之间数据比对的准确性。

谢谢你对路科验证的关注,也欢迎你分享和转发真正的技术价值,你的支持是我们保持前行的动力。


    关注 路科验证


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册