リスト15(b)

### 提案モジュール一覧
1. **GMII_MAC_TxRx**: Ethernetフレーム送受信を処理し、GMIIでPHYチップと接続。
2. **Frame_Buffer**: Ethernetフレームの送受信バッファリング(FIFOベース)。
3. **IP_Processor**: IPv4パケットの生成/解析、ARPおよびICMP(Ping)処理。
4. **TCP_Engine**: TCPセグメントの生成/解析、接続管理、再送信制御。
5. **HTTP_Server**: HTTPリクエスト解析、静的コンテンツ配信(GET/POST対応)。
6. **Content_Storage**: 静的コンテンツ(HTML/JSON)を格納するBRAMインターフェース。
7. **AXI_Interconnect**: モジュール間をAXI4-Stream/AXI4-Liteで接続。
8. **Clock_Reset_Manager**: クロックドメイン管理とリセット同期。

### モジュール間接続イメージ
各モジュールはAXIバスで接続され、データフローは以下のように進行:
- **GMII_MAC_TxRx** ↔ **Frame_Buffer** ↔ **IP_Processor** ↔ **TCP_Engine** ↔ **HTTP_Server** ↔ **Content_Storage**
- **AXI_Interconnect**が各モジュールのデータ/制御信号を仲介。
- **Clock_Reset_Manager**がクロック(例: 125MHz for GMII, 100-200MHz for System)とリセットを提供。

以下に各モジュールの詳細を解説します。

---

### 1. GMII_MAC_TxRx
   - **役割**: Ethernetフレームの送受信を処理し、GMIIインターフェースで外部PHYチップ(10/100/1000Mbps対応)と接続。
   - **機能**:
     - **送信**: 上位層(IP_Processor)からのペイロードをEthernetフレームに変換(プリアンブル、SFD、MACアドレス、Type、FCS付加)。
     - **受信**: GMIIからのフレームを解析(FCS検証、プリアンブル除去)。
     - **GMII制御**: TX(tx_en, tx_er, txd[7:0], tx_clk)、RX(rx_dv, rx_er, rxd[7:0], rx_clk)信号管理。
     - **MDIO/MDC**: PHYチップ設定(オートネゴシエーション、速度選択)。
   - **SystemVerilog実装**:
     - FSMで送受信状態管理(IDLE, PREAMBLE, DATA, FCS)。
     - CRC32計算モジュールを内蔵(並列計算で高速化)。
     - AXI4-Stream出力(tx_data, tx_valid, tx_ready)でFrame_Bufferに送信。
     - クロック: 10Mbps=2.5MHz, 100Mbps=25MHz, 1000Mbps=125MHz対応。
   - **入出力**:
     - **入力**: GMII RX信号(rxd, rx_dv, rx_er, rx_clk)、AXI4-Stream(tx_data)。
     - **出力**: GMII TX信号(txd, tx_en, tx_er, tx_clk)、AXI4-Stream(rx_data)。
     - **制御**: AXI4-LiteでMDIO設定(PHYレジスタ制御)。
   - **考慮点**:
     - クロックドメインクロッシング(CDC)処理(PHYクロックとシステムクロック間)。
     - FCSエラー検知で不正フレーム破棄。
     - リソース節約のため、ジャンボフレーム未対応。
   - **参考**: verilog-ethernetのMACモジュールをSystemVerilogで改変。

---

### 2. Frame_Buffer
   - **役割**: Ethernetフレームの送受信バッファリング。パケット処理のタイミング調整。
   - **機能**:
     - 送受信FIFO(BRAMベース)でパケットを一時格納。
     - パケット順序保持とデータ整合性確保。
     - AXI4-StreamでGMII_MAC_TxRxとIP_Processorを接続。
   - **SystemVerilog実装**:
     - デュアルポートBRAMでFIFO実装(読み書き独立)。
     - バッファサイズ: 最大1518バイト(標準フレーム)×数パケット(例: 8KB)。
     - ステータス信号(full, empty, almost_full)でフロー制御。
   - **入出力**:
     - **入力**: AXI4-Stream(GMII_MAC_TxRxからrx_data, IP_Processorからtx_data)。
     - **出力**: AXI4-Stream(IP_Processorへrx_data, GMII_MAC_TxRxへtx_data)。
   - **考慮点**:
     - バッファオーバーフロー防止(バックプレッシャー: ready信号)。
     - BRAMリソース節約のため、バッファサイズ最適化。
     - テスト: シミュレーションでFIFO動作確認。

---

