
| 入力 D |
クロック CLK |
出力 | |
| Q | Q | ||
| 0 | 1(↑) | 0 | 1 |
| 1 | 1(↑) | 1 | 0 |
| X | 0 | Q | Q |
この D-FF を用いてパイプラインレジスタを構成し,
間に組み合わせ論理回路を挟んだものがパイプラインである.
つまり,図1 をもう少し詳細化して書くと図3 のようになる.

リスト1 モジュールの構造の概要
module counter4(ポート名, ポート名,,, );
ポート記述
変数記述
組み合わせ回路記述
always @(posedge clk or rst)
begin
順序回路記述
end
endmodule
ここで,組み合わせ回路をどちら側に書くかによって,
図4 のようにパイプラインの分割法に三通りが考えられる.
図4 (A) はパイプラインレジスタとその入力に繋がる組み合わせ回路を
同一のモジュールに記述する方法である.
(B) はパイプラインレジスタとその出力に繋がる組み合わせ回路を
一モジュールとして記述する方法である.
(C) はパイプラインレジスタを含みその前後の組み合わせ回路を
一モジュールとして記述する方法である.
一応どれでも記述することは可能であるが,以下の理由で (A)を採ることにしたい.まず,(C) は論外である. (C)を採るとひとかたまりで有るべき組み合わせ回路が複数の モジュールにまたがってしまって判読不能になってしまう. 次に (A) か (B) かであるが,(B) を採ると入力はそのまま パイプラインレジスタに代入する必要があり, always 部の中に if 文も何も書けなくなってしまう. また,パイプラインステージの定義として, 「何か仕事をしてからデータを保持し,後段に送る」 と考えた方が解りやすい.
そこで,各パイプラインステージは 図4 (A) のような構造とし, ステージの最後でパイプライレジスタに代入し, パイプラインレジスタの出力をモジュールの出力に直接 assign 文で繋ぐ. この assign 文は一見代入のように見えるが、 実際には配線の接続である. assign 文で繋がれた線は全て同電位となってしまう. したがって、複数の場所で別の値を設定する事ができない事に注意する.
|
|
|
リスト2 パイプラインステージモジュール
module a_stage(clk, rst,
v_i,
v_o,
data_i,
data_o,
stall_i,
stall_o
);
input clk, rst; // clock , reset
input v_i; // valid in, if (v_i == 1) valid
output v_o; // valid out, if (v_o == 1) valid
input [31:0] data_i; // data in
output [31:0] data_o; // data out
input stall_i; // stall in, if (stall_i == 1) stall
output stall_o; // stall out, if (stall_o == 1) stall
// pipeline registers
reg v_r; // valid register for output
reg [31:0] data_r; // valid register for output
// connecting registers to output
assign v_o = v_r;
assign data_o = data_r;
// stall to previous stage
assign stall_o = (v_r & stall_i);
always @(posedge clk or negedge rst)
begin
if (~rst) // reset
begin
v_r <= 0; // reset valid reg
data_r <= 0; // reset data reg
end
else
begin
if (~stall_i) // valid and not stall
begin // transfer to next stage
v_r <= v_i;
data_r <= data_i;
end
end // else: !if(~rst)
end // always @(posedge clk or negedge rst)
endmodule // a_stage
リスト3 表示の工夫
$display("####### cycle %h #################", i);
$display("*** stage0 input ***");
$display("v data stall");
$display("%b %h %b", stage0.v_i, stage0.data_i, stage0.stall_i);
さらに,less 等で表示を行えば判りやすい.
この時にウインドウの表示行数をイジって,
一サイクルの表示行数の整数倍になるようにすれば視線移動が少なくて見やすい.
また,less のサーチを使うと良い.
less ではサーチされた語が一定の行に表示される.