Main Content

HDL IP コアを調査して迅速にプロトタイプを作成するためのホスト インターフェイス スクリプトの生成

SoC プラットフォーム向けのハードウェア ソフトウェア協調設計ワークフローを実行する場合、DUT アルゴリズムの HDL IP コアを生成してから、IP コアを参照設計に統合します。SoC プラットフォーム向けのハードウェア ソフトウェア協調設計ワークフローを参照してください。

ターゲット ハードウェアで HDL IP コアのプロトタイプを迅速に作成してテストするために、ホスト インターフェイス スクリプトを生成できます。このスクリプトには、HDL Coder™ が AXI ドライバーを作成して HDL IP コアにアクセスするために使用する DUT 端子とインターフェイス マッピング情報が含まれます。

前提条件

ソフトウェア インターフェイスの生成

IP コアの生成ワークフローの実行時に、ホスト インターフェイス スクリプトとソフトウェア インターフェイス モデルを HDL ワークフロー アドバイザーの UI またはコマンド ラインで生成できます。

UI の [組み込みシステムの統合][ソフトウェア インターフェイスを生成] タスクから、[ホスト ターゲット インターフェイス] を選択し、[ホスト インターフェイス スクリプトの生成] チェック ボックスをオンにします。

IP コアの生成ワークフローを [ソフトウェア インターフェイスを生成] タスクまで実行し、[ホスト インターフェイス スクリプトの生成] チェック ボックスをオンにすると、2 つの MATLAB ファイルが生成されます。

  • gs_modelName_setup.m。AXI4 スレーブ インターフェイスと AXI4-Stream インターフェイスを追加するセットアップ スクリプトです。スクリプトには、端子名、方向、データ型、およびインターフェイス マッピング情報をもつ DUT 端子オブジェクトも含まれます。次に、このスクリプトは DUT 端子を対応するインターフェイスにマッピングします。

  • gs_modelName_interface.m。ターゲット オブジェクトを作成し、セットアップ スクリプト gs_modelName_setup.m をインスタンス化してからターゲット ハードウェアに接続します。次に、このスクリプトは読み取りコマンドと書き込みコマンドを生成された HDL IP コアに送信します。

スタンドアロン FPGA ボードをターゲットにしている場合、ソフトウェア インターフェイス モデルを生成できません。代わりに、AXI Manager ドライバーを使用して、ホスト インターフェイス モデル、ホスト インターフェイス スクリプト、またはその両方を生成して IP コアをテストできます。

  1. [ターゲットのリファレンス設計を設定] タスクで、[Insert JTAG AXI Manager (HDL Verifier required)][オン] に設定します。[ソフトウェア インターフェイスを生成] タスクに対してワークフローを実行します。

  2. [ソフトウェア インターフェイスを生成] タスクで、[ホスト インターフェイス スクリプトの生成] チェック ボックスをオンにしてこのタスクを実行します。

コマンド ラインで、HDL ワークフロー アドバイザーの設定をスクリプトにエクスポートしてから、これらのプロパティをワークフロー構成オブジェクトと共に使用します。このスクリプトは、ソフトウェア インターフェイス モデルとホスト インターフェイス スクリプトを生成することで、ソフトウェア インターフェイス タスクの実行を指定します。RunTaskGenerateSoftwareInterface を false に設定してこのタスクをスキップする場合、モデルとスクリプトは生成されません。Configure and Run IP Core Generation Workflow with a Scriptを参照してください。

% Export Workflow Configuration Script

% ...

%% Load the Model
load_system('hdlcoder_led_blinking');

%% Model HDL Parameters
% Set Model HDL parameters

% ...

hdlset_param('hdlcoder_led_blinking', 'SynthesisTool', 'Xilinx Vivado');
hdlset_param('hdlcoder_led_blinking', 'Workflow', 'IP Core Generation');

% ...

% Set Workflow tasks to run
hWC.RunTaskGenerateSoftwareInterface = true;
hWC.GenerateSoftwareInterfaceModel = true;
hWC.GenerateHostInterfaceScript = true;

% ...

%% Run the workflow
hdlcoder.runWorkflow('hdlcoder_led_blinking/led_counter', hWC);

ホスト インターフェイス スクリプト

HDL IP コア機能のラピッド プロトタイピングとテストを行う場合は、ホスト インターフェイス スクリプトを使用します。このスクリプトは、リファレンス設計とターゲット プラットフォーム インターフェイス テーブルの設定に基づいて生成される MATLAB ファイルです。これには、ターゲット ハードウェアへの接続と、MATLAB から生成された IP コアの読み取りと書き込みを可能にするコマンドが含まれます。スタンドアロン FPGA ボードの場合、AXI Manager を使用して HDL IP コア機能を検証するために、生成されたホスト インターフェイス スクリプトを使用します。

ホスト インターフェイス スクリプトには、接頭辞が gs_ で接尾辞が _interface の元のモデルと同じ名前が設定されます。このスクリプトは、ホスト インターフェイス スクリプトの生成を有効にすると生成されるセットアップ関数をインスタンス化します。たとえば、次のコードは、前に指定したリファレンス設計とターゲット プラットフォーム インターフェイス テーブルの設定が行われたモデル hdlcoder_sfir_fixed_stream.slx について生成されたセットアップ関数を示します。セットアップ関数には、対応するインターフェイスにマッピングされている生成された HDL IP コアの DUT 端子を制御するために HDL Coder が使用する、AXI4 スレーブ インターフェイスと AXI4-Stream インターフェイスのコマンドが含まれます。

function gs_hdlcoder_sfir_fixed_stream_setup(hFPGA)
%--------------------------------------------------------------------------
% Host Interface Script Setup
% 
% Generated with MATLAB 9.12 (R2022a) at 14:33:46 on 10/01/2022.
% This function was created for the IP Core generated from design 'hdlcoder_sfir_fixed_stream'.
% 
% Run this function on an "fpga" object to configure it with 
% the same interfaces as the generated IP core.
%--------------------------------------------------------------------------

%% AXI4-Lite
addAXI4SlaveInterface(hFPGA, ...
	"InterfaceID", "AXI4-Lite", ...
	"BaseAddress", 0xA0000000, ...
	"AddressRange", 0x10000);

hPort_h_in1 = hdlcoder.DUTPort("h_in1", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,16,10), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4-Lite", ...
	"IOInterfaceMapping", "0x100");

hPort_h_in2 = hdlcoder.DUTPort("h_in2", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,16,10), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4-Lite", ...
	"IOInterfaceMapping", "0x104");

hPort_h_in3 = hdlcoder.DUTPort("h_in3", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,16,10), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4-Lite", ...
	"IOInterfaceMapping", "0x108");

hPort_h_in4 = hdlcoder.DUTPort("h_in4", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,16,10), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4-Lite", ...
	"IOInterfaceMapping", "0x10C");

mapPort(hFPGA, [hPort_h_in1, hPort_h_in2, hPort_h_in3, hPort_h_in4]);

%% AXI4-Stream
addAXI4StreamInterface(hFPGA, ...
	"InterfaceID", "AXI4-Stream", ...
	"WriteEnable", true, ...
	"WriteFrameLength", 1024, ...
	"ReadEnable", true, ...
	"ReadFrameLength", 1024);

hPort_x_in_data = hdlcoder.DUTPort("x_in_data", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,16,10), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4-Stream");

hPort_y_out_data = hdlcoder.DUTPort("y_out_data", ...
	"Direction", "OUT", ...
	"DataType", numerictype(1,32,20), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4-Stream");

mapPort(hFPGA, [hPort_x_in_data, hPort_y_out_data]);

end

以下は、バスが AXI4 スレーブ インターフェイスにマッピングされているモデルのセットアップ関数の例です。スクリプトに示すように、バス要素は hdlcoder.DUTPort オブジェクトのサブ端子として表されます。

function gs_AXI4SlaveMultipleBus_setup(hFPGA)
%--------------------------------------------------------------------------
% Host Interface Script Setup
% 
% Generated with MATLAB 9.12 (R2022a) at 14:33:46 on 10/01/2022.
% This function was created for the IP Core generated from design 'AXI4SlaveMultipleBus'.
% 
% Run this function on an "fpga" object to configure it with the same interfaces as the generated IP core.
%--------------------------------------------------------------------------

%% AXI4
addAXI4SlaveInterface(hFPGA, ...
	"InterfaceID", "AXI4", ...
	"BaseAddress", 0x400D0000, ...
	"AddressRange", 0x10000);

hPort_bus1_in_scalar_in1 = hdlcoder.DUTPort("scalar_in1", ...
	"Direction", "IN", ...
	"DataType", numerictype('single'), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4", ...
	"IOInterfaceMapping", "0x100");

hPort_bus1_in_scalar_in2 = hdlcoder.DUTPort("scalar_in2", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,8,0), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4", ...
	"IOInterfaceMapping", "0x104");

hPort_bus1_in_scalar_in3 = hdlcoder.DUTPort("scalar_in3", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,32,0), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4", ...
	"IOInterfaceMapping", "0x108");

hPort_bus1_in_scalar_in4 = hdlcoder.DUTPort("scalar_in4", ...
	"Direction", "IN", ...
	"DataType", numerictype(1,16,10), ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4", ...
	"IOInterfaceMapping", "0x10C");

hPort_bus1_in_vector_in = hdlcoder.DUTPort("vector_in", ...
	"Direction", "IN", ...
	"DataType", numerictype(0,32,0), ...
	"Dimension", [1 2], ...
	"IOInterface", "AXI4", ...
	"IOInterfaceMapping", "0x110");

hPort_bus1_in = hdlcoder.DUTPort("bus1_in", ...
	"Direction", "IN", ...
	"DataType", "Bus", ...
	"Dimension", [1 1], ...
	"IOInterface", "AXI4", ...
	"SubPorts", [hPort_bus1_in_scalar_in1, hPort_bus1_in_scalar_in2, hPort_bus1_in_scalar_in3, hPort_bus1_in_scalar_in4, hPort_bus1_in_vector_in]);

ホスト インターフェイス スクリプトは、ターゲットに接続して読み取りまたは書き込みコマンドを送信するために、このセットアップ関数をインスタンス化します。コメントを解除し、元のモデルの DUT への入力を使用して意味のあるデータを送信できます。ハードウェアとのインターフェイスをとってから、スクリプトは fpga オブジェクトに関連付けられているハードウェア リソースとの接続を切断します。

%--------------------------------------------------------------------------
% Host Interface Script
% 
% Generated with MATLAB 9.12 (R2022a) at 14:33:46 on 10/01/2022.
% This script was created for the IP Core generated from design 'hdlcoder_sfir_fixed_stream'.
% 
% Use this script to access DUT ports in the design mapped to compatible IP core interfaces.
% You can write to input ports in the design and read from output ports directly from MATLAB.
%
% To write to input ports, use the "writePort" command and specify port name and input data. 
% The input data will be cast to the DUT port's data type before writing. 
%
% To read from output ports, use the "readPort" command and specify the port name. 
% The output data will be returned with the same data type as the DUT port.
%
% Use the "release" command to release MATLAB's control of the hardware resources.
%--------------------------------------------------------------------------

%% Create fpga object
hFPGA = fpga("Xilinx");

%% Setup fpga object
% This function configures "fpga" object with same interfaces as the generated IP core
gs_hdlcoder_sfir_fixed_stream_setup(hFPGA);

%% Write/read DUT ports
% Uncomment the following lines to write/read DUT ports in the generated IP Core.
% Update the example data in the write commands with meaningful data to write to the DUT.
%% AXI4-Lite
writePort(hFPGA, "h_in1", zeros([1 1]));
writePort(hFPGA, "h_in2", zeros([1 1]));
writePort(hFPGA, "h_in3", zeros([1 1]));
writePort(hFPGA, "h_in4", zeros([1 1]));

%% AXI4-Stream
writePort(hFPGA, "x_in_data", zeros([1 1024]));
data_y_out_data = readPort(hFPGA, "y_out_data");

%% Release hardware resources
release(hFPGA)

Prototype FPGA Design on Hardware with Live Data by Using MATLAB Commandsを参照してください。

以下は、バス データ型が AXI4 スレーブ インターフェイスにマッピングされているモデルのデータの読み取りと書き込みを行うホスト インターフェイス スクリプトの例です。

バス端子に書き込むには、次のいずれかを行います。

  • bus1_in.scalar_in1 などの完全なサブ端子名を指定して個々のサブ端子に書き込みます。

  • bus1_in などの最上位の端子名を指定してバス全体に書き込みます。書き込むデータは、フィールド名がサブ端子名と一致する struct として渡します。すべてのサブ端子名が struct に含まれる必要はありません。対応する struct フィールドがないサブ端子は、端子への書き込み時にスキップされます。

バス端子から読み取るには、次のいずれかを行います。

  • bus1_out.scalar.in1 などの完全なサブ端子名を指定して個々のサブ端子を読み取ります。

  • bus1_out などの最上位の端子名を指定してバス端子全体を読み取ります。

%--------------------------------------------------------------------------
% Host Interface Script
% 
% Generated with MATLAB 9.12 (R2022a) at 14:33:46 on 10/01/2022.
% This script was created for the IP Core generated from design 'AXI4SlaveMultipleBus'.
% 
% Use this script to access DUT ports in the design that were mapped to compatible IP core interfaces.
% You can write to input ports in the design and read from output ports directly from MATLAB.
% To write to input ports, use the "writePort" command and specify the port name and input data. The input data will be cast to the DUT port's data type before writing.
% To read from output ports, use the "readPort" command and specify the port name. The output data will be returned with the same data type as the DUT port.
% Use the "release" command to release MATLAB's control of the hardware resources.
%--------------------------------------------------------------------------

%% Create fpga object
hFPGA = fpga("Xilinx");

%% Setup fpga object
% This function configures the "fpga" object with the same interfaces as the generated IP core
gs_AXI4SlaveMultipleBus_setup(hFPGA);

%% Write/read DUT ports
% Uncomment the following lines to write/read DUT ports in the generated IP Core.
% Update the example data in the write commands with meaningful data to write to the DUT.
%% AXI4

% There are two ways to write a DUT bus ports
% (1). Prepare a struct value and write it to the whole bus port.
writePort(hFPGA, "bus1_in", struct());
% (2). Prepare a value for each member of the bus and write it individually.
writePort(hFPGA, "bus1_in.scalar_in1", zeros([1 1]));
writePort(hFPGA, "bus1_in.scalar_in2", zeros([1 1]));
writePort(hFPGA, "bus1_in.scalar_in3", zeros([1 1]));
writePort(hFPGA, "bus1_in.scalar_in4", zeros([1 1]));
writePort(hFPGA, "bus1_in.vector_in", zeros([1 2]));

参考

オブジェクト

関数

関連するトピック