デジタルIC設計研究ノート
5.ブロッキングおよび非ブロッキングの割り当て
1 Verilog 代码
2 原理图
3 Modelsim仿真
- ブロック割り当て(ブロック): "="、ステートメントは順番に実行され、シリアル実行
- 非ブロッキング割り当て(ブロック解除): "<="、ステートメントは順序なしで実行され、並行して実行されます
- 注:同じalwaysブロックにブロッキング割り当てと非ブロッキング割り当てを混在させないでください
1Verilogコード
module block_unblock(
input clk,
input rst_n,
input a,
input b,
input c,
output reg [1:0] out //out = a+b+c;
);
reg [1:0] d; //d = a+ b; out = d+c;
always@(posedge clk or negedge rst_n)
if(!rst_n)
// out = 2'd0;
out <= 2'd0;
else begin
//----blocked 1--------------
// d = a + b;
// out = d + c;
//----blocked 2--------------
// out = d + c;
// d = a + b;
//----unblocked 1------------
// out <= d + c;
// d <= a + b;
//----unblocked 2------------
// d <= a + b;
// out <= d + c;
//----unblock 3--------------
out <= a + b + c;
end
endmodule
2.回路図
(1)。Block1の回路図
(2)。ブロック2の回路図
(3)。ブロックを解除する1の回路図
(4)。ブロックを解除する2の回路図
(5)。ブロックを解除する3の回路図(推奨)
3Modelsimシミュレーション
ブロック2のシミュレーション結果
// out = d + c;
// d = a + b;
最初にout = d + cを実行;この時点でのdの値は前のクロックサイクルの値です;次にd = a +を実行しますb;この時点でのdの値は、クロックの次の有効なエッジで収集されます。dレジスタのレベルが1つ増えるため、1ビートが遅延し、結果としてエラーが発生します。
unblock 1、2
unblock 3シミュレーション結果(推奨)のシミュレーション結果も、dレジスタのレベルが追加されているために間違っています
【注意】:個人学習メモ、間違いがありましたら、お気軽に教えてください、丁寧です~~~