主要内容

生成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®和,®Sim,节奏®Xcelium™, Synopsys对此®风投公司®。这段代码可能会在其他工作(不支持)高密度脂蛋白模拟器但它是没有保证的。金宝app

选择的工作流HDL模拟器。

运行测试的长凳上ModelSim,Sim仿真器

  1. 开始ModelSim或QuestaSim 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操作系统,遵循这些指示。

请注意

你必须有一个嵌入式编码器®许可证的Windows, Linux端口。尽管港有可能工作没有嵌入式编码人员许可,使用不支持。金宝app

步骤1。任务的窗户主机

  1. 创建一个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.mat文件生成),并执行以下命令在命令提示符:

    负载buildInfo buildInfo.packNGo ()
  4. 为移植复制文件,返回到顶级文件夹。发现在上一步中生成的zip文件(MATLAB函数名称相同)。将zip文件复制到Linux机器。

步骤2。任务的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. (可选)的试验台运行在Windows中自动生成。

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

    2. 运行测试。

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