### 3. IP_Processor
   - **役割**: IPv4パケット処理、ARP、ICMP(Pingのみ)対応。
   - **機能**:
     - **IPパケット処理**: ヘッダー生成/解析(Version, IHL, TTL, Protocol, Checksum)。
     - **ARP**: IP-MAC変換(ARP Request/Reply処理、キャッシュテーブル)。
     - **ICMP**: Echo Request受信時にEcho Reply生成(Type=8→Type=0)。
     - 静的IPアドレス(例: 192.168.1.100)固定。
   - **SystemVerilog実装**:
     - FSMでパケット種別(IPv4/ARP/ICMP)分岐処理。
     - チェックサム計算モジュール(16ビット1の補数和、並列化)。
     - ARPキャッシュをBRAMに格納(例: 16エントリ)。
     - AXI4-StreamでFrame_BufferとTCP_Engine接続。
   - **入出力**:
     - **入力**: AXI4-Stream(Frame_Bufferからrx_data)。
     - **出力**: AXI4-Stream(Frame_Bufferへtx_data, TCP_Engineへrx_data)。
     - **制御**: AXI4-LiteでIPアドレス/キャッシュ設定。
   - **考慮点**:
     - ICMP最小限(Pingのみ)でロジック簡略化。
     - フラグメンテーション未対応(MTU以下想定)。
     - テスト: WiresharkでPing応答/ARP解決確認。

---

### 4. TCP_Engine
   - **役割**: TCPサーバーとして接続管理とデータ転送。
   - **機能**:
     - 3ウェイハンドシェイク(LISTEN → SYN_RCVD → ESTABLISHED)。
     - セグメント生成/解析(シーケンス番号、ACK番号、フラグ: SYN/ACK/FIN、ウィンドウサイズ)。
     - 再送信(タイムアウト検知、ACK欠如時)。
     - ポート80固定(HTTP専用)。
     - 単一接続(複数接続未対応で簡略化)。
     - 簡易フロー制御(固定ウィンドウサイズ: 例4KB)。
   - **SystemVerilog実装**:
     - FSMでTCP状態遷移(RFC 793準拠: LISTEN, SYN_RCVD, ESTABLISHED, FIN_WAIT等)。
     - TCB (Transmission Control Block) をレジスタで管理(シーケンス番号、ACK番号、状態)。
     - 再送信バッファをBRAMに実装(例: 8KB)。
     - チェックサム計算(TCPヘッダー+ペイロード、並列化)。
     - AXI4-StreamでIP_ProcessorとHTTP_Server接続。
   - **入出力**:
     - **入力**: AXI4-Stream(IP_Processorからrx_data)。
     - **出力**: AXI4-Stream(IP_Processorへtx_data, HTTP_Serverへrx_data)。
     - **制御**: AXI4-Liteでポート設定/状態モニタ。
   - **考慮点**:
     - 単一接続でFSM簡略化、リソース節約。
     - タイマー(再送信用)はシステムクロックカウンタで実装。
     - テスト: curlでTCP接続/データ転送確認。

---

### 5. HTTP_Server
   - **役割**: HTTPリクエスト処理と静的コンテンツ配信(GET/POST対応)。
   - **機能**:
     - リクエスト解析(GET/POST、URI、ヘッダー: Host/Content-Length)。
     - レスポンス生成(200 OK, 404 Not Found, Content-Type: text/html)。
     - 静的コンテンツ配信(BRAMから読み込み)。
     - POSTデータ受信(簡易処理、レスポンス固定)。
   - **SystemVerilog実装**:
     - FSMでリクエスト解析(文字列マッチング: "GET ", "POST ", URIパス)。
     - レスポンステンプレートをROM/BRAMに格納(例: "HTTP/1.1 200 OK\r\n")。
     - AXI4-LiteでContent_Storageからコンテンツ読み込み。
     - AXI4-StreamでTCP_Engineとデータ交換。
   - **入出力**:
     - **入力**: AXI4-Stream(TCP_Engineからrx_data)。
     - **出力**: AXI4-Stream(TCP_Engineへtx_data)。
     - **制御**: AXI4-Liteでコンテンツアドレス指定。
   - **考慮点**:
     - 静的コンテンツのみ(例: index.html, data.json)。
     - リクエストバッファサイズ制限(例: 1KB)。
     - テスト: BrowserでGET/POSTアクセス確認(例: curl -X POST)。

---

