主要内容

生成DPI组件使用MATLAB

创建MATLAB功能和试验台

创建MATLAB函数

MATLAB代码®函数要出口一个SystemVerilog环境。信息编码MATLAB函数,在MATLAB中看到“功能基础”文档。

考虑添加编译指令% # codegen你的功能。这个指令可以帮助您诊断和解决违规,将导致错误在代码生成。看到编译指令% # codegen(MATLAB编码器)

在你的代码功能,请记住限制,描述DPI组件生成的各个方面,你必须知道。这些方面包括哪些数据类型有效,什么文件生成,共享库是如何编制的。

在这个例子中,MATLAB函数fun.m需要一个输入和繁殖2。功能包括编译指令% # codegen

函数y =乐趣(x) % # codegen y = x * 2;

创建MATLAB的过程包括编写代码,创建试验台,并运行试验台在一个迭代的过程。当你满意你的函数会按照你的意愿去做,继续生成SystemVerilog DPI组件

创建测试工作台

创建一个试验台来行使功能。在这个例子中,试验台适用于测试向量fun.m和情节输出。

函数示例= fun_tb % Testbench应该不需要输入,但是你可以给一个输出。%定义一个测试向量tVecIn = [1、2、3、4、5);%的运动乐趣。m和阴谋的结果,以确保功能正常工作tVecOut = arrayfun(@有趣(在),tVecIn);情节(tVecIn tVecOut);网格;%得到样本的输入与函数dpigen使用它。示例= tVecIn (1);

请注意,试验台不应该输入。试验台可以负载测试向量使用垫文件或任何其他数据文件,所以它不需要输入。

的输出fun_tb,样本,是用作函数的输入参数fun.m在调用dpigen,这就是为什么它是一个单一的元素。看到生成SystemVerilog DPI组件

运行试验台

fun_tb
ans = 1

接下来,生成SystemVerilog DPI组件。看到生成SystemVerilog DPI组件

生成SystemVerilog DPI组件

生成DPI组件与dpigen函数

使用的函数dpigen生成DPI组件。这个函数有几个可选的输入参数。至少,指定您想要的MATLAB函数生成一个组件和函数的输入。如果你还想生成一个试验台运动生成的组件,使用-testbench选择。

dpigen函数参数input_arg-testbenchtest_bench_name
  1. 定义输入功能的要求。在这个例子中,样本是双标量值的类型。

    示例= 1;
  2. 调用DPI组件生成器函数:

    dpigen有趣args样本-testbench fun_tb

    签发的命令,如图所示,执行以下任务:

    • 生成fun_dpi.sv——SystemVerilog组件的功能fun.m,函数的输入fun.m中指定样本

    • 生成fun_dpi_pkg.sv——SystemVerilog包文件。这个文件包含所有导入的函数声明。

    • 为生成的组件创建一个试验台。

    这个电话dpigen,MATLAB输出以下信息:

    # # #生成fun_dpi DPI包装器。c # # #生成头文件fun_dpi DPI包装器。h # # #包fun_dpi_pkg生成SystemVerilog模块。sv # # #生成fun_dpi SystemVerilog模块。sv # # #为:生成makefile fun_dpi # # # # # #编译DPI组件生成SystemVerilog试验台fun_tb。sv # # #为导师图形生成试验台模拟脚本QuestaSim / Modelsim run_tb_mq。做# # #为节奏门齿run_tb_incisive生成试验台模拟脚本。sh # # #生成试验台模拟剧本节奏Xcelium run_tb_xcelium。sh # # #为Synopsys对此VCS run_tb_vcs生成试验台模拟脚本。sh # # #为Vivado模拟器run_tb_vivado.bat生成试验台模拟脚本

    前面的示例中所示的函数生成以下文件夹和文件:

检查生成的包文件

检查生成的包文件。注意的声明初始化,重置,终止,有趣的功能。

这个例子显示了生成的代码fun_dpi_pkg.sv

/ /文件:C: \ \快乐\ fun_dpi_pkg fun_example \ codegen \ dll。sv / /创建:2017-12-19 09:18:00 / /由MATLAB 9.5和5.4 HDL验证器生成的时间表1 ns / 1 fun_dpi_pkg ns包;/ /声明进口C函数导入“DPI”功能chandle DPI_fun_initialize(输入chandle existhandle);导入“DPI”功能chandle DPI_fun_reset(输入chandle objhandle,输入实际x,输出真正的y);导入“DPI”功能无效DPI_fun(输入chandle objhandle,输入实际x,输出真正的y);导入“DPI”功能无效DPI_fun_terminate(输入chandle existhandle);endpackage: fun_dpi_pkg

检查生成的组件

检查生成的组件,这样您就可以了解dpigen函数转换MATLAB代码SystemVerilog代码。功能包括的更多信息,请参阅SystemVerilog生成包装器

这个例子显示了生成的代码fun_dpi.sv

/ /文件:C: \ \快乐\ fun_dpi fun_example \ codegen \ dll。sv / /创建:2017-12-19 09:18:00 / /由MATLAB 9.5和5.4 HDL验证器生成的时间表1 ns / 1 ns导入fun_dpi_pkg:: *;模块fun_dpi(输入时钟,clk_enable,输入重置,输入实际x,输出真正的y);chandle objhandle =零;真正的y_temp;最初开始objhandle = DPI_fun_initialize (objhandle);结束最后开始DPI_fun_terminate (objhandle);结束总是@ (posedge clk或posedge重置)开始如果(重置= = 1 'b1)开始objhandle = DPI_fun_reset (objhandle x, y_temp);y < = y_temp;结束else if (clk_enable)开始DPI_fun (objhandle x, y_temp); y<=y_temp; end end endmodule

检查生成的试验台

检查生成的试验台,这样你可以看到的功能dpigen从MATLAB代码创建了这个试验台。在生成的测试台上的更多信息,看一下生成的测试工作台

这个例子显示了生成的代码fun_tb.sv

/ /文件:C: \ fun_example \ \ dpi_tb \ fun_tb codegen \ dll \有趣。sv / /创建:2017-12-19 09:18:13 / /由MATLAB 9.5和5.4 HDL验证器生成的时间表1 ns / 1 fun_tb ns模块;真正的x;真正的y_ref;真正的y_read;真正的y;/ /文件句柄整数fid_x;整数fid_y;/ /其他试验台变量位时钟;位clk_enable; bit reset; integer fscanf_status; reg testFailure; reg tbDone; bit[63:0] real_bit64; bit[31:0] shortreal_bit64; parameter CLOCK_PERIOD= 10; parameter CLOCK_HOLD= 2; parameter RESET_LEN= 2*CLOCK_PERIOD+CLOCK_HOLD; // Initialize variables initial begin clk = 1; clk_enable = 0; testFailure = 0; tbDone = 0; reset = 1; fid_x = $fopen("dpig_in1.dat","r"); fid_y = $fopen("dpig_out1.dat","r"); // Initialize multirate counters #RESET_LEN reset = 0; end // Clock always #(CLOCK_PERIOD/2) clk = ~ clk; always@(posedge clk) begin if (reset == 0) begin #CLOCK_HOLD clk_enable <= 1; fscanf_status = $fscanf(fid_x, "%h", real_bit64); x = $bitstoreal(real_bit64); if ($feof(fid_x)) tbDone = 1; fscanf_status = $fscanf(fid_y, "%h", real_bit64); y_read = $bitstoreal(real_bit64); if ($feof(fid_y)) tbDone = 1; y_ref <= y_read; if (clk_enable == 1) begin assert ( ((y_ref - y) < 2.22045e-16) && ((y_ref - y) > -2.22045e-16) ) else begin testFailure = 1; $display("ERROR in output y_ref at time %0t :", $time); $display("Expected %e; Actual %e; Difference %e", y_ref, y, y_ref-y); end if (tbDone == 1) begin if (testFailure == 0) $display("**************TEST COMPLETED (PASSED)**************"); else $display("**************TEST COMPLETED (FAILED)**************"); $finish; end end end end // Instantiate DUT fun_dpi u_fun_dpi( .clk(clk), .clk_enable(clk_enable), .reset(reset), .x(x), .y(y) ); endmodule

接下来,在高密度脂蛋白模拟器运行生成的试验台。看到在高密度脂蛋白模拟器运行生成的试验台。如果你打算从Windows端口组件和可选的试验台®Linux®,请参阅生成的组件和试验台移植到Linux

在高密度脂蛋白模拟器运行生成的试验台

本节包括指导运行生成的试验台的支持高密度脂蛋白模拟器:金宝app导师图形®ModelSim®和,®,节奏®Xcelium™, Synopsys对此®风投公司®。这段代码可能会在其他工作(不支持)高密度脂蛋白模拟器但它是没有保证的。金宝app

选择的工作流HDL模拟器。

运行测试的长凳上ModelSim,模拟器

  1. 开始ModelSim或,在GUI模式。

  2. 改变你的当前目录dpi_tb在MATLAB代码生成目录下的文件夹。

  3. 输入以下命令在shell中启动仿真:

    做run_tb_mq.do

    这个生成的脚本包含组件的名称和试验台,并说明高密度脂蛋白模拟器运行试验台。

    仿真结束时,您应该看到下面的文本显示在控制台:

    * * * * * * * * * * * * * *测试完成(通过)* * * * * * * * * * * * * *

    这个消息告诉你,试验台是针对生成的组件运行成功。

下面的波形图像从这个例子表明,生成的试验台成功执行的HDL模拟器。

接下来,导入组件。看到使用生成的DPI SystemVerilog功能

运行测试的长凳上Xcelium模拟器

  1. Xcelium发射。

  2. 开始你的终端外壳。

  3. 改变当前目录dpi_tb在MATLAB代码生成目录。

  4. 输入以下命令shell启动模拟:

    sh run_tb_ncsim.sh

    这个生成的脚本包含组件的名称和试验台,并说明高密度脂蛋白模拟器运行试验台。

    仿真结束时,您应该看到下面的文本显示在控制台:

    * * * * * * * * * * * * * *测试完成(通过)* * * * * * * * * * * * * *

    这个消息告诉你,试验台是针对生成的组件运行成功。

运行测试的长凳上风投公司模拟器

  1. 启动风投。

  2. 开始你的终端外壳。

  3. 改变当前目录dpi_tb在MATLAB代码生成目录。

  4. 输入以下命令shell启动模拟:

    sh run_tb_vcs.sh

    这个生成的脚本包含组件的名称和试验台,并说明高密度脂蛋白模拟器运行试验台。

    仿真结束时,您应该看到下面的文本显示在控制台:

    * * * * * * * * * * * * * *测试完成(通过)* * * * * * * * * * * * * *

    这个消息告诉你,试验台是针对生成的组件运行成功。

使用生成的DPI SystemVerilog功能

使用生成的DPI组件在SystemVerilog试验台,首先你必须包括在SystemVerilog环境包文件。这将有DPI可用范围内SystemVerilog模块的功能。然后,您必须调用生成的功能。当你编译SystemVerilog包含导入生成函数的代码,使用DPI-aware SystemVerilog编译器和指定组件和包的文件名以及SystemVerilog代码。

下面的例子演示了添加生成的DPI组件fun.mSystemVerilog模块。

  1. 调用初始化函数。

    DPI_fun_initialize ();
  2. 调用该函数生成fun.m

    DPI_fun (x, y);

现在,您可以根据需要修改生成的代码。

例子

模块test_twofun_tb;最初开始DPI_fun_initialize ();最终always@ (posedge clk)开始# 1 DPI_fun (x, y);结束

端口生成的组件和试验台Linux

端口组件和可选试验台从Windows操作系统Linux操作系统,遵循一个工作流基于HDL模拟器。

请注意

你必须有一个嵌入式编码器®许可证将组件从Windows移植到Linux。

生成通用DPI组件

遵循这个工作流支持的HDL模拟器。金宝app软件支持金宝app导师图形ModelSim、导师图形,节奏Xcelium, Synopsys对此投模拟器。生成DPI组件一般都支持高密度脂蛋白模拟器。金宝app

任务窗户主机

  1. 创建一个coder.config(MATLAB编码器)对象。改变目标HW设备类型LP64Linux操作系统。

    cfg = coder.config (dll);
    cfg.HardwareImplementation。TargetHWDeviceType = '通用- > 64位嵌入式处理器(LP64) ';
  2. 运行dpigen函数使用的选项配置使用配置在步骤1中创建的对象。使用这个选项- c这样dpigen函数生成唯一的代码。

    dpigen配置cfg数据类型。m args InputSample - c
  3. 生成一个zip归档移植到Linux,导航到包含的源文件夹buildInfo文件,并执行这些命令在MATLAB命令提示符:

    负载buildInfo packNGo (buildInfo)
  4. 导航到顶级文件夹。找到生成的ZIP归档在步骤3中,名称相同的MATLAB函数。将ZIP归档文件复制到Linux机器。

任务Linux目标机器

  1. 解压缩文件使用- j选项中提取所有文件与扁平的文件夹结构。您可以将内容解压缩到任何文件夹。

    解压缩- j DataTypes.zip
    1. 这个通用的makefile脚本复制到一个空的文件:

      SRC = $(通配符* . c) OBJ = $ (SRC: c = . o) SHARE_LIB_NAME = DPI_Component。所以:(SRC) (SHARE_LIB_NAME)美元@echo“# # #成功地生成所有二进制输出。”$(SHARE_LIB_NAME): $(OBJ) gcc -shared -lm $(OBJ) -o $@ .c.o: gcc -c -fPIC -Wall -pedantic -Wno-long-long -fwrapv -O0 $< -o $@
    2. 取代DPI_Component.so与您想创建的共享库的名称。

    3. 将脚本保存为Porting_DPIC.mk文件夹中包含的zip文件。

  2. 建立共享库。

    让- f Porting_DPIC。可所有的

    与SystemVerilog使用生成的组件,请参阅使用生成的DPI SystemVerilog功能

  3. (可选)运行试验台的软件生成的窗口。

    1. 复制的内容dpi_tb目标文件夹从Windows主机Linux机器。

    2. 运行测试。

    高密度脂蛋白的试验台运行模拟器,明白了在高密度脂蛋白模拟器运行生成的试验台

生成Simulator-Specific DPI组件

遵循这个工作流导师图形ModelSim,导师图形,和节奏Xcelium Synopsys对此风投和Xilinx®Vivado®高密度脂蛋白模拟器。你为你选择模拟器生成DPI组件。

使用这个工作流程简单移植步骤。如果你使用这个工作流,您不需要创建一个通用的makefile脚本和构建Linux目标机器上的共享库使用生成的组件。如果你生成一个试验台运动生成的组件,您不需要复制试验台文件夹从Windows主机Linux单独目标机器。

任务窗户主机

  1. 创建一个coder.config(MATLAB编码器)对象。

    cfg = coder.config (dll);
  2. 选择目标模拟器配置和操作系统coder.config在步骤1中创建的对象。MATLAB的工作区中,双击cfg打开的EmbeddedCodeConfig对话框cfg。在硬件窗格中,在构建过程,选择一个目标工具链。此选项指定了目标模拟器和操作系统上运行模拟。支持向量金宝app工具链:

    • 节奏Xcelium(64位Linux)

    • 导师图形ModelSim / QuestaSim(64位Linux)

    • Synopsys对此投(64位Linux)

    • Xilinx Vivado模拟器(64位Linux)

  3. 运行dpigen函数使用配置选择使用配置对象。使用-testbench选择如果你还想生成一个试验台运动生成的组件。使用- c选项,这样dpigen函数生成唯一的代码。

    dpigen配置cfg数据类型。m args InputSample -testbench DataTypes_tb。m - c
    1. 生成一个ZIP归档移植到Linux,导航到源文件夹,其中包含buildInfo文件。

      负载buildInfo
    2. 使用packNGo(MATLAB编码器)功能包生成的文件和任何所需的依赖项之前,将它们复制到目标机器。指定参数“minimalHeaders”,假的包括所有的头文件包括ZIP归档文件的路径。

      packNGo (buildInfo minimalHeaders,假)
  4. 导航到顶级文件夹。找到生成的ZIP归档在步骤3中,名称相同的MATLAB函数。将ZIP归档文件复制到Linux机器。包含ModelSim的ZIP归档文件到这里。扩展或Xcelium、风投或Vivado文件. sh扩展。

任务Linux目标机器

  1. 将文件解压缩到您所选择的文件夹。

    解压缩DataTypes.zip
    1. 启动HDL模拟器。

    2. 导航到包含生成的文件,解压缩的文件夹在步骤1。

    3. VCS模拟器只:设置模拟器环境路径。使用自己的Synopsys对此投安装路径时执行的命令。

      设置VCS_HOME = C: / Synopsys对此/ temp / vc / s - 2021.09 - 1
      在这里,VCS_HOME环境变量的名称。

    4. 构建项目并运行试验台的HDL模拟器。

      • 在ModelSim,模拟器,运行这些命令。

        做数据类型。做run_tb_mq.do
      • Xcelium,风投和Vivado模拟器,运行这些命令。取代模拟器与你的目标模拟器时执行的命令。

        sh数据类型。sh sh run_tb_模拟器. sh %替代模拟器风投,或者vivado xcelium

限制

  • 风投和Vivado模拟器不支持跨平台DPI代大小可变的向量。金宝app

  • Vivado模拟器,DPI组件生成不支持金宝app数据类型。