生成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;
调用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和,模拟器
开始ModelSim或,在GUI模式。
改变你的当前目录
dpi_tb
在MATLAB代码生成目录下的文件夹。输入以下命令在shell中启动仿真:
做run_tb_mq.do
这个生成的脚本包含组件的名称和试验台,并说明高密度脂蛋白模拟器运行试验台。
仿真结束时,您应该看到下面的文本显示在控制台:
* * * * * * * * * * * * * *测试完成(通过)* * * * * * * * * * * * * *
这个消息告诉你,试验台是针对生成的组件运行成功。
下面的波形图像从这个例子表明,生成的试验台成功执行的HDL模拟器。
接下来,导入组件。看到使用生成的DPI SystemVerilog功能。
运行测试的长凳上Xcelium模拟器
Xcelium发射。
开始你的终端外壳。
改变当前目录
dpi_tb
在MATLAB代码生成目录。输入以下命令shell启动模拟:
sh run_tb_ncsim.sh
这个生成的脚本包含组件的名称和试验台,并说明高密度脂蛋白模拟器运行试验台。
仿真结束时,您应该看到下面的文本显示在控制台:
* * * * * * * * * * * * * *测试完成(通过)* * * * * * * * * * * * * *
这个消息告诉你,试验台是针对生成的组件运行成功。
运行测试的长凳上风投公司模拟器
启动风投。
开始你的终端外壳。
改变当前目录
dpi_tb
在MATLAB代码生成目录。输入以下命令shell启动模拟:
sh run_tb_vcs.sh
这个生成的脚本包含组件的名称和试验台,并说明高密度脂蛋白模拟器运行试验台。
仿真结束时,您应该看到下面的文本显示在控制台:
* * * * * * * * * * * * * *测试完成(通过)* * * * * * * * * * * * * *
这个消息告诉你,试验台是针对生成的组件运行成功。
使用生成的DPI SystemVerilog功能
使用生成的DPI组件在SystemVerilog试验台,首先你必须包括在SystemVerilog环境包文件。这将有DPI可用范围内SystemVerilog模块的功能。然后,您必须调用生成的功能。当你编译SystemVerilog包含导入生成函数的代码,使用DPI-aware SystemVerilog编译器和指定组件和包的文件名以及SystemVerilog代码。
下面的例子演示了添加生成的DPI组件fun.m
SystemVerilog模块。
调用
初始化
函数。DPI_fun_initialize ();
调用该函数生成
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
任务窗户主机
创建一个
coder.config
(MATLAB编码器)对象。改变目标HW设备类型LP64
Linux操作系统。cfg = coder.config (dll);
cfg.HardwareImplementation。TargetHWDeviceType = '通用- > 64位嵌入式处理器(LP64) ';
运行
dpigen
函数使用的选项配置
使用配置
在步骤1中创建的对象。使用这个选项- c
这样dpigen
函数生成唯一的代码。dpigen配置cfg数据类型。m args InputSample - c
生成一个zip归档移植到Linux,导航到包含的源文件夹
buildInfo
文件,并执行这些命令在MATLAB命令提示符:负载buildInfo packNGo (buildInfo)
导航到顶级文件夹。找到生成的ZIP归档在步骤3中,名称相同的MATLAB函数。将ZIP归档文件复制到Linux机器。
任务Linux目标机器
解压缩文件使用
- j
选项中提取所有文件与扁平的文件夹结构。您可以将内容解压缩到任何文件夹。解压缩- j DataTypes.zip
-
这个通用的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 $@
取代
DPI_Component.so
与您想创建的共享库的名称。将脚本保存为
Porting_DPIC.mk
文件夹中包含的zip文件。
建立共享库。
让- f Porting_DPIC。可所有的
与SystemVerilog使用生成的组件,请参阅使用生成的DPI SystemVerilog功能。
(可选)运行试验台的软件生成的窗口。
复制的内容
dpi_tb
目标文件夹从Windows主机Linux机器。运行测试。
高密度脂蛋白的试验台运行模拟器,明白了在高密度脂蛋白模拟器运行生成的试验台。
生成Simulator-Specific DPI组件
遵循这个工作流导师图形ModelSim,导师图形,和节奏Xcelium Synopsys对此风投和Xilinx®Vivado®高密度脂蛋白模拟器。你为你选择模拟器生成DPI组件。
使用这个工作流程简单移植步骤。如果你使用这个工作流,您不需要创建一个通用的makefile脚本和构建Linux目标机器上的共享库使用生成的组件。如果你生成一个试验台运动生成的组件,您不需要复制试验台文件夹从Windows主机Linux单独目标机器。
任务窗户主机
创建一个
coder.config
(MATLAB编码器)对象。cfg = coder.config (dll);
选择目标模拟器配置和操作系统
coder.config
在步骤1中创建的对象。MATLAB的工作区中,双击cfg
打开的EmbeddedCodeConfig对话框cfg
。在硬件窗格中,在构建过程,选择一个目标工具链。此选项指定了目标模拟器和操作系统上运行模拟。支持向量金宝app工具链:节奏Xcelium(64位Linux)
导师图形ModelSim / QuestaSim(64位Linux)
Synopsys对此投(64位Linux)
Xilinx Vivado模拟器(64位Linux)
运行
dpigen
函数使用配置
选择使用配置
对象。使用-testbench
选择如果你还想生成一个试验台运动生成的组件。使用- c
选项,这样dpigen
函数生成唯一的代码。dpigen配置cfg数据类型。m args InputSample -testbench DataTypes_tb。m - c
-
生成一个ZIP归档移植到Linux,导航到源文件夹,其中包含
buildInfo
文件。负载buildInfo
使用
packNGo
(MATLAB编码器)功能包生成的文件和任何所需的依赖项之前,将它们复制到目标机器。指定参数“minimalHeaders”,假的
包括所有的头文件包括ZIP归档文件的路径。packNGo (buildInfo minimalHeaders,假)
导航到顶级文件夹。找到生成的ZIP归档在步骤3中,名称相同的MATLAB函数。将ZIP归档文件复制到Linux机器。包含ModelSim的ZIP归档文件
到这里。
扩展或Xcelium、风投或Vivado文件. sh
扩展。
任务Linux目标机器
将文件解压缩到您所选择的文件夹。
解压缩DataTypes.zip
-
启动HDL模拟器。
导航到包含生成的文件,解压缩的文件夹在步骤1。
VCS模拟器只:设置模拟器环境路径。使用自己的Synopsys对此投安装路径时执行的命令。
设置VCS_HOME = C: / Synopsys对此/ temp / vc / s - 2021.09 - 1
VCS_HOME
环境变量的名称。构建项目并运行试验台的HDL模拟器。
在ModelSim,模拟器,运行这些命令。
做数据类型。做run_tb_mq.do
Xcelium,风投和Vivado模拟器,运行这些命令。取代
与你的目标模拟器时执行的命令。模拟器
sh数据类型。sh sh run_tb_模拟器. sh %替代
风投,或者vivado xcelium模拟器
限制
风投和Vivado模拟器不支持跨平台DPI代大小可变的向量。金宝app
Vivado模拟器,DPI组件生成不支持金宝app
单
和双
数据类型。