### 6. Content_Storage
   - **役割**: 静的コンテンツ(HTML/JSON)を格納し、HTTP_Serverに提供。
   - **機能**:
     - BRAMベースのコンテンツ格納(例: 64KB)。
     - 読み込み専用アクセス(コンパイル時埋め込み)。
     - ファイルマッピング(例: /index.html → BRAMアドレス0x0000)。
   - **SystemVerilog実装**:
     - BRAMモジュール(初期化ファイルでコンテンツロード)。
     - AXI4-Liteスレーブインターフェース(アドレス/データ読み込み)。
   - **入出力**:
     - **入力**: AXI4-Lite(アドレス、読み込みリクエスト)。
     - **出力**: AXI4-Lite(コンテンツデータ)。
   - **考慮点**:
     - BRAM容量に応じたコンテンツサイズ制限。
     - テスト: シミュレーションでコンテンツ読み込み確認。

---

### 7. AXI_Interconnect
   - **役割**: モジュール間をAXI4-Stream(データフロー)とAXI4-Lite(制御)で接続。
   - **機能**:
     - データストリーミング(パケット/セグメント転送)。
     - 制御信号管理(設定、レジスタアクセス)。
   - **SystemVerilog実装**:
     - AXI4-Streamマスター/スレーブ(Valid/Readyハンドシェイク)。
     - AXI4-Liteでアドレスデコード(各モジュールのレジスタマッピング)。
     - オープンソースAXI IPを参考(pulp-platform/axi)。
   - **入出力**:
     - 各モジュールのAXIポート接続(詳細は各モジュール参照)。
   - **考慮点**:
     - バス帯域幅最適化(例: 32ビットデータパス)。
     - テスト: AXIプロトコルチェッカで検証。

---

### 8. Clock_Reset_Manager
   - **役割**: クロックとリセット信号の管理。
   - **機能**:
     - クロック生成(システム: 100-200MHz, GMII: 2.5/25/125MHz)。
     - CDC処理(複数クロックドメイン同期)。
     - リセット同期(非同期入力、同期解除)。
   - **SystemVerilog実装**:
     - PLLモジュールでクロック生成(Vivado/Quartus内蔵)。
     - CDC用FIFO/ハンドシェイク回路。
     - リセット同期回路(フリップフロップ複数段)。
   - **入出力**:
     - **入力**: 外部クロック(例: 50MHz)、リセット信号。
     - **出力**: 各モジュール用クロック/リセット。
   - **考慮点**:
     - タイミング制約設定(クロックドメイン分離)。
     - テスト: タイミング解析レポート確認。

---

### 全体設計と考慮点
- **アーキテクチャ**: パイプライン化でスループット向上。各モジュールは並列処理し、AXI4-Streamで低遅延データフロー。
- **リソース最適化**: BRAM使用(例: バッファ64KB、コンテンツ64KB)、LUT/FFはFSM簡略化で節約。
- **デバッグ**: ILAでモジュール間信号モニタリング。シミュレーションでパケットフロー検証。
- **テスト戦略**:
  - ユニットテスト: 各モジュールのSystemVerilogテストベンチ。
  - 統合テスト: Ping応答(ICMP)、HTTP GET/POSTアクセス(Browser/curl)。
  - Wiresharkでパケットキャプチャ。
- **参考プロジェクト**: verilog-ethernetのMAC/IP/TCPモジュールをSystemVerilogで再構成、Strega HTTPサーバーの構造参考。

リスト19 RAMからAXI4-Streamに出力するモジュールの仕様

**目的**: RAMからデータを読み出し、AXI4-Streamで出力するSystemVerilogモジュールを設計する。  
**モジュール名**: axi_emac_fifo_output  
**言語**: SystemVerilog  
**入力信号**:  
- aclk_out: 出力クロック  
- aresetn: アクティブLowリセット  
- m_axis_tready: 出力受付可能信号  
- rd_dout[n:0]: RAM読み出しデータ信号 (有効ビット + 最終ビット + データ(8bit))  
**出力信号**:  
- m_axis_tvalid: データ有効  
- m_axis_tdata[7:0]: 8ビット出力データ  
- m_axis_tlast: データの終端を示す  
- rd_en: RAM読み出しイネーブル信号  
- rd_ad[n:0]: RAM読み出しアドレス信号 (nはパラメータで指定)  
- rd_din[n:0]: RAM書き込みデータ信号 (有効ビットクリア用) = [9:0]
  - [9]: 有効ビット (valid bit)
  - [8]: 最終ビット (last bit)
  - [7:0]: 8bitデータ  
