Menu
Coddy logo textTech

読み書きフォワーディング

CoddyのVerilogジャーニー「RTL設計と検証」セクションの一部。レッスン 24/38。

メモリインターフェースでは、同一アドレスへの読み取りと書き込みの動作を定義する必要があります。フォワーディングは、競合時に入力された書き込みデータを明示的に選択し、新しいデータを返す動作を実現します。このバイパスがない場合、以前のノンブロッキング読み取りテンプレートは古いデータを取り込みます。デバイスごとにメモリモードは異なるため、シミュレーション上の意味だけでは、特定のプリミティブへのマッピングは保証されません。

関連する抜粋です。周囲の宣言と接続はチャレンジ内で提供されています。

if(re) begin
    if(we && waddr==raddr) q <= data;
    else q <= mem[raddr];
end

バイパスは、実際にアドレスが衝突した場合にのみ、入力されたワードを選択します。

衝突の動作を明示的に定義し、選択したハードウェアのメモリーモードに対して検証します。

challenge icon

チャレンジ

中級

新しいデータのフォワーディングを備えた、4ワードのレジスタ読み出しメモリを実装してください。書き込みおよびリセット/読み出しイネーブルのルールは、前のレッスンと同じです。イネーブルされた読み出しが、同じアドレスへのイネーブルされた書き込みと衝突した場合、q は古いワードではなく入力データを取り込みます。それ以外の読み出しでは、mem[raddr] を取り込みます。出力列:q。各立ち上がりクロックエッジの前に、すべての制御信号とデータは安定しており、結果はその後に観測されます。

design.v を完成させ、モジュール名とポートを保持してください。ロックされた testbench.v が入力を変更し、安定した後に出力を表示します。シミュレータ引数(例:+CASE=1)を使用してシナリオを選択します。標準入力は必要ありません。設計に表示、遅延、またはシミュレーション終了処理を追加しないでください。期待される出力は、各観測につき10進値を1行に1つ含み、値は1つのスペースで区切られ、末尾に改行が付きます。

自分で試してみよう

module dut (input clk, input rst, input we, input re, input [1:0] waddr, input [1:0] raddr, input [7:0] data, output reg [7:0] q);
    // このプレースホルダーをあなたのデザインに置き換えてください。
    initial q = 0;
endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

RTL設計と検証のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