概要
このコンテンツは EMIF (External Memory Interface) IP コアのリード/ライト・シーケンスの理解を目的としています。
メモリーに対してリード/ライト・アクセスをおこなうには、ユーザー・インターフェイスから Avalon® Interface に準拠してアクセスします。 メモリー・コントローラーと PHY 間の通信プロトコルである AFI インターフェイスは制御する必要はありません。
下図は インテル® Arria® 10 FPGA EMIF + DDR3 の信号例 です。
デバイスファミリーにより信号名が異なる場合や存在しない信号があります。また、avl_size のように、ビット数が異なる場合もあります。
下記は UniPHY と インテル® Arria® 10 FPGA EMIF の信号名の違いです。
Avalon® Interface の仕様は、以下のリンクを参照して下さい。
ライトシーケンス
ライトシーケンスについて、IP 内部の信号を含む波形図で説明します。
下記は Size=1 でリクエスト時にウェイト (avl_ready = Low) が発生していない波形です。実際の動作ではウエイトが発生しますので、ユーザーはウェイトが発生する場合を考慮して設計する必要があります。その場合のプロトコルについては、本記事の添付資料をご参照ください。
この図では、①②がユーザー・インターフェイスの信号、③⑤⑦が AFI インターフェイスの信号、④⑥⑧が外部メモリー・インターフェイスの信号の動作です。
リードシーケンス
リードシーケンスについて、IP 内部の信号を含む波形図で説明します。
下記は Size=1 でリクエスト時にウェイト (avl_ready = Low) が発生していない波形です。ライトシーケンスと同様、ユーザーは、ウェイトが発生する場合を考慮して設計する必要があります。その場合のプロトコルについては、本記事の添付資料をご参照ください。
この図では、①⑧がユーザー・インターフェイスの信号、②④⑦が AFI インターフェイスの信号、③⑤⑥が外部メモリー・インターフェイスの信号の動作です。
良くある質問/間違い事項
(プロトコル違反に関しては添付資料にまとめていますのでご参照ください)
1. avl_ready が長期間 (頻繁に) Low に落ちます何故ですか?
- 下記が要因の可能性があります。またプロトコル違反をしていないか確認してください。
- インテル® FPGA V シリーズの場合、DQS トラッキングが有効の時、avl_ready が長時間 Low に落ちることがあります。DQSトラッキングを無効にしてください
2. リード/ライトがスタックします。何故ですか?
- プロトコル違反や接続ミスを起こしている場合スタックします。例えば下記があります。
- リード/ライト・リクエストを発行する際、アドレス、サイズ信号が有効である必要があります
- サイズは1以上が必須(サイズ0のアクセスは違反)で、IP 生成時に指定した値以下にしてください
- リードとライトを同時に発行するのは違反です
- MPFE は同一ポート内では同一のクロック信号とリセット信号を接続する必要があります
- Ready = L の場合は burstbegin を除いて High になるまでユーザー回路から与える信号を保持する必要があります(Ready = L が継続している状態で、一度発行したリクエスト情報を「取り下げ」はできません。行うと、プロトコル違反になります)
- サイズ2以上のライトでは、リクエスト先頭で設定したサイズだけ、有効なライトデータ転送(avl_ready と avl_write_req の両方が High)を行わなければなりません
3. リードリクエスト以上のリードデータが返ってきます、なぜですか?
- ライト時は Size で指定した分の有効なライトデータ転送を発行する必要がありますが、リード時は Size が2以上でも1つのバースト転送で有効なリードリクエストを1回だけ発行します
- 有効なライトデータ転送:avl_ready と avl_write_req の両方が High
- 有効なリードリクエスト:avl_ready と avl_read_req の両方が High
- 例えば、1サイクルの "avl_read_req=H" が受け付けられたとき、size で指定した分だけ avl_rdata_valid=H (上記のリードシーケンスの波形の⑧の部分) が返ってきます
- 誤って size 回のリードリクエストを発行すると、size × size だけのリードデータが返されます
4. リード/ライトデータが返ってきません、なぜですか?
- プロトコル違反していないか確認してください
- 例えば、リードシーケンスのリクエスト発行からデータ受け取りまでのレイテンシー(図の①~⑧の間隔)が一定としてユーザーロジックを設計すると、スタックやデータミスの可能性があります
5. 帯域が落ちます。なぜですか?
- リフレッシュ動作があるため少なからず帯域は落ちてしまいますが、そのほかの要因としては下記の要因があります。
- DDR4 の場合、アドレスの変化と BG のアサイン位置によっては帯域が落ちる場合があります(tCCD_L, tCCD_S 関連)
- インテル® FPGA V シリーズの場合、MPFE を使っているとき、1クロック分余分に消費して帯域が落ちる場合があります
- DQS トラッキングが有効になっている場合、avl_ready が長期間 (頻繁に) Low になっている可能性があります
- 下記設定を変更することで帯域が向上する可能性があります
- Command Queue Look-Ahead Depth, Burstcount, Starvation limit for each command
コマンド一覧
・DDR3 のコマンド一覧
・DDR4 のコマンド一覧
まとめ
以上、 EMIF IP コアのユーザー・インターフェイスにおいて、ライト/リードどちらの場合も Size=1 でウェイトが発生していない場合(常に avl_ready=H)について、IP 内部の信号を含むシーケンスの概要を説明しました。また、ライト/リードについてよくある質問/問題を記載しました。
実際にはウエイトが発生する場合があり、下記の4種類のパターンが考えられます。ユーザーは使い方に合わせて発生する全ての場合に対応する必要があり、対応に不足がある場合、プロトコル違反による誤動作する場合があります。
詳細については添付資料をご参照ください。
(1)avl_size=1, avl_ready = H (バースト長 1、ウェイトが無い場合)
(2)avl_size=1, avl_ready = L (バースト長 1、ウェイトがある場合)
(3)avl_size≧2, avl_ready = H (バースト長 2 以上、ウェイトが無い場合)
(4)avl_size ≧2, avl_ready = L (バースト長 2 以上、ウェイトがある場合)
・添付資料:EMIF IP ユーザー・インターフェイス補足(アクセス波形説明 )