**機能**:  
- RAMからデータをaclk_outドメインで読み出し、AXI4-Streamに出力。  
- RAMの有効ビットがセットかつm_axis_treadyがHighの場合、データを8ビット(m_axis_tdata[7:0])で出力ステートに移行。  
- 出力後、RAMの有効ビットをクリアするためにrd_dinを更新。  
- m_axis_tlastはRAMデータの最終ビットに基づいて設定。  
- RAM読み出しアドレスはリングバッファ形式で管理。  
**設計制約**:  
- always_combの使用禁止: 出力制御と状態遷移はalways_ffに統合、出力信号はレジスタ化。  
- next_stateの使用禁止: ステートマシンはstate信号のみで制御、always_ff内でcase (state)を使用。  
- 合成可能性: always_ffとassignのみ使用。  
- RAM読み出しはaclk_outで同期。  

リスト20 RAMの仕様

**目的**: デュアルクロックRAMをSystemVerilogで設計する。  
**モジュール名**: axi_emac_fifo_ram  
**言語**: SystemVerilog  
**入力信号**:  
- aclk_in: 書き込みクロック  
- wr_en: 書き込みイネーブル信号  
- wr_ad[n:0]: 書き込みアドレス信号 (nはパラメータで指定)  
- wr_din[n:0]: 書き込みデータ信号 = [9:0]
  - [9]: 有効ビット (valid bit)
  - [8]: 最終ビット (last bit)
  - [7:0]: 8bitデータ
- aclk_out: 読み出しクロック  
- rd_en: 読み出しイネーブル信号  
- rd_ad[n:0]: 読み出しアドレス信号 (nはパラメータで指定)  
- rd_din[n:0]: 書き込みデータ信号 = [9:0]
  - [9]: 有効ビット (valid bit)
  - [8]: 最終ビット (last bit)
  - [7:0]: 8bitデータ
**出力信号**:  
- rd_dout[n:0]: 読み出しデータ信号  
**機能**:  
- デュアルクロックRAM: 書き込みはaclk_inで同期、読み出しはaclk_outで同期。  
- 深さ: パラメータ化 (デフォルト: 2048エントリ, 10ビット幅)。  
- データ: 有効ビット + 最終ビット + データを格納。  
- 書き込み: wr_enがHighの場合、wr_adのアドレスにwr_dinを書き込む。  
- 読み出し: rd_adのアドレスからrd_doutを読み出す。  
- 読み出し側書き込み: rd_enがHighの場合、rd_adのアドレスにrd_dinを書き込み。  
- クロックドメイン間の分離を考慮し、適切な同期を行う。  
**設計制約**:  
- 合成可能性: always_ffとassignのみ使用。  
- RAM制御はステートマシンと分離し、always_ffで実装。  

リスト21 AXI4-Streamから入力しRAMに出力するモジュール

**目的**: AXI4-Streamインターフェースを介して入力データを処理し、RAMを介して出力するSystemVerilogモジュールを設計する。  
**モジュール名**: axi_emac_fifo  
**言語**: SystemVerilog  
**入力信号**:  
- aclk_in: 入力クロック  
- aclk_out: 出力クロック  
- aresetn: アクティブLowリセット  
- s_axis_tvalid: データ有効  
- s_axis_tdata[7:0]: 8ビット入力データ  
- s_axis_tuser: データの先頭を示す (Highで有効)  
- s_axis_tlast: データの終端を示す  
- m_axis_tready: 出力受付可能信号  
**出力信号**:  
- s_axis_tready: 入力受付可能信号  
- m_axis_tvalid: データ有効  
- m_axis_tdata[7:0]: 8ビット出力データ  
- m_axis_tlast: データの終端を示す  
**機能**:  
- 入力処理、RAM、出力処理を以下のサブモジュールで実装:  
  - axi_emac_fifo_input: AXI4-Stream入力データを処理し、RAMに書き込む。  
  - axi_emac_fifo_ram: デュアルクロックRAMでデータを格納。  
  - axi_emac_fifo_output: RAMからデータを読み出し、AXI4-Streamで出力。  
- サブモジュールの接続:  
  - axi_emac_fifo_inputの出力(wr_en, wr_ad, wr_din)をaxi_emac_fifo_ramの入力に接続。  
  - axi_emac_fifo_ramの出力(rd_dout)をaxi_emac_fifo_outputの入力に接続。  
  - axi_emac_fifo_outputの出力(rd_en, rd_ad, rd_din)をaxi_emac_fifo_ramの入力に接続。  
- クロックドメイン:  
  - 入力処理とRAM書き込みはaclk_inで同期。  
  - 出力処理とRAM読み出しはaclk_outで同期。  
- パラメータ: RAM深さは2048エントリ(デフォルト)、10ビット幅。  
**設計制約**:  

コメントを残す