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

AXI の基礎 4 - AXI4 マスター インターフェイスに AXI VIP をプロトコル チェッカーとして使用

Xilinx Employee
Xilinx Employee
2 0 708

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

 

概要


ブログ記事 AXI 基礎 2 では、ザイリンクス Verification IP (AXI VIP) AXI プロトコル チェッカーとして使用可能であると紹介しました。このブログ記事では、AXI4 (Full) マスター インターフェイスで AXI VIP を使用して検証とエラー検出を実行する方法を紹介します。


AXI VIP
AXI4 プロトコル チェッカーとして使用 (チュートリアル)

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

    これでマスター AXI4 インターフェイスを持つカスタム IP を含むブロック デザイン (BD) を使用した Vivado プロジェクトが作成されます。
    AXI4_1.png

     

    これで AXI VIP をカスタム IP のマスター インターフェイスに接続してインターフェイスを検証できます。
  5. BD を右クリックして [Add IP] をクリックし、AXI Verification IP (AXI VIP) を追加します。
  6. AXI VIP をダブルクリックして、IP 設定 GUI を開きます。
  7. インターフェイス モード ([INTERFACE MODE]) [SLAVE] に変更して [OK] をクリックします。

    AXI4_2.png

     

 

  1. AXI VIP の S_AXI 入力インターフェイスをカスタム IP m00_axi 出力インターフェイスに、AXI VIP aclk aresetn 入力ポートを BD の該当する入力ポートにそれぞれ接続します。
    AXI4_3.png

     

  2. [Address Editor] ウィンドウを開き、[Auto Assign Address] をクリックします。AXI VIP に自動的に割り当てられたアドレスが 0x44A0_0000 であることを確認します。このアドレス以外の場合は、手動でこのアドレスを割り当てます。

 

  1. BD を検証します。エラーやクリティカル警告メッセージは表示されないはずです。
  2. BD を保存します。
  3. [Tcl Console] ウィンドウに次のコマンドを入力し、AXI VIP インスタンスの完全コンポーネント名を検索します。

get_ips *vip*

 

完全名は、デフォルトで design_1_axi_vip_0_0 のはずです。

  1. [Sources] ウィンドウでテストベンチ ファイル AXI_tb をダブルクリックしてテキスト エディターで開きます。
    AXI4_4.png

     


    AXI_tb
    テストベンチ ファイルには、カスタム IP を実行するのに必要なコードが既に含まれています。AXI VIP には必要なコードを追加する必要があります。ブログ記事 AXI 基礎 3 同様、『AXI Verification IP 製品ガイド』の「Useful Coding Guidelines and Examples (便利なコーディングのガイドラインおよび例)(PG267、v1.1、2019 年 10 月 30 日、46 ページ) に従います。 

    まず、2 つの必要パッケージ axi_vip_pkg と <component_name>_pkg をインポートします。コンポーネント名は、手順 12 get_ips で返された値です。

 

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

 

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

import axi_vip_pkg::*;

import design_1_axi_vip_0_0_pkg::*;


次に、VIP のエージェント タイプにスレーブを宣言します。

  1. 91 に次の行を追加します。

// Declare the agent

design_1_axi_vip_0_0_slv_mem_t slv_agent;

 

次にスレーブ エージェントを作成する必要があります。

  1. 96 に次の行を追加します。

//Create an agent

slv_agent = new("master vip agent",UUT.design_1_i.axi_vip_0.inst.IF);

 

  1. このチュートリアルでは、AXI VIP でエラーがコンソールに出力されるようにする必要があるので、次の行 ( 99 付近) で冗長モードをイネーブルにします。

// set print out verbosity level

slv_agent.set_verbosity(400);

 

  1. 最後に、次の行を使用してスレーブ エージェントを開始できます。

//Start the agent

slv_agent.start_slave();

 

  1. テスト ベンチ ファイルを保存して、シミュレーションを起動し、200 us 間実行します。
  2. [Tcl Console] ウィンドウでキーワード「Fatal」を検索します。次の行が見つかるはずです。

Fatal: AXI4_ERRM_AWADDR_BOUNDARY: A burst must not cross a 4kbyte boundary. Spec: section A3.4.1.

 

AXI4_5.png



このエラーは、A3.4.1 セクションを見ると理解できます。エラー メッセージにも含まれているように、AMBA® AXI™ および ACE™ プロトコル仕様は、Arm ウェブサイト (リンク) から入手可能です。

この仕様には、次の文が含まれています。

“A burst must not cross a 4KB address boundary. (バースト モードは 4 KB アドレスの境界をまたがないようにする必要があります。)

  1.  シミュレーションを閉じて、カスタム IP axi_master_0 をダブルクリックして、GUI を開きます。
    AXI4_6.png

     

    アドレス 0x44A00FC8 で開始する 16 個の 32 ビット ワードがバースト送信される設定になっていることがわかります。この場合、書き込みバーストがアドレス 0x44A00FC8 で開始してアドレス 0x44A01004 で終了します。4 KB の境界はアドレス 0x44A01000 (4K = 4*1024 = 4096 = 0x1000) のため、バーストがこの境界をまたいでしまうため、エラーが発生します。
  2. [00 Axi Target Slave Base Address] の値を 0x44A00000 に変更してから [OK] をクリックし、IP 設定 GUI を閉じます。BD を保存します。
  3. シミュレーションを 200 us 間実行します。
  4. キーワード「FATAL」を再び検索します。エラー メッセージが変更され、最初の問題が解決したことがわかります。
    次のメッセージが表示されます。

Fatal: AXI4_ERRM_WDATA_STABLE: WDATA must remain stable when WVALID is asserted and WREADY low. Spec: section A3.2.1.

 

  1. 波形ウィンドウで、m00_axi インターフェイスの書き込みデータ チャネルを展開します。tready 信号が low のときに wvalid が変化するのがわかります。これは、AXI の仕様に準拠していません。

    AXI4_7.png

     

 

  1. シミュレーションを閉じて、[Sources] ウィンドウでブロック デザインの AXI_Master_v1_0_M00_AXI.v ファイルを開きます。

    AXI4_8.png

     

 

  1. 506/518 付近で次の個所を変更します。この変更により tready 信号が low のときに wdata 信号が変化しなくなります。

/* Write Data Generator                                                           

 Data pattern is only a simple incrementing count from 0 for each burst  */       

  always @(posedge M_AXI_ACLK)                                                    

  begin                                                                           

    if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1)                                                        

      axi_wdata <= 'b1;                                                           

    //else if (wnext && axi_wlast)                                                

    //  axi_wdata <= 'b0;                                                          

    else if (wnext)                                                               

      axi_wdata <= axi_wdata + 1;                                                 

    else                                                                           

      axi_wdata <= axi_wdata;                                                      

end 

 

  1. ファイルを保存します。[Refreshed Changed Modules] が表示されるので、これをクリックします。

    AXI4_9.png

     

 

  1. シミュレーションを 200 us 間実行します。

シミュレーションでエラーは発生しないはずです。波形ウィンドウを確認しても、16 個の書き込みバースト トランザクションと 16 個の読み込みバースト トランザクションが正しく発生していることが確認できます。これは、2 つ目の問題が修正されたことを意味します。