cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

AXI の基礎 3 - AXI VIP を使用したマスター AXI4-Lite のシミュレーション

Xilinx Employee
Xilinx Employee
3 0 1,171

本ブログは英語版のAXI-Basics Blogを翻訳したものです。

 

概要

AXI の基礎に関する前のブログ記事の「AXI の基礎 1」では AXI4 の仕様について説明し、「AXI 基礎 2」では AXI Verification IP (AXI VIP) の概要を解説しました。

このブログ記事では、AXI4-Lite インターフェイスをシミュレーションするために AXI VIP Vivado プロジェクトに追加する方法をまず示します。次に、シミュレーション波形ウィンドウで AXI4-Lite トランザクションに使用する信号について説明します。

 

AXI4-Lite マスターとしての AXI VIP の使用 (チュートリアル)

  1. このブログ記事に添付されているデザイン ファイルをダウンロードします。
  2. Vivado 2019.2 を開きます。
  3. [Tcl Console] ウィンドウで、cd コマンド (cd AXI_Basics_3) を使用して解凍ディレクトリに移動します。
  4. [Tcl Console] ウィンドウで、source コマンド (source ./create_proj.tcl) を使用して tcl スクリプトを実行します。

    これにより、AXI GPIO IP を含むブロック デザインを使用する Vivado プロジェクトが作成されます。この AXI GPIO IP には、AXI4-Lite トランザクションを使用してオン/オフにするオンボード LED への接続をシミュレーションするチャネル 1 に接続された 1 つの出力、およびステートを読み出すオンボード スイッチへの接続をシミュレーションするチャネル 2 に接続された 1 つの入力があります。
    AXI3_1.png

     

 

  1. デザインに AXI Verification IP (AXI VIP) を追加します。
  2. AXI VIP をダブルクリックして設定 GUI を開き、次のパラメーターを変更します。
    1. [INTERFACE MODE]: MASTER
    2. [PROTOCOL] (MANUAL): AXI4LITE

      AXI3_2.png

       

 

  1. AXI VIP のマスター AXI4-Lite インターフェイス (M_AXI) AXI GPIO IP のスレーブ AXI4-Lite (S_AXI) に、AXI VIP aclk および aresetn ポートをブロック デザインの入力にそれぞれ接続します。

    AXI3_3.png

     

  2. [Address Editor] ウィンドウを開き ([Window] [Address Editor])[Auto Assign Address] アイコンをクリックします。
    AXI3_4.png

     

 

  1. アドレスが 0x4000_0000 に設定されていることを確認します。
    AXI3_5.png

     



    注記: AXI GPIO の S_AXI インターフェイスをチェックすると、9 アドレス ビットのみが AXI VIP に接続されているため、ここではアドレスの上位の部分は特に関係ありません。
  2. ブロック デザインを検証します。エラーまたはクリティカル警告メッセージは表示されないはずです。
    ブロック デザインを保存します。

    次に、AXI VIP を宣言および制御するために、テストベンチ ファイルをアップデートする必要があります。
    これを実行するには、『AXI Verification IP 製品ガイド』の「Useful Coding Guidelines and Examples (便利なコーディングのガイドラインおよび例)(PG267、v1.1、2019 年 10 月 30 日、46 ページ) に従います。
  3. [Sources] ウィンドウでテストベンチ ファイルの AXI_GPIO_tb.sv を開きます。
    AXI3_6.png

     



    このテストベンチ ファイルには、クロック、リセットなどの一部の信号の制御が既に含まれており、LED のステータスをコンソールに出力するためのプロセスがあります。

 

 always @(posedge led_1)

begin

     $display("led 1 ON");

end

always @(negedge led_1)

begin

     $display("led 1 OFF");

end


Useful Coding Guidelines and Examples (便利なコーディングのガイドラインおよび例)」の記述によると、最初のステップは SystemVerilog テストベンチでのモジュールの作成ですが、使用するテストベンチにモジュールが既に含まれています。

2
つ目のステップは、2 つの必須パッケージであるaxi_vip_pkg および <component_name>_pkg のインポートです。

注記: VIP インスタンスの <component_name> を見つけるには、次の Tcl コマンドを使用して AXI VIP インスタンスに対応する出力を検出します。
添付のテストベンチでは、AXI コンポーネント名が design_1_axi_vip_0_0 (BD に追加された最初の AXI VIP に対するデフォルト) であると想定されます。

get_ips *vip*

  1. 58 付近に次の行を追加します。

//Step 2 - Import two required packages: axi_vip_pkg and <component_name>_pkg.

import axi_vip_pkg::*;

import AXI_GPIO_Sim_axi_vip_0_0_pkg::*;

 

ステップ 3 は、マスター VIP タイプのエージェントの宣言です。

  1. 102 付近に次の行を追加します。

// Step 3 - Declare the agent for the master VIP

AXI_GPIO_Sim_axi_vip_0_0_mst_t      master_agent;

 

ステップ 4 および 5 は、新しいエージェントの作成と開始です。

  1. 107 付近に次の行を追加します。

 

// Step 4 - Create a new agent

master_agent = new("master vip agent",UUT.AXI_GPIO_Sim_i.axi_vip_0.inst.IF);

 

// Step 5 - Start the agent

master_agent.start_master();


これで、トランザクションの送信を開始する準備ができました。

AXI4-Lite
トランザクションの送信は非常に簡単です。書き込みトランザクションに対しては API AXI4LITE_WRITE_BURST(addr,prot,data,resp) を、読み出しトランザクションに対しては AXI4LITE_READ_BURST(addr,prot,data,resp) を使用するだけです。

注記: AXI VIP API はすべて、japan.xilinx.com こちらからダウンロードできる ZIP ファイル内で説明されています。

このチュートリアルでは、AXI GPIO チャネル 1 に接続されている LED_1 をトグルし、AXI GPIO チャネル 2 に接続されている SWITCH_1 のステートを読み出します。

AXI GPIO 製品ガイド』 (PG144) の表 2-4 AXI GPIO IP のレジスタ マップを確認すると、アドレス 0x0 で書き込み、アドレス 0x8 で読み出す必要があります。

AXI3_7.png



まず、書き込みから開始して、LED_1 のステートをトグルしてみます。

 

  1. 次のコードを追加して 0x1 AXI GPIO レジスタ 0x0 に書き込むと、LED がオンになるはずです。

//Send 0x1 to the AXI GPIO Data register 1

#500ns

addr = 0;

data = 1;

master_agent.AXI4LITE_WRITE_BURST(base_addr + addr,0,data,resp);

 

  1. 次のコードを追加して 0x0 AXI GPIO レジスタ 0x0 に書き込むと、LED がオフになるはずです。

//Send 0x0 to the AXI GPIO Data register 1

#200ns

addr = 0;

data = 0;

master_agent.AXI4LITE_WRITE_BURST(base_addr + addr,0,data,resp);


次に、スイッチの位置の各変更の後で読み出しを実行し、スイッチのステートをコンソールに表示します。

  1. 読み出しトランザクションに対応する次のコードを追加します。

// Switch in OFF position

switch_1 = 0;

// Read the AXI GPIO Data register 2

#200ns

addr = 8;

master_agent.AXI4LITE_READ_BURST(base_addr + addr,0,data,resp);

switch_state = data&1'h1;

if(switch_state == 0)

$display("switch 1 OFF");

else

$display("switch 1 ON");

    

// Switch in ON position

switch_1 = 1;

// Read the AXI GPIO Data register 2

#200ns

addr = 8;

master_agent.AXI4LITE_READ_BURST(base_addr + addr,0,data,resp);

switch_state = data&1'h1;

if(switch_state == 0)

    $display("switch 1 OFF");

else

$display("switch 1 ON");

 

 

  1. シミュレーションを起動して 3 us 間実行します。[Tcl Console] ウィンドウに、LED のトグルおよびスイッチのステートが表示されるはずです。
    AXI3_8.png

     



    これで、AXI4-Lite インターフェイスのトランザクションを解析できます。
  2. [Scope] ウィンドウで、[AXI_GPIO_tb] [UUT] [AXI_GPIO_Sim_i] の下にある [axi_vip_0] を選択します。
    AXI3_9.png

     

 

  1. [Objects] ウィンドウで、[M_AXI] (プロトコル インスタンス) を右クリックして [Add to Wave Window] をクリックします。
    AXI3_10.png

     

  2. シミュレーションを再開して 3 us 間実行します。

    AXI4-Lite
    インターフェイスには、書き込みトランザクション 2 つの後に読み出しトランザクションが 2 つ、合計 4 つのトランザクションが表示されます。

    AXI3_11.png

  3. [M_AXI] を展開し、その他のチャネルを表示します。

    これで、書き込みトランザクションの異なるステップを確認できます。
    まず、書き込みアドレス チャネル (AWREADY および AWVALID) READY および VALID 信号の両方が High の場合、アドレスがマスターからスレーブに送信されます。

    AXI3_12.png

     


    次に、書き込みチャネル (WREADY および WVALID) READY および VALID 信号の両方が High の場合、データがマスターからスレーブに送信されます。

    注記: バーストは AXI4-Lite インターフェイスでサポートされていないため、アドレスごとに 1 つのデータのみが送信されます。
    AXI3_13.png

     



    最後に、書き込み応答チャネルで書き込み応答がスレーブにより送信されると (書き込みが成功したかどうかを通知するため)、書き込みトランザクションが完了します。書き込み応答チャネル (BREADY および BVALID) READY および VALID 信号の両方が High の場合、応答がスレーブからマスターに送信されます。
    AXI3_14.png

     


    読み出しトランザクションに対しても同じ解析を実行できます。
    読み出し応答チャネル (ARREADY および ARVALID) READY および VALID 信号の両方が High の場合、データがマスターからスレーブに送信されます。

AXI3_15.png


次に、読み出しチャネル (RREADY および RVALID) READY および VALID 信号の両方が High の場合、データがスレーブからマスターに送信されます。

AXI3_16.png

 

 

注記: 読み出しトランザクション中、読み出しが成功したかどうかを示す応答もスレーブによって送信されます。

この応答は、データと同時に読み出しチャネルで送信されます。