大和田/SFL/ステートマシンの記述方法
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[大和田/SFL]]
*ステートマシンの記述方法 [#ze2c59d7]
SFLによるステートマシンの記述方法について。
----
#contents
**stateとstageの違い [#cdd6eae2]
SFLにはstate記述というステートマシン専用の記述方法があります。~
ステート間の遷移はgoto文で行い、1つのステージ内にステートを記述していきます。
記述例:
stage main {
state_name st0, st1, st2;
first_state st0;
state st0 par { ...; goto st1; }
state st1 par { ...; goto st2; }
state st2 par { ...; goto st0; }
}
パイプライン化を前提にする際などには、stage記述を用いてステートマシンを記述する方法があります。~
ステート間の遷移はrelay文で行い、1つのステージが1つのステートを意味します。
記述例:
stage st0 {
par { ...; relay st1.do(); }
}
stage st1 {
par { ...; relay st2.do(); }
}
stage st2 {
par { ...; relay st0.do(); }
}
上記の例の記述はどちらを選んでも、動作自体は変わりません。~
ステートマシンとして使用するならばstate記述を、パイプライン化を目指すのならばstage記述を使用すると良いでしょう。
**SN/Xを例にしたステートマシンの記述方法 [#bb056d15]
ここでは、東海大学の清水先生が設計したSN/Xを例に、ステートマシンの記述方法を紹介します。~
一部の記述は元のソースと異なる表記になっていることに注意してください。
***state記述を用いたステートマシン [#yb307d5a]
state記述では1つのステージ内にステートを宣言して、動作を定義します。
stage main {
state_name ifetch, exec, memex;
first_state ifetch;
state ifetch par {
setop();
goto exec;
}
state exec par {
if((OPCODE == BAL) | ((OPCODE == BZ) & opr1zero)) br_taken();
npc();
any {
br_taken : par {
alu2pc();
wb();
goto ifetch;
}
(OPCODE == LD) : par {
cla2mar();
r2grnum();
npc2pc();
goto memex;
}
(OPCODE == ST) : par {
cla2mar();
r2grnum();
npc2pc();
goto memex;
}
(OPCODE == HLT) : par {
hlt();
finish;
}
else : par {
npc2pc();
wb();
goto ifetch;
}
}
opr1set();
any {
ITYPE : I2clain1();
else : opr12clain1();
}
any {
ITYPE & (R3 == 0b00) : opr2zero();
else : opr2reg();
}
any {
(ITYPE | (OPCODE == ADD)) : aluadd();
(OPCODE == SLT) : aluslt();
(OPCODE == AND) : aluand();
(OPCODE == NOT) : alunot();
(OPCODE == SR) : alusr();
}
any {
^ITYPE : rwb();
(OPCODE == LDA) : ldawb();
(OPCODE == BAL) : balwb();
}
}
state memex par {
any {
(OPCODE == ST) : store();
(OPCODE == LD) : load();
}
goto ifetch;
wb();
}
}
***stage記述を用いたステートマシン [#ied9e0ef]
stage記述では、1つのステージに1つのステートの動作が記述されています。~
元のソースはパイプライン化をしやすいように設計されているため、こちらの記述に近いです。
stage ifetch {
par {
setop();
relay exec.do();
}
}
stage exec {
par {
if((OPCODE == BAL) | ((OPCODE == BZ) & opr1zero)) br_taken();
npc();
any {
br_taken : par {
alu2pc();
wb();
relay ifetch.do();
}
(OPCODE == LD) : par {
cla2mar();
r2grnum();
npc2pc();
relay memex.do();
}
(OPCODE == ST) : par {
cla2mar();
r2grnum();
npc2pc();
relay memex.do();
}
(OPCODE == HLT) : par {
hlt();
finish;
}
else : par {
npc2pc();
wb();
relay ifetch.do();
}
}
opr1set();
any {
ITYPE : I2clain1();
else : opr12clain1();
}
any {
ITYPE & (R3 == 0b00) : opr2zero();
else : opr2reg();
}
any {
(ITYPE | (OPCODE == ADD)) : aluadd();
(OPCODE == SLT) : aluslt();
(OPCODE == AND) : aluand();
(OPCODE == NOT) : alunot();
(OPCODE == SR) : alusr();
}
any {
^ITYPE : rwb();
(OPCODE == LDA) : ldawb();
(OPCODE == BAL) : balwb();
}
}
}
stage memex {
par {
any {
(OPCODE == ST) : store();
(OPCODE == LD) : load();
}
relay ifetch.do();
wb();
}
}
終了行:
[[大和田/SFL]]
*ステートマシンの記述方法 [#ze2c59d7]
SFLによるステートマシンの記述方法について。
----
#contents
**stateとstageの違い [#cdd6eae2]
SFLにはstate記述というステートマシン専用の記述方法があります。~
ステート間の遷移はgoto文で行い、1つのステージ内にステートを記述していきます。
記述例:
stage main {
state_name st0, st1, st2;
first_state st0;
state st0 par { ...; goto st1; }
state st1 par { ...; goto st2; }
state st2 par { ...; goto st0; }
}
パイプライン化を前提にする際などには、stage記述を用いてステートマシンを記述する方法があります。~
ステート間の遷移はrelay文で行い、1つのステージが1つのステートを意味します。
記述例:
stage st0 {
par { ...; relay st1.do(); }
}
stage st1 {
par { ...; relay st2.do(); }
}
stage st2 {
par { ...; relay st0.do(); }
}
上記の例の記述はどちらを選んでも、動作自体は変わりません。~
ステートマシンとして使用するならばstate記述を、パイプライン化を目指すのならばstage記述を使用すると良いでしょう。
**SN/Xを例にしたステートマシンの記述方法 [#bb056d15]
ここでは、東海大学の清水先生が設計したSN/Xを例に、ステートマシンの記述方法を紹介します。~
一部の記述は元のソースと異なる表記になっていることに注意してください。
***state記述を用いたステートマシン [#yb307d5a]
state記述では1つのステージ内にステートを宣言して、動作を定義します。
stage main {
state_name ifetch, exec, memex;
first_state ifetch;
state ifetch par {
setop();
goto exec;
}
state exec par {
if((OPCODE == BAL) | ((OPCODE == BZ) & opr1zero)) br_taken();
npc();
any {
br_taken : par {
alu2pc();
wb();
goto ifetch;
}
(OPCODE == LD) : par {
cla2mar();
r2grnum();
npc2pc();
goto memex;
}
(OPCODE == ST) : par {
cla2mar();
r2grnum();
npc2pc();
goto memex;
}
(OPCODE == HLT) : par {
hlt();
finish;
}
else : par {
npc2pc();
wb();
goto ifetch;
}
}
opr1set();
any {
ITYPE : I2clain1();
else : opr12clain1();
}
any {
ITYPE & (R3 == 0b00) : opr2zero();
else : opr2reg();
}
any {
(ITYPE | (OPCODE == ADD)) : aluadd();
(OPCODE == SLT) : aluslt();
(OPCODE == AND) : aluand();
(OPCODE == NOT) : alunot();
(OPCODE == SR) : alusr();
}
any {
^ITYPE : rwb();
(OPCODE == LDA) : ldawb();
(OPCODE == BAL) : balwb();
}
}
state memex par {
any {
(OPCODE == ST) : store();
(OPCODE == LD) : load();
}
goto ifetch;
wb();
}
}
***stage記述を用いたステートマシン [#ied9e0ef]
stage記述では、1つのステージに1つのステートの動作が記述されています。~
元のソースはパイプライン化をしやすいように設計されているため、こちらの記述に近いです。
stage ifetch {
par {
setop();
relay exec.do();
}
}
stage exec {
par {
if((OPCODE == BAL) | ((OPCODE == BZ) & opr1zero)) br_taken();
npc();
any {
br_taken : par {
alu2pc();
wb();
relay ifetch.do();
}
(OPCODE == LD) : par {
cla2mar();
r2grnum();
npc2pc();
relay memex.do();
}
(OPCODE == ST) : par {
cla2mar();
r2grnum();
npc2pc();
relay memex.do();
}
(OPCODE == HLT) : par {
hlt();
finish;
}
else : par {
npc2pc();
wb();
relay ifetch.do();
}
}
opr1set();
any {
ITYPE : I2clain1();
else : opr12clain1();
}
any {
ITYPE & (R3 == 0b00) : opr2zero();
else : opr2reg();
}
any {
(ITYPE | (OPCODE == ADD)) : aluadd();
(OPCODE == SLT) : aluslt();
(OPCODE == AND) : aluand();
(OPCODE == NOT) : alunot();
(OPCODE == SR) : alusr();
}
any {
^ITYPE : rwb();
(OPCODE == LDA) : ldawb();
(OPCODE == BAL) : balwb();
}
}
}
stage memex {
par {
any {
(OPCODE == ST) : store();
(OPCODE == LD) : load();
}
relay ifetch.do();
wb();
}
}
ページ名: