| |
Matlab/Integration
Using MATLAB with UVM/OVM
MATLAB是一种建模工具,通常用于开发复杂数学函数的函数模型,然后将其转换为RTL库块。虽然将MATLAB函数转换为RTL是一个单独的主题,但在验证过程中使用MATLAB源代码的能力可以显著的缩短开发验证测试平台的时间。有关MATLAB及其各种功能的信息,请访问Mathworks网站。 (www.mathworks.com)。
本文希望用户对使用MATLAB来开发算法是熟悉的,并了解如何在MATLAB环境中编写,组织和运行MATLAB代码。此外,使用MATLAB需要单独的MATLAB licenses,包括本文中提到的任何MATLAB工程工具箱或功能(特别是EDA Simulator Link)的licenses。
现有的MATLAB函数可用于在RTL可用之前作为DUT进行初始Testbench开发,以及用于验证DUT功能的记分板的一部分。
MATLAB提供了几种使用MATLAB函数的不同机制。每种方法都有优点和缺点,应根据用户的具体需要选择使用哪种方法。
MATLAB提供以下功能:
- 与HDL仿真器并行运行MATLAB以执行MATLAB计算;
- 使用MATLAB函数作为包含MATLAB函数的Verilog模块;
- 将MATLAB函数编译为共享库,允许使用SystemVerilog DPI调用函数;
- SystemC TLM2与MATLAB通信;
最后两种方法有些复杂,下面仅简要讨论。本文附带的示例仅演示了前两个功能。
MATLAB in parallel with the HDL simulator
与创建共享库类似,可以与HDL模拟器并行运行MATLAB引擎。这种方法比创建共享库更容易,因为MATLAB函数直接在MATLAB引擎中运行,不需要单独的编译步骤。但是,用户需要一组类似的DPI函数来启动MATLAB引擎,加载MATLAB代码并提供仿真器和MATLAB引擎之间的数据转换。通常,用户可以使用命令字符串将MATLAB命令发送到MATLAB引擎并读取生成的输出缓冲区。然后可以解析输出缓冲区以读取正确的刺激响应并在记分板内进行检查。
MATLAB functions as a DUT
MATLAB提供了将HDL shell模块连接到MATLAB函数的功能。这种称为EDA Simulator Link的功能(www.mathworks.com/products/eda-simulator [2])将与HDL仿真器并行运行并提供DUT功能。MATLAB函数的输入和输出是DUT端口,通过调用相应的MATLAB子函数执行任何内部功能。
MATLAB shared libraries
MATLAB提供了一个编译工具(mcc),它将MATLAB文件(.m)文件编译成共享库。作为此过程的一部分,它将创建共享库文件(.so)和头文件(.h)以启用共享库。要与共享库进行通信,MATLAB需要使用现有的MATLAB矩阵函数。要启用与MATLAB库的简单DPI通信,需要开发一个中间包装函数,以提供从DPI数据类型到MATLAB矩阵值的转换。
这种编码可能有些复杂,因为将DPI变量转换为必需的MATLAB矩阵值可能需要一些工作量。并行使用MATLAB引擎更容易,它提供了通过MATLAB shell命令调用MATLAB函数的能力。该技术将在下一节中介绍。
MATLAB communication with TLM2 transactions
MATLAB提供了通过TLM2事务与SystemC环境进行通信的功能。在OVM / UVM中使用此方法需要从OVM / UVM < - > SystemC TLM2 < - > MATLAB进行转换。由于额外的SystemC编码要求,除非用户已在使用TLM2 SystemC组件,否则不建议这样做。
MATLAB Integration Example
下面提供了一个完整的示例,演示了将MATLAB与UVM环境结合使用的两种方法。该示例包含三个单独的使用模型。第一种是纯UVM环境,它使用Verilog DUT和UVM Testbench以及标准的UVM行为记分板。第二部分用一个模块替换Verilog DUT,该模块使用MATLAB函数代替DUT行为。第三部分用MATLAB函数替换UVM Scoreboard predict_response()函数。
Using MATLAB as a DUT with EDA Simulator Link
对于我们示例的第一阶段,我们将使用简单的8位加法器MATLAB函数作为DUT。这将使用简单的MATLAB函数和EDA Simulator Link功能来完成,以在Questa和MATLAB之间提供HDL通信。
ml_adder.m
我们创建了一个MATLAB函数ml_adder,它接受两个整数,让它们相加并存储结果。它还将结果输出到MATLAB显示,以便我们可以在需要时将结果解析回Questa。
MATLAB源代码如下所示:
function r = ml_adder(in0, in1)
%MATLAB function to implement a simple adder
%
r = in0 + in1;
% Print out the results to the MATLAB buffer
str = sprintf('%d', r);
disp(str);
% [EOF] ml_adder.m
hdl_adder.m
为了将我们的ml_adder函数用作DUT,我们创建了一个MATLAB包装器函数,我们可以将其连接到HDL模块。EDA Simulator Link工具箱提供位向量和内部MATLAB数据类型之间的转换功能。
MATLAB源代码如下所示:
function [iport,tnext] = hdl_adder(oport, tnow, portinfo)
% Demonstration for MATLAB Connectivity
% This function uses the HDL Simulator Link methodology to get HDL port values
% into and out of this function
%
tnext = [];
iport = struct();