0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AXIバス設計ガイド 第10回 AXI4仕様のシンプルシングルポートRAM

Last updated at Posted at 2025-08-24

目次


1. はじめに

このドキュメントはAIに読み込ませてコードを自動生成することを目標としています。

本記事では、AXI4仕様に準拠したシンプルシングルポートRAMの実装について説明します。第6回で学んだリードライトの優先制御の基本概念を応用し、AXI4仕様の「シンプルシングルポートRAM」の実装を扱います。

シンプルシングルポートRAMは、1つのクロックポートと1つのアクセスポートを持つメモリデバイスです。リードとライトは時分割で実行され、同時アクセスは制御が必要です。

シンプルシングルポートRAMの特徴:

  • 単一アクセスポート: リードポートとライトポートが共有
  • 時分割アクセス: リード・ライトが順次実行される
  • アドレス競合制御: 同一アドレスへの同時アクセス制御が必要
  • AXI4準拠: AXI4プロトコルの要件を満たすインターフェース
  • パイプライン対応: バースト転送とパイプライン処理に対応
  • 統合ステート管理: 第6回の5状態FSMによる優先度制御と調停

AXI4インターフェースの特徴を整理します:

  • リードチャネル: 読み出しアドレスとバースト情報を伝達
  • ライトチャネル: 書き込みアドレス、データ、バースト情報を伝達
  • レスポンスチャネル: 書き込み完了の応答を伝達
  • バースト転送: 連続したアドレスへの効率的なアクセス
  • パイプライン処理: 複数のトランザクションの並列処理

シンプルシングルポートRAMでは、リード・ライトの同時実行ができないため、第6回で実装した統合ステート管理による優先度制御と調停が必要になります。これにより、リードとライトの処理順序が制御され、データの整合性が保たれます。

シンプルシングルポートRAMの利点:

  • 効率的なリソース利用: 単一のメモリでリード・ライト両方を処理
  • 統合制御: 第6回の5状態FSMによる明確な優先度制御
  • AXI4準拠: 標準プロトコルによる互換性の確保
  • パイプライン対応: バースト転送とパイプライン処理の最適化
  • 競合制御: 同一アドレスアクセス時の適切な制御
  • 拡張性: 様々なメモリサイズとデータ幅への対応

2. 仕様

2.1 パイプライン構成

シンプルシングルポートRAMのパイプライン構成は、第6回の統合ステート管理によるリードライトパイプラインと全く同じです。ReadとWriteのパイプラインがT1ステージで合流し、統合されたステート管理により優先度制御と調停を行います。

リード側パイプライン構成

リード側は3段構成のパイプラインで、ペイロード増幅を行う構成です:

axi_ar_Payload -> [T0] -> [T1] -> [T2] -> axi_r_Payload
                   ^       ^       ^
                   |       |       |
axi_ar_Ready   <-[AND]<----+-------+-- <- axi_r_Ready
                   ^
                   |
               [T0_State_Ready]

リード側パイプラインの詳細:

段階 機能 説明 ペイロード増幅 レイテンシ
T0 アドレスカウンタとバースト制御 バースト転送の制御とアドレス生成 1→N個に増加 1クロック
T1 ステートマシン制御 ReadとWriteの優先度制御 増幅なし(N個維持) 1クロック
T2 メモリアクセス メモリからのデータ読み出し 増幅なし(N個維持) 1クロック

リード側の特徴:

  • T0ステージ: バースト制御とアドレス生成、上流に対するReady制御
  • T1ステージ: ステートマシン制御(Read/Write優先度制御)
  • T2ステージ: メモリアクセス(レイテンシ1)
  • 総レイテンシ: 3クロック(T0: 1 + T1: 1 + T2: 1)

ライト側パイプライン構成

ライト側は5段構成のパイプラインで、2つのペイロードが合流する構成です。T0DとT0Aは同時並列に動作します:

axi_w_Payload_D=> [T0D]=======++
                 ^          ||
                 |          ||
axi_w_Ready   <-[AND]---+   ||
                 ^      |   ||
                 |      |   ||
       [T0D_Ready]      |   ||
                        |   ||
axi_aw_Payload_A=> [T0A] ===> [T1] => [T2] => [T3] => axi_b_Payload
                 ^      |   ^       ^       ^   
                 |      |   |       |       |   
axi_aw_Ready   <-[AND]<--+---+-------+-------+--- <- axi_b_Ready
                 ^ ^                     
                 | |        
       [T0A_Ready] |        
              [T0A_M_Ready]

ライト側パイプラインの詳細:

段階 機能 説明 ペイロード増幅 レイテンシ
T0A/T0D アドレス・データ並列処理 アドレスとデータの同時並列処理 1→N個に増加 1クロック
T1 ステートマシン制御 ReadとWriteの優先度制御 増幅なし(N個維持) 1クロック
T2 メモリアクセス メモリへの書き込み 増幅なし(N個維持) 1クロック
T3 レスポンス生成 書き込み完了の応答生成 増幅なし(N個維持) 1クロック

ライト側の特徴:

  • T0A/T0Dステージ: アドレスとデータの同時並列処理
  • T1ステージ: ステートマシン制御(Read/Write優先度制御)
  • T2ステージ: メモリアクセス(レイテンシ1)
  • T3ステージ: レスポンス生成(追加レイテンシ1)
  • 総レイテンシ: 5クロック(T0A/T0D: 1 + T1: 1 + T2: 1 + T3: 1)

統合制御の特徴

T1ステージ統合:

  • Read・Write両方のパイプラインがT1ステージで合流
  • 5つのステート(STATE_IDLE, STATE_R_NLAST, STATE_R_LAST, STATE_W_NLAST, STATE_W_LAST)による統合制御
  • 書き込み優先の優先度制御(アイドル・リード状態では書き込み優先、ライト状態ではリード優先)

Ready制御:

  • 各ステージの動作はaxi_r_ready/axi_b_readyがHの時のみ実行
  • パイプライン全体がReady信号で統一的に制御
  • 上流へのReady信号は非同期ANDで生成

メモリアクセス制御:

  • シングルポートRAMの制約により、Read・Writeは排他的に実行
  • T1ステートに基づくメモリアクセスのイネーブル制御
  • メモリアクセス競合検出機能(シミュレーション専用)

2.2 ポート定義

シンプルシングルポートRAMのポート定義は以下の通りです:

module axi_simple_single_port_ram #(
    parameter MEMORY_SIZE_BYTES = 33554432,  // 32MB
    parameter AXI_DATA_WIDTH = 32,           // 32bit
    parameter AXI_ID_WIDTH = 8,              // 8bit ID
    parameter AXI_ADDR_WIDTH = $clog2(MEMORY_SIZE_BYTES)
) (
    input  logic                        aclk,           // Clock
    input  logic                        aresetn,        // Reset (active low)
    
    // Read Address Channel
    input  logic [AXI_ID_WIDTH-1:0]    s_axi_arid,     // Read address ID
    input  logic [AXI_ADDR_WIDTH-1:0]  s_axi_araddr,   // Read address
    input  logic [7:0]                 s_axi_arlen,    // Burst length
    input  logic [2:0]                 s_axi_arsize,   // Burst size
    input  logic [1:0]                 s_axi_arburst,  // Burst type
    input  logic                       s_axi_arvalid,  // Read address valid
    output logic                       s_axi_arready,  // Read address ready
    
    // Read Data Channel
    output logic [AXI_ID_WIDTH-1:0]    s_axi_rid,      // Read ID
    output logic [AXI_DATA_WIDTH-1:0]  s_axi_rdata,    // Read data
    output logic [1:0]                 s_axi_rresp,    // Read response
    output logic                       s_axi_rlast,    // Read last
    output logic                       s_axi_rvalid,   // Read valid
    input  logic                       s_axi_rready,   // Read ready
    
    // Write Address Channel
    input  logic [AXI_ID_WIDTH-1:0]    s_axi_awid,     // Write address ID
    input  logic [AXI_ADDR_WIDTH-1:0]  s_axi_awaddr,   // Write address
    input  logic [7:0]                 s_axi_awlen,    // Burst length
    input  logic [2:0]                 s_axi_awsize,   // Burst size
    input  logic [1:0]                 s_axi_awburst,  // Burst type
    input  logic                       s_axi_awvalid,  // Write address valid
    output logic                       s_axi_awready,   // Write address ready
    
    // Write Data Channel
    input  logic [AXI_DATA_WIDTH-1:0]  s_axi_wdata,    // Write data
    input  logic [AXI_DATA_WIDTH/8-1:0] s_axi_wstrb,   // Write strobe
    input  logic                       s_axi_wlast,    // Write last
    input  logic                       s_axi_wvalid,   // Write valid
    output logic                       s_axi_wready,   // Write ready
    
    // Write Response Channel
    output logic [AXI_ID_WIDTH-1:0]    s_axi_bid,      // Write response ID
    output logic [1:0]                 s_axi_bresp,    // Write response
    output logic                       s_axi_bvalid,   // Write response valid
    input  logic                       s_axi_bready    // Write response ready
);

2.3 バースト制御

AXI4仕様で定義された3種類のバーストタイプをサポートします:

  • FIXED (2'b00): 固定アドレスバースト。同一アドレスへの連続アクセスで、データの更新やFIFO操作に使用
    • アドレス固定: バースト中は開始アドレスが固定され、アドレスは変化しない
    • 最大バースト長: 256ビート(axi_ar_len/axi_aw_len = 8'hFF)
    • 用途: 同一レジスタへの連続書き込み、FIFOの読み出し、カウンタの更新
  • INCR (2'b01): インクリメントバースト。アドレスが連続的に増加する最も一般的なバースト転送
    • 最大バースト長: 256ビート(axi_ar_len/axi_aw_len = 8'hFF)
    • アドレス増分: データサイズ(axi_aw_size/axi_ar_size)に基づいて自動計算
  • WRAP (2'b10): ラップバースト。指定された境界でアドレスがラップする循環的なバースト転送
    • ラップ境界: バースト長 × データサイズで計算される境界
    • 境界計算: boundary = start_addr + (burst_length + 1) × data_size
    • ラップ動作: 境界に達すると、アドレスが開始アドレス付近に戻る

バースト制御の実装:

  • T0ステージ: r_t0_count/w_t0a_countによるバーストカウンタ制御
  • アイドルフラグ: r_t0_idle/w_t0a_idleによるバースト状態管理
  • アドレス更新: バーストタイプに応じたアドレス計算(r_t0_addr/w_t0a_addr

2.4 ID

AXI4のID信号は、複数のトランザクションを識別するために使用されます。IDはペイロードと一緒にパイプラインを流れ、各チャネル間でトランザクションの対応関係を維持します:

リードチャネル:

  • axi_ar_id: リードアドレスチャネルのトランザクションID
  • r_t0_id: T0ステージでのID保持
  • r_t1_id: T1ステージでのID転送
  • r_t2_id: T2ステージでのID出力(axi_r_id

ライトチャネル:

  • axi_aw_id: ライトアドレスチャネルのトランザクションID
  • w_t0a_id: T0AステージでのID保持
  • w_t1_id: T1ステージでのID転送
  • w_t2_id: T2ステージでのID保持
  • w_t3_id: T3ステージでのID転送(axi_b_id

ID転送の制御:

  • T1ステージ: ステートマシンの状態に基づくID転送制御
  • T2/T3ステージ: メモリアクセス完了後のID出力制御

2.5 シングルポートRAM

FPGAの論理合成ツールで推定可能なシンプルシングルポートRAMのサンプル記述を示します。この記述により、論理合成ツールが適切なメモリブロック(ブロックRAM、エンベデッドRAM等)を自動的に推定・配置します。

メモリアクセス制御:

  • read_enable (re): リード有効信号。レディネゲート時に現在の状態をホールドするための信号として使用される
  • write_enable (we): ライト有効信号。レディネゲート時に現在の状態をホールドするための信号として使用される
  • 排他アクセス: reとweは同時にアサートされず、シングルポートRAMの制約により排他的に制御される

レイテンシ:

  • レイテンシ = 1: メモリアクセス後1クロックでデータ出力(メモリのみ、追加レジスタなし)

Verilog記述例:

シングルポートRAMのコード: single_port_ram.v

3. コード

3.1 DUTのコード

シンプルシングルポートRAMのDUTのコードを示します。

以下はAIに対する実装の指示です。

以下の方針で実装してください。
burst_rw_pipeline.vをAXI4対応にする。ステートの制御は変更なくそのまま流用する。
T2ステージでシングルポートメモリをアクセスするように修正する。
T0ステージのバースト制御は、axi_simple_dual_port_ram.vのT1ステージを流用する。

DUTのコード: axi_simple_single_port_ram.v

3.2 テストベンチのコード

テストベンチは第9回で実装したコードを流用します。

  • テストベンチのコード:

注:このコードは第11回の元になったコードです。現在はエラーで終了します。動作するコードは第11回のコードとなります。

axi_simple_single_port_ram_tb.sv

4. まとめ

本記事では、AXI4仕様に準拠したシンプルシングルポートRAMの実装について説明しました。

主要な特徴:

  • 統合パイプライン: 第6回の5状態FSMによる優先度制御と調停
  • シングルポート制約: Read・Writeの排他制御によるメモリアクセス管理
  • AXI4準拠: 標準プロトコルの要件を満たすインターフェース
  • パイプライン最適化: 3段Read、5段Writeの効率的な構成

実装のポイント:

  • ステート管理: T1ステージでの統合されたステート制御
  • 競合制御: メモリアクセスの排他制御と競合検出
  • バースト対応: 3種類のバーストタイプ(FIXED、INCR、WRAP)のサポート
  • ID管理: トランザクション識別のためのID転送制御

シンプルシングルポートRAMは、リソース効率性とAXI4準拠性を両立させた実用的なメモリデバイスとして、様々なシステムに適用できます。

ライセンス

このドキュメントはApache License, Version 2.0の下で公開されています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?