レジスタ付き読み出しポート
CoddyのVerilogジャーニー「RTL設計と検証」セクションの一部。レッスン 23/38。
レジスタ付き読み出しは、クロックエッジでメモリデータを取得し、その後もその値を保持します。読み出しイネーブルを使用すると、無効なサイクルでは前の出力を保持できます。読み出しレジスタをリセットしても、すべてのメモリワードをクリアする必要はありません。ノンブロッキングの読み出しおよび書き込み代入では、読み出し式はエッジ前のワードを参照します。
関連する抜粋です。周辺の宣言と接続は課題に含まれています。
always @(posedge clk) begin
if(we) mem[waddr] <= data;
if(rst) q <= 0;
else if(re) q <= mem[raddr];
end出力レジスタは、指定されたエッジとイネーブルされたパスでのみ更新されます。
ドキュメントの読み取りレイテンシ、読み取り無効時の動作、およびどの状態リセットで実際にクリアされるか。
チャレンジ
中級同期書き込みとレジスタ化された読み出し q を備えた、4ワード8ビットメモリを実装してください。we は立ち上がりエッジで書き込みます。rst は q のみを同期的にクリアします。それ以外の場合、re によってエッジ前の mem[raddr] が q に読み込まれます。re=0 の場合、q は保持されます。メモリはリセットされず、書き込みは rst から独立しています。1つのエッジで読み出しと書き込みが同じアドレスを共有する場合、q には古いワードが入ります。テストでは、有効な読み出しの前にワードを初期化します。出力列は q です。すべての制御信号とデータは各クロックの立ち上がりエッジ前に安定しており、結果はその後に観測されます。
design.v を完成させ、モジュール名とポートを保持してください。ロックされた testbench.v は入力を変更し、安定した後に出力を表示します。シミュレータ引数(+CASE=1 など)を使用してシナリオを選択します。標準入力は必要ありません。設計に表示、遅延、またはシミュレーション終了処理を追加しないでください。期待される出力は、各観測につき10進値を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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
RTL設計と検証のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