SFL例題/第11回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[SFL例題]]
*パイプライン処理回路の設計 [#sedbf15c]
簡単なパイプライン処理を行う回路を設計する。
----
#contents
**ダウンロード [#id33773f]
&ref(sample11.tar.gz);
**覚えること [#wd4ea217]
-パイプライン処理の仕組み
-stageの概念とrelay処理
***パイプライン処理の仕組み [#fa5e4599]
各演算部分の間にレジスタを挿入して分割し、クロックごとに各演算部分が独立して演算をする。~
これによって、高速化が実現できる。
***stageの概念とrelay処理 [#fd94f3ba]
stageで表記された部分が一つの演算部分として扱われる。~
パイプライン処理では、独立した各ブロックの動作部分をステージと呼ぶため、その概念に基づいて、stageという名前が付けられているらしい。~
各ステージ間の処理の受渡しはrelayを使用する。
relay sub.do(add_sel, sub1);
のように、各ステージの宣言時に指定した引数を渡す。~
これによって一時的に値がレジスタに格納され、次のクロックに次のステージの処理が行われる。~
ちなみにrelayという表記だが、これは、
generate sub.do(add_sel, sub1);
finish;
と同様の意味を持つ。どちらの表記でも動作は変わらない。
**例題 [#z316eca5]
-最初のステージではinとinaddの加算を行う。
-次のステージでは前のステージの結果を受け取りinsubとの減算を行う。
-通常は一組の演算に2クロック必要だが、パイプライン処理によって連続的に演算をすることができる。
**サンプルソース [#v60c5f69]
/* pipeline で使う加算器の宣言 */
declare cla8 {
input cin;
input ina<8>;
input inb<8>;
output out<8>;
instrin do;
instr_arg do(cin, ina, inb);
}
module pipeline {
input in<8>;
input inadd<8>;
input insub<8>;
output out<8>;
instrin do;
sel add_sel<8>; /* 加算の計算結果用の内部端子 */
/* add ステージ用のレジスタ */
reg in_reg<8>;
reg add<8>;
reg sub1<8>;
/* sub ステージ用のレジスタ */
reg rslt<8>;
reg sub2<8>;
/* サブモジュール */
cla8 cla_add;
cla8 cla_sub;
/* ステージ名とタスクの定義 */
stage_name add { task do(in_reg, add, sub1); }
stage_name sub { task do(rslt, sub2); }
/* 制御入力 do に対しての動作 (add ステージを起動) */
instruct do generate add.do(in, inadd, insub);
/* add ステージ */
stage add {
par {
/* in_reg (in で与えた入力) と add (inadd で与えた入力を加算) */
add_sel = cla_add.do(0b0, in_reg, add).out;
/* sub ステージを起動してこのステージを終了 */
relay sub.do(add_sel, sub1);
}
}
/* sub ステージ */
stage sub {
par {
/* rslt (add ステージの加算結果) と sub2 (insub で与えた入力を減算) */
out = cla_sub.do(0b1, rslt, ^sub2).out;
/* ステージの終了 */
finish;
}
}
}
/* PARTHENON のサンプルを使って加算器を作成 */
circuit cla8 {
input cin;
input ina<8>;
input inb<8>;
output out<8>;
instrin do;
/* + 演算子は PARTHENON 内部の加算器で置き換えられる */
instruct do out = (7#0b0 || cin) + ina + inb;
}
**シミュレーション [#l68000c0]
+[[ダウンロード>#id33773f]]にあるsample11.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample11.tar.gz
+sample11ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--pipeline.sfl
--pipeline.sim
% make sim
+結果は以下のようになる。
time:1 in:00 inadd:04 insub:02 out: add:1 sub:0
time:2 in:00 inadd:00 insub:00 out:02 add:0 sub:1
time:3 in:00 inadd:00 insub:00 out: add:0 sub:0
time:4 in:10 inadd:04 insub:02 out: add:1 sub:0
time:5 in:20 inadd:15 insub:30 out:12 add:1 sub:1
time:6 in:16 inadd:04 insub:10 out:05 add:1 sub:1
time:7 in:00 inadd:00 insub:00 out:0a add:0 sub:1
time:8 in:00 inadd:00 insub:00 out: add:0 sub:0
time:9 in:00 inadd:00 insub:00 out: add:0 sub:0
終了行:
[[SFL例題]]
*パイプライン処理回路の設計 [#sedbf15c]
簡単なパイプライン処理を行う回路を設計する。
----
#contents
**ダウンロード [#id33773f]
&ref(sample11.tar.gz);
**覚えること [#wd4ea217]
-パイプライン処理の仕組み
-stageの概念とrelay処理
***パイプライン処理の仕組み [#fa5e4599]
各演算部分の間にレジスタを挿入して分割し、クロックごとに各演算部分が独立して演算をする。~
これによって、高速化が実現できる。
***stageの概念とrelay処理 [#fd94f3ba]
stageで表記された部分が一つの演算部分として扱われる。~
パイプライン処理では、独立した各ブロックの動作部分をステージと呼ぶため、その概念に基づいて、stageという名前が付けられているらしい。~
各ステージ間の処理の受渡しはrelayを使用する。
relay sub.do(add_sel, sub1);
のように、各ステージの宣言時に指定した引数を渡す。~
これによって一時的に値がレジスタに格納され、次のクロックに次のステージの処理が行われる。~
ちなみにrelayという表記だが、これは、
generate sub.do(add_sel, sub1);
finish;
と同様の意味を持つ。どちらの表記でも動作は変わらない。
**例題 [#z316eca5]
-最初のステージではinとinaddの加算を行う。
-次のステージでは前のステージの結果を受け取りinsubとの減算を行う。
-通常は一組の演算に2クロック必要だが、パイプライン処理によって連続的に演算をすることができる。
**サンプルソース [#v60c5f69]
/* pipeline で使う加算器の宣言 */
declare cla8 {
input cin;
input ina<8>;
input inb<8>;
output out<8>;
instrin do;
instr_arg do(cin, ina, inb);
}
module pipeline {
input in<8>;
input inadd<8>;
input insub<8>;
output out<8>;
instrin do;
sel add_sel<8>; /* 加算の計算結果用の内部端子 */
/* add ステージ用のレジスタ */
reg in_reg<8>;
reg add<8>;
reg sub1<8>;
/* sub ステージ用のレジスタ */
reg rslt<8>;
reg sub2<8>;
/* サブモジュール */
cla8 cla_add;
cla8 cla_sub;
/* ステージ名とタスクの定義 */
stage_name add { task do(in_reg, add, sub1); }
stage_name sub { task do(rslt, sub2); }
/* 制御入力 do に対しての動作 (add ステージを起動) */
instruct do generate add.do(in, inadd, insub);
/* add ステージ */
stage add {
par {
/* in_reg (in で与えた入力) と add (inadd で与えた入力を加算) */
add_sel = cla_add.do(0b0, in_reg, add).out;
/* sub ステージを起動してこのステージを終了 */
relay sub.do(add_sel, sub1);
}
}
/* sub ステージ */
stage sub {
par {
/* rslt (add ステージの加算結果) と sub2 (insub で与えた入力を減算) */
out = cla_sub.do(0b1, rslt, ^sub2).out;
/* ステージの終了 */
finish;
}
}
}
/* PARTHENON のサンプルを使って加算器を作成 */
circuit cla8 {
input cin;
input ina<8>;
input inb<8>;
output out<8>;
instrin do;
/* + 演算子は PARTHENON 内部の加算器で置き換えられる */
instruct do out = (7#0b0 || cin) + ina + inb;
}
**シミュレーション [#l68000c0]
+[[ダウンロード>#id33773f]]にあるsample11.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample11.tar.gz
+sample11ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--pipeline.sfl
--pipeline.sim
% make sim
+結果は以下のようになる。
time:1 in:00 inadd:04 insub:02 out: add:1 sub:0
time:2 in:00 inadd:00 insub:00 out:02 add:0 sub:1
time:3 in:00 inadd:00 insub:00 out: add:0 sub:0
time:4 in:10 inadd:04 insub:02 out: add:1 sub:0
time:5 in:20 inadd:15 insub:30 out:12 add:1 sub:1
time:6 in:16 inadd:04 insub:10 out:05 add:1 sub:1
time:7 in:00 inadd:00 insub:00 out:0a add:0 sub:1
time:8 in:00 inadd:00 insub:00 out: add:0 sub:0
time:9 in:00 inadd:00 insub:00 out: add:0 sub:0
ページ名: