表2 リスト4のプロンプトに対する生成AIの回答
| OSI層 | 必要な機能 | 技術/プロトコル | FPGA実装の考慮点 |
|-------|------------|-----------------|------------------|
| **Physical Layer (L1)**<br>物理伝送 | - 10/100/1000Mbpsの電気信号送受信。<br>- ビット同期とクロック回復。<br>- GMIIインターフェース経由のPHY制御(MDIOオプション)。 | - IEEE 802.3 Clause 22/35/40(10/100/1000BASE-T)。<br>- GMII(Gigabit Media Independent Interface: 8-bitデータ、クロック125MHz at 1Gbps)。 | - 外部PHYチップ(例: KSZ9031RNX)とGMII接続。自作PCS/PMA(Physical Coding Sublayer/Physical Medium Attachment)でFPGA内蔵SerDes(GTX)使用せず、シンプルI/Oピン接続。<br>- クロックドメイン:25/2.5/125MHz対応のPLL生成。リソース: 低(<5k LUTs)、ジッタ<1ns確保。 |
| **Data Link Layer (L2)**<br>フレーム転送 | - 自作MACによるフレーム送受信(Preamble/SFD検知、CRC-32生成/検証)。<br>- ARPクエリ/レスポンスでIP-MAC解決。<br>- 標準フレーム長(64-1518バイト)のみ、VLAN/ジャンボフレーム非対応。 | - Ethernet IIフレーム形式(Dst/Src MAC、Type=0x0800 for IP)。<br>- ARP (RFC 826: IPv4 over Ethernet)。<br>- CRC-32 (IEEE 802.3ポリノミアル)。 | - MAC IPコア非使用のため、RTLでFSM実装(受信: バイトストリーム解析、送信: パディング/IFG挿入)。ARPキャッシュをBRAM(256エントリ)で管理。<br>- GMIIからAXI-Streamへ変換。フルデュプレックス、CSMA/CD不要。リソース: 8-12k LUTs、衝突検知省略で簡素化。 |
| **Network Layer (L3)**<br>パケットルーティング | - IPv4パケットの送受信とチェックサム検証。<br>- フラグメンテーション非対応(MTU超過時はドロップ)。<br>- ICMP最小限: Echo Request/Replyのみ(Ping対応)。 | - IPv4 (RFC 791: 20バイトヘッダー、TTL=64固定)。<br>- IPチェックサム (RFC 791)。<br>- ICMP v4 (RFC 792: Type 0/8, Code 0)。 | - 自作IPパーサー/ビルダー(ヘッダー抽出、バージョン/長/TOS/プロトコル=6 for TCP確認)。ARPテーブル参照でMAC解決。<br>- ICMP: シンプルエコーエンジン(ペイロードコピー)。ルーティングテーブル固定(単一ホスト)。リソース: 5-7k LUTs、BRAMでTTLカウンタ。 |
| **Transport Layer (L4)**<br>エンドツーエンド転送 | - TCP接続の確立/維持/終了。<br>- シーケンス/ACK管理、再送/フロー制御。<br>- UDP非対応のため、TCPポート(80 for HTTP)固定。 | - TCP (RFC 9293: IPv4 over TCP, ポート多重化なし)。<br>- 3-way Handshake、Sliding Window (最大64KB)、Slow Start/AIMD混雑制御。<br>- チェックサム (TCPヘッダー+ペイロード)。 | - 自作TCPエンジン(FSMで状態遷移: LISTEN/SYN_SENT/ESTABLISHED/CLOSE_WAIT)。BRAMで接続テーブル(1-4同時接続、シーケンス/ウィンドウ/タイマ保管)。<br>- 再送: 200msタイマ、ACK累積。UDP省略でリソース節約。リソース: 10-15k LUTs、並列ハッシュでポートフィルタ。 |
| **Session Layer (L5)**<br>セッション管理 | - TCPセッションの同期/チェックポイント。<br>- 接続維持(Keep-Aliveオプション)。<br>- 半二重クローズ対応。 | - TCP拡張 (RFC 1122: Keep-Alive, 2時間間隔)。<br>- セッションIDなし(単一HTTPセッション)。 | - TCPエンジンにFSM統合(FIN/ACK交換)。タイマモジュールでアイドル検知。<br>- 同時接続制限でBRAM使用最小化。リソース: TCP内包(追加2k LUTs)。 |
| **Presentation Layer (L6)**<br>データ表現 | - データ形式変換なし(ASCII固定)。<br>- 圧縮/暗号化非対応。<br>- エンディアン変換(ビッグエンディアンHTTP)。 | - なし (RFC 7230準拠のプレーンテキスト)。<br>- MIMEなし(静的コンテンツ限定)。 | - パイパス処理(バイトストリーム直通)。HTTPS/TLS非対応でAESエンジン不要。<br>- AXI-Streamで上位層へ。リソース: 最小(0追加)、エンディアンFPGAネイティブ(リトル→ビッグ変換FSM)。 |
| **Application Layer (L7)**<br>ユーザーインターフェース | - HTTP GET/POSTリクエスト解析と静的レスポンス生成。<br>- ステートレス処理(POSTデータ無視 or 簡易エコー)。<br>- コンテンツ: HTML/テキスト固定、動的生成なし。 | - HTTP/1.1 (RFC 7230: GET/POST, Content-Lengthヘッダー)。<br>- ステータス: 200 OK/400 Bad Request/404 Not Found。<br>- 静的ファイル: 事前ROMロード(<1MB)。 | - 自作HTTPパーサー(FSMでヘッダー解析: Method/URI/Host/Body)。POST: ボディ長制限(<1KB、無処理)。<br>- レスポンス: テンプレートROMから出力。BRAM/DRAMで静的コンテンツ保管。リソース: 6-10k LUTs、URIマッチでファイル選択。 |
●表3 リスト5のプロンプトに対する回答
| モジュール名 | 対応OSI層 | 主な役割 | インターフェース例 | 推定リソース使用(LUTs/BRAM) |
|-------------------------------|-----------|--------------------------------------------------------------------------|-----------------------------|-------------------------------|
| **GMII Interface Module** | L1 | PHYとの物理信号交換とクロック同期。 | GMII I/O → AXI-Stream | 4k / 0 |
| **Custom Ethernet MAC Module**| L2 | フレームの送受信とCRC処理、自作MAC。 | AXI-Stream (in/out) | 10k / 2 |
| **ARP Cache Module** | L2/L3 | IP-MAC解決のキャッシュ管理。 | AXI-Stream + BRAM access | 2k / 1 |
| **IPv4 Packet Handler Module**| L3 | IPv4ヘッダー解析とチェックサム、フラグメントドロップ。 | AXI-Stream (in/out) | 6k / 1 |
| **ICMP Echo Module** | L3 | 最小ICMP(Echo Request/Reply)処理。 | AXI-Stream sideband | 3k / 0 |
| **TCP Connection Manager Module** | L4/L5 | TCP接続の確立/終了と状態管理。 | AXI-Stream + Control reg | 8k / 4 |
| **TCP Data Processor Module**| L4 | TCPセグメントのシーケンス/ACK/再送/フロー制御。 | AXI-Stream (data) | 12k / 3 |
| **HTTP Request Parser Module**| L7 | HTTP GET/POSTリクエストの解析(ヘッダー/URI)。 | AXI-Stream payload | 5k / 1 |
| **Static Content Generator Module** | L7 | 静的HTTPレスポンス生成(固定コンテンツ出力)。 | AXI-Stream response | 4k / 2 (ROM) |
| **System Integration Module**| 全層 | モジュール間のルーティングとクロック/リセット制御。 | Internal bus (AXI-Lite) | 6k / 1 |
●リスト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ビット幅。
**設計制約**: