PICO-16 Collection
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[大和田/SFL]]
*PICO-16 Collection [#s0062dd3]
第14回ASICデザインコンテストの規定課題である"16-bit CPU"として,汎用的な命令セットを備えたPICO-16プロセッサをベースに,マルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つのアーキテクチャを設計した.コンパイラは,例題パッケージのSN/Xに含まれるコンパイラセットをベースにして,PICO-16プロセッサの命令セットで,規定されたプログラム言語をコンパイルできるようにバックエンド部を改編した.さらに,VLIW実行方式では,命令の並列化をコンパイラで行った.
PICO-16 collection is designed for the specified task "16-bit CPU" in the 14th ASIC design contest which includes multi-cycle, pipeline, VLIW, and superscalar architectures based on the PICO-16 processor with a general-purpose instruction set. Our optimized complier based on attached in the SN/X package can translate the specified program language to the PICO-16 assembly program. In the VLIW architecture, our complier generates an automatically-parallelized assembly program.
----
#contents
**背景 [#c8ff9e31]
パルテノン研究会が主催するASICデザインコンテストは,今年で第14回目を迎え,数多くの優秀な作品が応募,表彰されてきた.近年では,"16-bit CPU"の設計が規定課題として設けられ,[[IP ARCH, Inc.:http://www.ip-arch.jp/]]からダウンロード可能な例題パッケージであるSN/X及びコンパイラセットをベースとして,改良を施した作品がいくつか応募されている.
第13回ASICデザインコンテストでは,会津大学の猪狩,増田,志賀らによって設計された"いずみかわ"が,ベースとなったSN/Xと比べて28倍の性能向上を達成し最優秀賞を受賞するなど,例年,過去の作品の記録を塗り替えるように優秀な作品が次々と表彰されている.ただし,SN/Xをベースとした作品では,評価式であるエネルギー・時間積を減少させるための効果的な改良が,過去の傾向からほとんど共通していることや,公開プログラムであるバブルソートと再帰呼び出しに偏った最適化を施している作品が見受けられるようになっている.
本設計のベースとなったPICO-16プロセッサは慶應義塾大学と東京工科大学で共同開発された教育用16ビットRISCプロセッサで,長崎大学や会津大学などでも,演習の教材として使用されている.PICO-16は2オペランドの16ビット
固定長命令を持ち,SN/Xと比べて汎用レジスタが倍の8個になっている.命令セットもSN/Xにはない命令を数多く持ち,汎用性も高いことから,ASICデザインコンテストのもう一つの例題パッケージとして,コンテスト参加者により興味深い題材を提供できることが期待できる.
**設計方針 [#se609f71]
本設計は,汎用的な命令セットを備えたPICO-16プロセッサをベースとして,規定されたプログラム言語で記述された課題プログラムを実行できるプロセッサ,及びコンパイラを作成することを目標にする.
作りながら学ぶコンピュータアーキテクチャで紹介されているフル実装版PICO-16プロセッサは,割り込み制御を含む34命令が実装されている.規定課題では割り込みの処理を必要としないので,今回はサポートしない.また,規定されているプログラム言語の仕様上,ハーフワード単位でメモリアクセスする命令も必要ないのでサポートしない.
この他にも,いくつかの命令はコンパイラで生成されず,使用される機会がないが,今回は汎用的なプロセッサを目指すため,これらの命令もプロセッサではサポートする.最終的な命令セットは,これにプロセッサの動作を停止するためのHLT命令を追加した28命令をサポートすることにした.本設計のプロセッサがサポートする命令を表に示す.
| 命令 | 意味 |>|>|>| オペコード | 記述例 |
| | | [15:11] | [10:8] | [7:5] | [4:0] | |
| NOP | No operation | 0 | rd | rs | 0 | nop |
| MV | Move | 0 | rd | rs | 1 | mv r1, r2 |
| AND | And | 0 | rd | rs | 2 | and r1, r2 |
| OR | Or | 0 | rd | rs | 3 | or r1, r2 |
| XOR | Exclusive or | 0 | rd | rs | 4 | xor r1, r2 |
| NOT | Not | 0 | rd | rs | 5 | not r1, r2 |
| ADD | Add | 0 | rd | rs | 6 | add r1, r2 |
| SUB | Subtract | 0 | rd | rs | 7 | sub r1, r2 |
| LD | Load | 0 | rd | rs | 8 | ld r1, (r2) |
| ST | Store | 0 | rd | rs | 9 | st (r1), r2 |
| SL | Shift left | 0 | rd | rs | 12 | sl r1, r2 |
| SR | Shift right | 0 | rd | rs | 13 | sr r1, r2 |
| ANDI | And immediate | 2 | rd |>| immediate | andi r1, #10 |
| ORI | Or immediate | 3 | rd |>| immediate | ori r1, #10 |
| XORI | Exclusive or immediate | 4 | rd |>| immediate | xori r1, #10 |
| ADDI | Add immediate | 6 | rd |>| immediate | addi r1, #10 |
| SUBI | Subtract immediate | 7 | rd |>| immediate | subi r1, #10 |
| JALR | Jump and link register | 8 | rd |>| 0 | jalr r1 |
| BNEZ | Branch on not equal to zero | 9 | rd |>| immediate | bnez r1, L001 |
| BEQZ | Branch on equal to zero | 10 | rd |>| immediate | beqz r1, L001 |
| BMI | Branch on minus | 11 | rd |>| immediate | bmi r1, L001 |
| BPL | Branch on plus | 12 | rd |>| immediate | bpl r1, L001 |
| JAL | Jump and link | 13 |>|>| offset address | jal L001 |
| JR | Jump register | 14 | rd |>| 0 | jr r1 |
| JMP | Jump | 15 |>|>| offset address | jmp L001 |
| LDLI | Load low immediate | 28 | rd |>| immediate | ldli r1, #10 |
| LDHI | Load high immediate | 29 | rd |>| immediate | ldhi r1, #10 |
| HLT | Halt | 31 |>|>| 0 | hlt |
また,プロセッサのアーキテクチャとしては以下の4つの実行方式で動くプロセッサを設計して,それぞれ評価を行う.
-マルチサイクル実行方式
-パイプライン実行方式
-VLIW実行方式
-スーパースケーラ実行方式
マルチサイクル実行方式,パイプライン実行方式については,作りながら学ぶコンピュータアーキテクチャに実装方法について詳しく紹介されている.
VLIW実行方式とスーパースケーラ実行方式については,最大2命令同時発行をサポートする.VLIWとスーパースケーラは命令同時発行の制御方式が異なる.VLIWではコンパイラで命令の並列化をサポートし,スーパースケーラではハードウェアでサポートする.
**プロセッサアーキテクチャ [#t0019d9f]
8つの汎用レジスタを持ち,2オペランドの16ビット固定長の命令セットを持つ.メモリアクセスはワード単位のみで,バイト単位でアクセスする命令はサポートしていない.
命令セットは表に示した通りで,課題プログラムを高速に実行するための命令は追加せず,PICO-16の命令セットに準拠している.この命令セットはコンパイラで生成されない命令を含む.
8つの汎用レジスタはスタックポインタやリターンアドレスレジスタを含む他,コンパイラで以下の表で示した役割を持たせる.これは,コンパイラでアセンブリプログラムを生成する際にサブルーチンコールなどで使用される役割で,ユーザーが手書きでアセンブリプログラムを書く際には,全て汎用レジスタとして扱うことができる.ただし,ハードウェア的にr7レジスタはリターンアドレスレジスタとして扱うため,注意が必要である.
|レジスタ名 | 役割 |
|r0 | 汎用レジスタ (インデックスレジスタ)|
|r1 | 汎用レジスタ (関数の引数を格納するレジスタ)|
|r2 | 汎用レジスタ (関数の戻り値を格納するレジスタ)|
|r3 | 汎用レジスタ|
|r4 | 汎用レジスタ|
|r5 | 汎用レジスタ|
|r6 | スタックポインタレジスタ|
|r7 | リターンアドレスレジスタ|
これらのPICO-16の基本設計を踏襲し,マルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つのアーキテクチャを設計し,それぞれの性能を検証する.
***マルチサイクル実行方式 [#u5f75f77]
1つの命令は3クロックまたは4クロックのマルチサイクルで実行され,ステートマシンはIF,RF,EX,EX2の4つで構成されている.以下では,それぞれのステートの動作の概略を説明する.
-IF (Instruction fetch)
--命令メモリから命令コードを読み込む.
-RF (Register fetch)
--プログラムカウンタをインクリメントする.
--レジスタファイルから使用するレジスタのデータを読み込む.
--ST命令は,データメモリに書き込むデータを決定する.
-EX (Execution)
--命令をデコードし,実行する.
--レジスタファイルへのライトバックを行う.
--JALR, JAL, LD, ST命令はEX2ステートへ遷移する.
-EX2 (Execution 2)
--プログラムカウンタの更新を行う.
--LD, ST命令はデータメモリへのメモリアクセスを行う.
--レジスタファイルへのライトバックを行う.
JALR, JAL, LD, ST命令は4クロックで動作し,他の命令は3クロックで動作する.マルチサイクル実行のため,算術論理演算以外に,プログラムカウンタのインクリメントや分岐アドレスの計算などは全てALUで計算することができる.レジスタファイルは2ポートの読み込みと1ポートの書き込みをサポートする.マルチサイクル実行方式では,読み込みと書き込みが同時に起こらないため,4つの設計の中で最も簡単な記述になった.
PARTHENONシステムを用いた論理合成後のレポートで,クリティカルパスはALUの加算器であることが分かったため,並列プレフィクス加算器であるHan-Carlson加算器を使用した.
***パイプライン実行方式 [#hb169f6c]
パイプラインは4段として設計し,パイプラインステージの名称はIF, ID, EX, WBとした.以下の図にパイプライン実行方式のプロセッサの全体図を示す.
CENTER:&ref(pico16p.png);
以下では,それぞれのステージの動作の概略を説明する.
-IF (Instruction fetch)
--命令メモリから命令コードを読み込む.
--プログラムカウンタをインクリメントする.
-ID (Instruction decode)
--レジスタファイルから使用するレジスタのデータを読み込む.
--命令をデコードする.
--分岐命令の分岐判定を行い,分岐アドレスを算出する.
-EX (Execution)
--デコードされた情報に従い,命令を実行する.
--LD, ST命令はデータメモリへのメモリアクセスを行う.
-WB (Write back)
--レジスタファイルへのライトバックを行う
このパイプラインではデータハザードと制御ハザードが発生する.命令間のレジスタの依存関係があるときに発生するデータハザードは,フォワーディングによって解決した.実装したフォワーディングパスはEX->ID, WB->IDの2つである.
分岐成立による制御ハザードは,パイプラインのフラッシュによって解決した.マルチサイクル方式では3クロック目のステートで分岐判定を行っていたが,このパイプライン実行方式ではフラッシュのコスト削減のため,分岐判定はIDステージで行っている.これにより分岐成立時のフラッシュのコストを1命令に削減することができた.
パイプラインの実行の様子を図に示す.このパイプラインでは,Instruction 4が読み込まれるときに4段のパイプラインが全て駆動するので,Instruction 5以降は見かけ上1つの命令を1クロックで実行することができる.
CENTER:&ref(pipeline.png);
マルチサイクル実行方式と同じく,クリティカルパスはALUの加算器であったため,Han-Carlson加算器を使用した.また,分岐アドレス算出のための加算器はクリティカルパスではなかったので,より少ない回路規模で実現できる並列プレフィクス加算器であるBrent-Kung加算器を使用した.
***VLIW実行方式 [#p70ce863]
VLIW実行方式では,最大2命令同時発行をサポートする.ベースとなっているのはパイプライン実行方式で紹介した4段のパイプラインで,これに実行ユニットを1つ追加した.ベースとなっている実行ユニットをスロット1,追加した実行ユニットをスロット2とする.以下の図にVLIW実行方式のプロセッサの全体図を示す.
CENTER:&ref(pico16v.eps);
以下では,それぞれのスロットで実行可能な命令を説明する.
-スロット1
--全ての命令を実行可能.
-スロット2
--算術論理演算命令,即値ロード命令を実行可能.
--分岐命令,メモリアクセス命令,HLT命令は実行不可.
分岐命令,メモリアクセス命令,HLT命令はスロット1でのみ実行可能とし,分岐成立時にはスロット2の命令をフラッシュする.命令間で依存関係がない場合は2命令同時発行ができるが,1命令しか発行できない場合はスロット2ではNOP命令が実行される.実行するプログラムはアセンブリプログラム生成の際にコンパイラが命令の依存関係を解析し,2命令同時発行するか,NOP命令を挿入するか判断する.
2命令同時発行パイプラインの様子を以下の図に示す.
CENTER:&ref(pipeline_ss.eps);
IFステージでは,プログラムカウンタは常に2ずつ増加する.これは命令メモリからの命令コードの読み込みを常に2ワードずつ行うためである.
パイプライン実行方式と同じく,ALUの加算器にはHan-Carlson加算器を,分岐アドレス算出のための加算器はBrent-Kung加算器を使用した.レジスタファイルは4ポートの読み込みと2ポートの書き込みをサポートした.
***スーパースケーラ実行方式 [#b81258a6]
スーパースケーラ実行方式の構造は,VLIW実行方式と同じである.異なる点として,命令の依存関係をコンパイラではなく,ハードウェアで行っていることである.
IFステージでは,現在のプログラムカウンタから連続した2ワードの命令コードを読み込み,2命令同時発行が可能ならプログラムカウンタを2進める.そうでなかった場合は,スロット1にアドレスが小さい命令を発行し,一方の命令はNOP命令に置き換えて発行する.この際は,プログラムカウンタを1進める.また,スロット1とスロット2へ割り当てる命令を逆にすれば同時発行が可能な場合は,2つの命令を入れ換えて命令を発行する.ただし,今回の課題プログラムでは性能向上には至らなかった.
再帰呼び出しを例に,アセンブリプログラムと,その2命令同時発行の様子を示す.
ldli r6, #127
ldli r1, #5
jal foo
ldli r0, #1
st (r0), r2
hlt
jmp L000
foo:
st (r6), r7
subi r6, #1
st (r6), r5
subi r6, #1
st (r6), r4
subi r6, #1
...
PC:0000 [slot 1] ldli r6, #127 [slot 2] ldli r1, #5 -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0002 [slot 1] jal 4 [slot 2] nop -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0003 [slot 1] ldli r0, #1 [slot 2] nop -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0007 [slot 1] st (r6), r7 [slot 2] subi r6, #1 -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0009 [slot 1] st (r6), r5 [slot 2] subi r6, #1 -- r0:0000 r1:0005 r2:0000 r3:0000 r4:0000 r5:0000 r6:007f r7:0000
PC:000b [slot 1] st (r6), r4 [slot 2] subi r6, #1 -- r0:0000 r1:0005 r2:0000 r3:0000 r4:0000 r5:0000 r6:007f r7:0003
...
命令間で依存関係のない場合は2命令同時発行ができているのが分かる.
**コンパイラ [#dd57b29b]
字句解析,構文解析,木構造の生成など基本的なプログラムは例題パッケージのSN/Xに含まれるコンパイラセットをベースにした.PICO-16プロセッサの命令セットで,規定されたプログラム言語をコンパイルすることができるようにバックエンド部を改編した.
また,PICO-16プロセッサが持つ8つの汎用レジスタを使用可能にするために最低限の機能を実装した.大小比較などはPICO-16プロセッサの命令セットにある命令を組み合わせて実現しているが,SN/Xと比べると命令数が増大している.
***レジスタ管理機構 [#l2574773]
8つの汎用レジスタを有効に使用するため,レジスタ管理機構の実装を検討した.この機構の実現のために,バックエンド部のプログラム内にレジスタ管理テーブルを実装している.このテーブルには,命令生成の際に汎用レジスタに,どのような値が格納されているのかを監視し,変数や即値の汎用レジスタへの割り当てを制御する機能を持っている.これにより,無駄な変数ロードや即値ロードを抑制することができる.
***変数と定数の加減算の改良 [#m784acbb]
変数と定数の加減算を行う際には,まず変数と定数をそれぞれレジスタにロード
してから,演算を行っていた.構文木解析でこのような木構造だと判断した際に
は,子のノードを展開せずにADDI, SUBIを用いて1命令で置き換えることで,命
令数を削減することができた.
***VLIW実行方式のための命令の並列化 [#h741cddf]
VLIW実行方式では,命令の並列化をコンパイラが行う必要がある.このため,VLIW実行方式のコンパイラには,自動命令並列化の機能を実装した.
バックエンド部がアセンブリプログラムを書き出す際に,命令間の依存関係を調べ,2命令同時発行ができるならば命令をそのまま書き出し,同時発行ができない場合はNOP命令を自動的に挿入する.命令間の依存関係を判断するルールはスーパースケーラ実行方式がハードウェアとして実装しているものと同じだが,分岐命令の関係上,ラベルをまたいだ命令間で同時発行を判断することができない.このため,コンパイラが生成するVLIW実行方式のアセンブリプログラムの実行クロック数はスーパースケーラ実行方式と同じになるとは限らない.
コンパイラによって自動並列化されたプログラムを示す.
ldli r6, #127
ldli r1, #5
jal foo
nop ### inserted by complier ###
ldli r0, #1
nop ### inserted by complier ###
st (r0), r2
nop ### inserted by complier ###
hlt
nop ### inserted by complier ###
jmp L000
nop ### inserted by complier ###
foo:
st (r6), r7
subi r6, #1
st (r6), r5
subi r6, #1
st (r6), r4
subi r6, #1
...
命令間の依存などで,2命令同時発行ができない場合はNOP命令を自動的に挿入していることがわかる.
さらに,命令間の依存関係を深く調査し,命令の実行順序を入れ換えることで命令レベルの並列性を向上させることを検討したが,コンパイラで生成されるアセンブリプログラムでは命令間の依存関係が多く,性能向上が期待できなかったため,今回は実装を見送った.
**論理合成 [#rfcb5aab]
論理合成はPARTHENONシステムを用いて行うが,autoコマンドで自動生成されるスクリプトファイルに手を加えることで,回路の性能を大幅に向上させることが期待できる.
過去の改良を見ると,外部からの入力ピンの遅延時間を0nsにするなどの例があったが,これは非現実的なものである.本設計では,サイクル時間の指定と,クロック入力端子の負荷容量の変更のみを行い,入力ピンの遅延時間はデフォルトの20nsとして合成を行った.
**動作検証 [#e2c5f180]
過去のASICデザインコンテストに応募された作品が使用していたテストプログラム,及び課題プログラムの合計5つのプログラムを用いて,CPUおよびコンパイラが正常に動作しているかを検討した.使用したプログラムの概要を示す.
-比較演算の検証 (compare.pc)
-直接挿入法によるソーティング (direct.pc)
-再帰法によるフィボナッチ数列の計算 (fibo.pc)
-再帰呼び出し課題プログラム (recur.pc)
-バブルソート課題プログラム (sort.pc)
**評価 [#x1332030]
IP ARCH, Inc. より配布されている例題パッケージであるSN/Xと,今回設計したマルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つのPICO-16プロセッサの評価結果を表に示す.課題プログラムである再帰呼び出しとバブルソートの実行クロック数とプロセッサの最大遅延,消費電力からエネルギー・時間積を算出し,評価値として使用した.
ここでは,マルチサイクル実行方式をpico-16m,パイプライン実行方式をpico-16p,VLIW実行方式をpico-16v,スーパースケーラ実行方式をpico-16ssとして掲載した.
コンパイラはVLIW実行方式を除いては同じものを使用している.VLIW実行方式はコンパイラで命令の並列化を行った.
||SN/X|PICO-16m|PICO-16p|PICO-16v|PICO-16ss|
|recur [クロック数]|RIGHT:323|RIGHT:879|RIGHT:297|RIGHT:214|RIGHT:214|
|sort [クロック数]|RIGHT:26,216|RIGHT:33,851|RIGHT:10,927|RIGHT:8,313|RIGHT:8,102|
|最大遅延[ns]|RIGHT:63.6|RIGHT:41.9|RIGHT:50.9|RIGHT:54.8|RIGHT:53.7|
|消費電力[μW/MHz]|RIGHT:5,680|RIGHT:11,700|RIGHT:13,982|RIGHT:24,408|RIGHT:25,732|
|エネルギー・時間積[nJ·s]|RIGHT:3.06|RIGHT:14.59|RIGHT:2.31|RIGHT:2.38|RIGHT:2.40|
|性能向上比|1|0.21|1.33|1.29|1.28|
最もエネルギー・時間積の値が優れていたのはパイプライン実行方式で,オリジナルのSN/Xと比べると約1.33倍の性能向上となった.VLIW実行方式やスーパースケーラ実行方式では,実行クロック数は削減できたものの,追加したハードウェアによって消費電力が増大してしまったため,エネルギー・時間積の性能向上には至らなかった.
また,VLIW実行方式とスーパースケーラ実行方式では,バブルソートの課題プログラムを実行したときに実行クロック数に違いが出た.VLIW実行方式ではコンパイラが命令の並列化を行っているが,分岐命令の分岐先であるラベルをまたいだ命令間で同時発行の判断ができないためである.
**考察 [#c771e910]
結果として,本設計のベースとしたマルチサイクル実行方式のPICO-16プロセッサはエネルギー・時間積を大きくなってしまった.パイプライン化やスーパースケーラ化を行ったが,大きな性能向上は見られなかった.この章では,それぞれのパラメータについて,その原因の考察を行う.
***実行クロック [#pfeb8816]
再帰呼び出しでは,サブルーチンコールの際に汎用レジスタのスタックへの退避を行うが,退避すべきレジスタが多いため,再帰のコストが増加している.また,マルチサイクル実行方式では,PICO-16の命令の実行サイクルが3または4サイクルであり,SN/Xの2または3サイクルより多くなっている.よって同じ命令数でも,PICO-16の方が実行クロック数が多くなっている.この問題はパイプライン化によって解決できた.また,今回は行わなかったが,PICO-16には汎用レジスタが8個あるため,コンパイラがうまくレジスタに変数を割り当てることができれば,ロード・ストアの回数を大幅に減少することが期待できる.
また,規定されたプログラム言語をコンパイルする際に,いくつかの演算子の動作は特定の命令と対応していないので,PICO-16プロセッサの命令の組み合わせで実現している部分が多く,生成命令数が増大してしまった.さらに,PICO-16プロセッサはレジスタ間接アドレッシングでメモリアクセスを行うため,メモリアクセスを頻繁に行うプログラムを実行する際は,発行命令数が増えてしまう傾向がある.これらの問題は,規定されたプログラム言語を実行するために適した拡張命令を実装すれば解決できるはずである.
***最大遅延 [#h8e1e19a]
パイプライン化によってある程度改善できたものの,パイプラインの段数に比べて,思ったより性能向上が見られなかった.PARTHENONシステムの論理合成後のレポートでは,フォワーディングパスがクリティカルパスとなっているので,パイプラインの設計を見直せば高速化が期待できるかもしれない.
また,論理合成時にALUの加算器などクリティカルパスになっているモジュールをfrzsコマンドにより凍結させることで,OPT\_MAPによる回路簡略化を行わない手法がある.これにより,全体の最大遅延を向上させることができる.ただし,全体の消費電力とはトレードオフの関係になっているので,エネルギー・時間積の値が向上するとは限らない.
***消費電力 [#v4876f12]
SN/Xと比べて2倍以上の消費電力になっている.PICO-16では汎用レジスタを8個確保したことや,SN/Xと比べてもPICO-16は多くの命令をサポートしているため,データパス部や制御回路の回路面積が増加し,消費電力も大きくなっていると考えられる.
***エネルギー・時間積 [#a251b131]
今回の設計にあたって,エネルギー・時間積の結果が増大するか減少するかは考慮せずに改良を行った.本コンテストの評価式であるエネルギー・時間積は,プロセッサにハードウェアを追加して,プログラムの実行クロックを削減しても,全体の消費電力が増大してしまえば評価値を逆に下げてしまう可能性がある.本設計では,スーパースケーラ化を行った際に,それが顕著に現れている.これは,追加したハードウェアに見合う実行クロック削減ができていないとも言える.しかし,近年のコンテストに提出された作品に見られるエネルギー・時間積を削減するためだけの改良では,プロセッサ自体の汎用性が失われがちである.
**総括 [#maf8732e]
第14回ASICデザインコンテストの規定課題である"16-bit CPU"に応募するにあたって,教育用16ビットRISCプロセッサであるPICO-16プロセッサをベースに設計を行った.
設計したプロセッサのアーキテクチャはマルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つで,汎用的な命令セットを備えている.
コンパイラは,例題パッケージのSN/Xに含まれるコンパイラセットをベースにして,PICO-16プロセッサの命令セットで,規定されたプログラム言語をコンパイルできるようにバックエンド部を改編した.また,8つの汎用レジスタを使用可能にするための最低限の機能を実装し,変数と定数の加減算の改良を行った.さらに,VLIW実行方式では,命令の並列化をコンパイラで行った.
**感想 [#x0288e29]
第14回ASICデザインコンテストへの応募を決めたのは,締切りを延長するというアナウンスを聞いた4月1日のことであった.本来の締切りを過ぎた後に,急に思い立ったエントリーであるが,非常に面白い経験になった.
参考までに,プロセッサの設計にかかった時間は2日,コンパイラの設計にかかった時間は2日,そして,ドキュメントの執筆は2日で行った.合計として3日間で全ての設計を完了した.ただし,プロセッサとコンパイラに関しては,ベースとなった設計があり,それに改良を加えた形になる.
SN/XやPICOプロセッサを通じて,コンピュータアーキテクチャを楽しく勉強することができ,プロセッサの設計について大いに理解することができた.このようなプロセッサを考案された清水先生や天野先生,パルテノンASICデザインコンテスト実行委員会,およびパルテノン研究会関係者の皆様には心から深く感謝致します.
**提出したドキュメント [#le076782]
&ref(第14回ASICデザインコンテスト/pico16col.pdf);
終了行:
[[大和田/SFL]]
*PICO-16 Collection [#s0062dd3]
第14回ASICデザインコンテストの規定課題である"16-bit CPU"として,汎用的な命令セットを備えたPICO-16プロセッサをベースに,マルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つのアーキテクチャを設計した.コンパイラは,例題パッケージのSN/Xに含まれるコンパイラセットをベースにして,PICO-16プロセッサの命令セットで,規定されたプログラム言語をコンパイルできるようにバックエンド部を改編した.さらに,VLIW実行方式では,命令の並列化をコンパイラで行った.
PICO-16 collection is designed for the specified task "16-bit CPU" in the 14th ASIC design contest which includes multi-cycle, pipeline, VLIW, and superscalar architectures based on the PICO-16 processor with a general-purpose instruction set. Our optimized complier based on attached in the SN/X package can translate the specified program language to the PICO-16 assembly program. In the VLIW architecture, our complier generates an automatically-parallelized assembly program.
----
#contents
**背景 [#c8ff9e31]
パルテノン研究会が主催するASICデザインコンテストは,今年で第14回目を迎え,数多くの優秀な作品が応募,表彰されてきた.近年では,"16-bit CPU"の設計が規定課題として設けられ,[[IP ARCH, Inc.:http://www.ip-arch.jp/]]からダウンロード可能な例題パッケージであるSN/X及びコンパイラセットをベースとして,改良を施した作品がいくつか応募されている.
第13回ASICデザインコンテストでは,会津大学の猪狩,増田,志賀らによって設計された"いずみかわ"が,ベースとなったSN/Xと比べて28倍の性能向上を達成し最優秀賞を受賞するなど,例年,過去の作品の記録を塗り替えるように優秀な作品が次々と表彰されている.ただし,SN/Xをベースとした作品では,評価式であるエネルギー・時間積を減少させるための効果的な改良が,過去の傾向からほとんど共通していることや,公開プログラムであるバブルソートと再帰呼び出しに偏った最適化を施している作品が見受けられるようになっている.
本設計のベースとなったPICO-16プロセッサは慶應義塾大学と東京工科大学で共同開発された教育用16ビットRISCプロセッサで,長崎大学や会津大学などでも,演習の教材として使用されている.PICO-16は2オペランドの16ビット
固定長命令を持ち,SN/Xと比べて汎用レジスタが倍の8個になっている.命令セットもSN/Xにはない命令を数多く持ち,汎用性も高いことから,ASICデザインコンテストのもう一つの例題パッケージとして,コンテスト参加者により興味深い題材を提供できることが期待できる.
**設計方針 [#se609f71]
本設計は,汎用的な命令セットを備えたPICO-16プロセッサをベースとして,規定されたプログラム言語で記述された課題プログラムを実行できるプロセッサ,及びコンパイラを作成することを目標にする.
作りながら学ぶコンピュータアーキテクチャで紹介されているフル実装版PICO-16プロセッサは,割り込み制御を含む34命令が実装されている.規定課題では割り込みの処理を必要としないので,今回はサポートしない.また,規定されているプログラム言語の仕様上,ハーフワード単位でメモリアクセスする命令も必要ないのでサポートしない.
この他にも,いくつかの命令はコンパイラで生成されず,使用される機会がないが,今回は汎用的なプロセッサを目指すため,これらの命令もプロセッサではサポートする.最終的な命令セットは,これにプロセッサの動作を停止するためのHLT命令を追加した28命令をサポートすることにした.本設計のプロセッサがサポートする命令を表に示す.
| 命令 | 意味 |>|>|>| オペコード | 記述例 |
| | | [15:11] | [10:8] | [7:5] | [4:0] | |
| NOP | No operation | 0 | rd | rs | 0 | nop |
| MV | Move | 0 | rd | rs | 1 | mv r1, r2 |
| AND | And | 0 | rd | rs | 2 | and r1, r2 |
| OR | Or | 0 | rd | rs | 3 | or r1, r2 |
| XOR | Exclusive or | 0 | rd | rs | 4 | xor r1, r2 |
| NOT | Not | 0 | rd | rs | 5 | not r1, r2 |
| ADD | Add | 0 | rd | rs | 6 | add r1, r2 |
| SUB | Subtract | 0 | rd | rs | 7 | sub r1, r2 |
| LD | Load | 0 | rd | rs | 8 | ld r1, (r2) |
| ST | Store | 0 | rd | rs | 9 | st (r1), r2 |
| SL | Shift left | 0 | rd | rs | 12 | sl r1, r2 |
| SR | Shift right | 0 | rd | rs | 13 | sr r1, r2 |
| ANDI | And immediate | 2 | rd |>| immediate | andi r1, #10 |
| ORI | Or immediate | 3 | rd |>| immediate | ori r1, #10 |
| XORI | Exclusive or immediate | 4 | rd |>| immediate | xori r1, #10 |
| ADDI | Add immediate | 6 | rd |>| immediate | addi r1, #10 |
| SUBI | Subtract immediate | 7 | rd |>| immediate | subi r1, #10 |
| JALR | Jump and link register | 8 | rd |>| 0 | jalr r1 |
| BNEZ | Branch on not equal to zero | 9 | rd |>| immediate | bnez r1, L001 |
| BEQZ | Branch on equal to zero | 10 | rd |>| immediate | beqz r1, L001 |
| BMI | Branch on minus | 11 | rd |>| immediate | bmi r1, L001 |
| BPL | Branch on plus | 12 | rd |>| immediate | bpl r1, L001 |
| JAL | Jump and link | 13 |>|>| offset address | jal L001 |
| JR | Jump register | 14 | rd |>| 0 | jr r1 |
| JMP | Jump | 15 |>|>| offset address | jmp L001 |
| LDLI | Load low immediate | 28 | rd |>| immediate | ldli r1, #10 |
| LDHI | Load high immediate | 29 | rd |>| immediate | ldhi r1, #10 |
| HLT | Halt | 31 |>|>| 0 | hlt |
また,プロセッサのアーキテクチャとしては以下の4つの実行方式で動くプロセッサを設計して,それぞれ評価を行う.
-マルチサイクル実行方式
-パイプライン実行方式
-VLIW実行方式
-スーパースケーラ実行方式
マルチサイクル実行方式,パイプライン実行方式については,作りながら学ぶコンピュータアーキテクチャに実装方法について詳しく紹介されている.
VLIW実行方式とスーパースケーラ実行方式については,最大2命令同時発行をサポートする.VLIWとスーパースケーラは命令同時発行の制御方式が異なる.VLIWではコンパイラで命令の並列化をサポートし,スーパースケーラではハードウェアでサポートする.
**プロセッサアーキテクチャ [#t0019d9f]
8つの汎用レジスタを持ち,2オペランドの16ビット固定長の命令セットを持つ.メモリアクセスはワード単位のみで,バイト単位でアクセスする命令はサポートしていない.
命令セットは表に示した通りで,課題プログラムを高速に実行するための命令は追加せず,PICO-16の命令セットに準拠している.この命令セットはコンパイラで生成されない命令を含む.
8つの汎用レジスタはスタックポインタやリターンアドレスレジスタを含む他,コンパイラで以下の表で示した役割を持たせる.これは,コンパイラでアセンブリプログラムを生成する際にサブルーチンコールなどで使用される役割で,ユーザーが手書きでアセンブリプログラムを書く際には,全て汎用レジスタとして扱うことができる.ただし,ハードウェア的にr7レジスタはリターンアドレスレジスタとして扱うため,注意が必要である.
|レジスタ名 | 役割 |
|r0 | 汎用レジスタ (インデックスレジスタ)|
|r1 | 汎用レジスタ (関数の引数を格納するレジスタ)|
|r2 | 汎用レジスタ (関数の戻り値を格納するレジスタ)|
|r3 | 汎用レジスタ|
|r4 | 汎用レジスタ|
|r5 | 汎用レジスタ|
|r6 | スタックポインタレジスタ|
|r7 | リターンアドレスレジスタ|
これらのPICO-16の基本設計を踏襲し,マルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つのアーキテクチャを設計し,それぞれの性能を検証する.
***マルチサイクル実行方式 [#u5f75f77]
1つの命令は3クロックまたは4クロックのマルチサイクルで実行され,ステートマシンはIF,RF,EX,EX2の4つで構成されている.以下では,それぞれのステートの動作の概略を説明する.
-IF (Instruction fetch)
--命令メモリから命令コードを読み込む.
-RF (Register fetch)
--プログラムカウンタをインクリメントする.
--レジスタファイルから使用するレジスタのデータを読み込む.
--ST命令は,データメモリに書き込むデータを決定する.
-EX (Execution)
--命令をデコードし,実行する.
--レジスタファイルへのライトバックを行う.
--JALR, JAL, LD, ST命令はEX2ステートへ遷移する.
-EX2 (Execution 2)
--プログラムカウンタの更新を行う.
--LD, ST命令はデータメモリへのメモリアクセスを行う.
--レジスタファイルへのライトバックを行う.
JALR, JAL, LD, ST命令は4クロックで動作し,他の命令は3クロックで動作する.マルチサイクル実行のため,算術論理演算以外に,プログラムカウンタのインクリメントや分岐アドレスの計算などは全てALUで計算することができる.レジスタファイルは2ポートの読み込みと1ポートの書き込みをサポートする.マルチサイクル実行方式では,読み込みと書き込みが同時に起こらないため,4つの設計の中で最も簡単な記述になった.
PARTHENONシステムを用いた論理合成後のレポートで,クリティカルパスはALUの加算器であることが分かったため,並列プレフィクス加算器であるHan-Carlson加算器を使用した.
***パイプライン実行方式 [#hb169f6c]
パイプラインは4段として設計し,パイプラインステージの名称はIF, ID, EX, WBとした.以下の図にパイプライン実行方式のプロセッサの全体図を示す.
CENTER:&ref(pico16p.png);
以下では,それぞれのステージの動作の概略を説明する.
-IF (Instruction fetch)
--命令メモリから命令コードを読み込む.
--プログラムカウンタをインクリメントする.
-ID (Instruction decode)
--レジスタファイルから使用するレジスタのデータを読み込む.
--命令をデコードする.
--分岐命令の分岐判定を行い,分岐アドレスを算出する.
-EX (Execution)
--デコードされた情報に従い,命令を実行する.
--LD, ST命令はデータメモリへのメモリアクセスを行う.
-WB (Write back)
--レジスタファイルへのライトバックを行う
このパイプラインではデータハザードと制御ハザードが発生する.命令間のレジスタの依存関係があるときに発生するデータハザードは,フォワーディングによって解決した.実装したフォワーディングパスはEX->ID, WB->IDの2つである.
分岐成立による制御ハザードは,パイプラインのフラッシュによって解決した.マルチサイクル方式では3クロック目のステートで分岐判定を行っていたが,このパイプライン実行方式ではフラッシュのコスト削減のため,分岐判定はIDステージで行っている.これにより分岐成立時のフラッシュのコストを1命令に削減することができた.
パイプラインの実行の様子を図に示す.このパイプラインでは,Instruction 4が読み込まれるときに4段のパイプラインが全て駆動するので,Instruction 5以降は見かけ上1つの命令を1クロックで実行することができる.
CENTER:&ref(pipeline.png);
マルチサイクル実行方式と同じく,クリティカルパスはALUの加算器であったため,Han-Carlson加算器を使用した.また,分岐アドレス算出のための加算器はクリティカルパスではなかったので,より少ない回路規模で実現できる並列プレフィクス加算器であるBrent-Kung加算器を使用した.
***VLIW実行方式 [#p70ce863]
VLIW実行方式では,最大2命令同時発行をサポートする.ベースとなっているのはパイプライン実行方式で紹介した4段のパイプラインで,これに実行ユニットを1つ追加した.ベースとなっている実行ユニットをスロット1,追加した実行ユニットをスロット2とする.以下の図にVLIW実行方式のプロセッサの全体図を示す.
CENTER:&ref(pico16v.eps);
以下では,それぞれのスロットで実行可能な命令を説明する.
-スロット1
--全ての命令を実行可能.
-スロット2
--算術論理演算命令,即値ロード命令を実行可能.
--分岐命令,メモリアクセス命令,HLT命令は実行不可.
分岐命令,メモリアクセス命令,HLT命令はスロット1でのみ実行可能とし,分岐成立時にはスロット2の命令をフラッシュする.命令間で依存関係がない場合は2命令同時発行ができるが,1命令しか発行できない場合はスロット2ではNOP命令が実行される.実行するプログラムはアセンブリプログラム生成の際にコンパイラが命令の依存関係を解析し,2命令同時発行するか,NOP命令を挿入するか判断する.
2命令同時発行パイプラインの様子を以下の図に示す.
CENTER:&ref(pipeline_ss.eps);
IFステージでは,プログラムカウンタは常に2ずつ増加する.これは命令メモリからの命令コードの読み込みを常に2ワードずつ行うためである.
パイプライン実行方式と同じく,ALUの加算器にはHan-Carlson加算器を,分岐アドレス算出のための加算器はBrent-Kung加算器を使用した.レジスタファイルは4ポートの読み込みと2ポートの書き込みをサポートした.
***スーパースケーラ実行方式 [#b81258a6]
スーパースケーラ実行方式の構造は,VLIW実行方式と同じである.異なる点として,命令の依存関係をコンパイラではなく,ハードウェアで行っていることである.
IFステージでは,現在のプログラムカウンタから連続した2ワードの命令コードを読み込み,2命令同時発行が可能ならプログラムカウンタを2進める.そうでなかった場合は,スロット1にアドレスが小さい命令を発行し,一方の命令はNOP命令に置き換えて発行する.この際は,プログラムカウンタを1進める.また,スロット1とスロット2へ割り当てる命令を逆にすれば同時発行が可能な場合は,2つの命令を入れ換えて命令を発行する.ただし,今回の課題プログラムでは性能向上には至らなかった.
再帰呼び出しを例に,アセンブリプログラムと,その2命令同時発行の様子を示す.
ldli r6, #127
ldli r1, #5
jal foo
ldli r0, #1
st (r0), r2
hlt
jmp L000
foo:
st (r6), r7
subi r6, #1
st (r6), r5
subi r6, #1
st (r6), r4
subi r6, #1
...
PC:0000 [slot 1] ldli r6, #127 [slot 2] ldli r1, #5 -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0002 [slot 1] jal 4 [slot 2] nop -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0003 [slot 1] ldli r0, #1 [slot 2] nop -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0007 [slot 1] st (r6), r7 [slot 2] subi r6, #1 -- r0:0000 r1:0000 r2:0000 r3:0000 r4:0000 r5:0000 r6:0000 r7:0000
PC:0009 [slot 1] st (r6), r5 [slot 2] subi r6, #1 -- r0:0000 r1:0005 r2:0000 r3:0000 r4:0000 r5:0000 r6:007f r7:0000
PC:000b [slot 1] st (r6), r4 [slot 2] subi r6, #1 -- r0:0000 r1:0005 r2:0000 r3:0000 r4:0000 r5:0000 r6:007f r7:0003
...
命令間で依存関係のない場合は2命令同時発行ができているのが分かる.
**コンパイラ [#dd57b29b]
字句解析,構文解析,木構造の生成など基本的なプログラムは例題パッケージのSN/Xに含まれるコンパイラセットをベースにした.PICO-16プロセッサの命令セットで,規定されたプログラム言語をコンパイルすることができるようにバックエンド部を改編した.
また,PICO-16プロセッサが持つ8つの汎用レジスタを使用可能にするために最低限の機能を実装した.大小比較などはPICO-16プロセッサの命令セットにある命令を組み合わせて実現しているが,SN/Xと比べると命令数が増大している.
***レジスタ管理機構 [#l2574773]
8つの汎用レジスタを有効に使用するため,レジスタ管理機構の実装を検討した.この機構の実現のために,バックエンド部のプログラム内にレジスタ管理テーブルを実装している.このテーブルには,命令生成の際に汎用レジスタに,どのような値が格納されているのかを監視し,変数や即値の汎用レジスタへの割り当てを制御する機能を持っている.これにより,無駄な変数ロードや即値ロードを抑制することができる.
***変数と定数の加減算の改良 [#m784acbb]
変数と定数の加減算を行う際には,まず変数と定数をそれぞれレジスタにロード
してから,演算を行っていた.構文木解析でこのような木構造だと判断した際に
は,子のノードを展開せずにADDI, SUBIを用いて1命令で置き換えることで,命
令数を削減することができた.
***VLIW実行方式のための命令の並列化 [#h741cddf]
VLIW実行方式では,命令の並列化をコンパイラが行う必要がある.このため,VLIW実行方式のコンパイラには,自動命令並列化の機能を実装した.
バックエンド部がアセンブリプログラムを書き出す際に,命令間の依存関係を調べ,2命令同時発行ができるならば命令をそのまま書き出し,同時発行ができない場合はNOP命令を自動的に挿入する.命令間の依存関係を判断するルールはスーパースケーラ実行方式がハードウェアとして実装しているものと同じだが,分岐命令の関係上,ラベルをまたいだ命令間で同時発行を判断することができない.このため,コンパイラが生成するVLIW実行方式のアセンブリプログラムの実行クロック数はスーパースケーラ実行方式と同じになるとは限らない.
コンパイラによって自動並列化されたプログラムを示す.
ldli r6, #127
ldli r1, #5
jal foo
nop ### inserted by complier ###
ldli r0, #1
nop ### inserted by complier ###
st (r0), r2
nop ### inserted by complier ###
hlt
nop ### inserted by complier ###
jmp L000
nop ### inserted by complier ###
foo:
st (r6), r7
subi r6, #1
st (r6), r5
subi r6, #1
st (r6), r4
subi r6, #1
...
命令間の依存などで,2命令同時発行ができない場合はNOP命令を自動的に挿入していることがわかる.
さらに,命令間の依存関係を深く調査し,命令の実行順序を入れ換えることで命令レベルの並列性を向上させることを検討したが,コンパイラで生成されるアセンブリプログラムでは命令間の依存関係が多く,性能向上が期待できなかったため,今回は実装を見送った.
**論理合成 [#rfcb5aab]
論理合成はPARTHENONシステムを用いて行うが,autoコマンドで自動生成されるスクリプトファイルに手を加えることで,回路の性能を大幅に向上させることが期待できる.
過去の改良を見ると,外部からの入力ピンの遅延時間を0nsにするなどの例があったが,これは非現実的なものである.本設計では,サイクル時間の指定と,クロック入力端子の負荷容量の変更のみを行い,入力ピンの遅延時間はデフォルトの20nsとして合成を行った.
**動作検証 [#e2c5f180]
過去のASICデザインコンテストに応募された作品が使用していたテストプログラム,及び課題プログラムの合計5つのプログラムを用いて,CPUおよびコンパイラが正常に動作しているかを検討した.使用したプログラムの概要を示す.
-比較演算の検証 (compare.pc)
-直接挿入法によるソーティング (direct.pc)
-再帰法によるフィボナッチ数列の計算 (fibo.pc)
-再帰呼び出し課題プログラム (recur.pc)
-バブルソート課題プログラム (sort.pc)
**評価 [#x1332030]
IP ARCH, Inc. より配布されている例題パッケージであるSN/Xと,今回設計したマルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つのPICO-16プロセッサの評価結果を表に示す.課題プログラムである再帰呼び出しとバブルソートの実行クロック数とプロセッサの最大遅延,消費電力からエネルギー・時間積を算出し,評価値として使用した.
ここでは,マルチサイクル実行方式をpico-16m,パイプライン実行方式をpico-16p,VLIW実行方式をpico-16v,スーパースケーラ実行方式をpico-16ssとして掲載した.
コンパイラはVLIW実行方式を除いては同じものを使用している.VLIW実行方式はコンパイラで命令の並列化を行った.
||SN/X|PICO-16m|PICO-16p|PICO-16v|PICO-16ss|
|recur [クロック数]|RIGHT:323|RIGHT:879|RIGHT:297|RIGHT:214|RIGHT:214|
|sort [クロック数]|RIGHT:26,216|RIGHT:33,851|RIGHT:10,927|RIGHT:8,313|RIGHT:8,102|
|最大遅延[ns]|RIGHT:63.6|RIGHT:41.9|RIGHT:50.9|RIGHT:54.8|RIGHT:53.7|
|消費電力[μW/MHz]|RIGHT:5,680|RIGHT:11,700|RIGHT:13,982|RIGHT:24,408|RIGHT:25,732|
|エネルギー・時間積[nJ·s]|RIGHT:3.06|RIGHT:14.59|RIGHT:2.31|RIGHT:2.38|RIGHT:2.40|
|性能向上比|1|0.21|1.33|1.29|1.28|
最もエネルギー・時間積の値が優れていたのはパイプライン実行方式で,オリジナルのSN/Xと比べると約1.33倍の性能向上となった.VLIW実行方式やスーパースケーラ実行方式では,実行クロック数は削減できたものの,追加したハードウェアによって消費電力が増大してしまったため,エネルギー・時間積の性能向上には至らなかった.
また,VLIW実行方式とスーパースケーラ実行方式では,バブルソートの課題プログラムを実行したときに実行クロック数に違いが出た.VLIW実行方式ではコンパイラが命令の並列化を行っているが,分岐命令の分岐先であるラベルをまたいだ命令間で同時発行の判断ができないためである.
**考察 [#c771e910]
結果として,本設計のベースとしたマルチサイクル実行方式のPICO-16プロセッサはエネルギー・時間積を大きくなってしまった.パイプライン化やスーパースケーラ化を行ったが,大きな性能向上は見られなかった.この章では,それぞれのパラメータについて,その原因の考察を行う.
***実行クロック [#pfeb8816]
再帰呼び出しでは,サブルーチンコールの際に汎用レジスタのスタックへの退避を行うが,退避すべきレジスタが多いため,再帰のコストが増加している.また,マルチサイクル実行方式では,PICO-16の命令の実行サイクルが3または4サイクルであり,SN/Xの2または3サイクルより多くなっている.よって同じ命令数でも,PICO-16の方が実行クロック数が多くなっている.この問題はパイプライン化によって解決できた.また,今回は行わなかったが,PICO-16には汎用レジスタが8個あるため,コンパイラがうまくレジスタに変数を割り当てることができれば,ロード・ストアの回数を大幅に減少することが期待できる.
また,規定されたプログラム言語をコンパイルする際に,いくつかの演算子の動作は特定の命令と対応していないので,PICO-16プロセッサの命令の組み合わせで実現している部分が多く,生成命令数が増大してしまった.さらに,PICO-16プロセッサはレジスタ間接アドレッシングでメモリアクセスを行うため,メモリアクセスを頻繁に行うプログラムを実行する際は,発行命令数が増えてしまう傾向がある.これらの問題は,規定されたプログラム言語を実行するために適した拡張命令を実装すれば解決できるはずである.
***最大遅延 [#h8e1e19a]
パイプライン化によってある程度改善できたものの,パイプラインの段数に比べて,思ったより性能向上が見られなかった.PARTHENONシステムの論理合成後のレポートでは,フォワーディングパスがクリティカルパスとなっているので,パイプラインの設計を見直せば高速化が期待できるかもしれない.
また,論理合成時にALUの加算器などクリティカルパスになっているモジュールをfrzsコマンドにより凍結させることで,OPT\_MAPによる回路簡略化を行わない手法がある.これにより,全体の最大遅延を向上させることができる.ただし,全体の消費電力とはトレードオフの関係になっているので,エネルギー・時間積の値が向上するとは限らない.
***消費電力 [#v4876f12]
SN/Xと比べて2倍以上の消費電力になっている.PICO-16では汎用レジスタを8個確保したことや,SN/Xと比べてもPICO-16は多くの命令をサポートしているため,データパス部や制御回路の回路面積が増加し,消費電力も大きくなっていると考えられる.
***エネルギー・時間積 [#a251b131]
今回の設計にあたって,エネルギー・時間積の結果が増大するか減少するかは考慮せずに改良を行った.本コンテストの評価式であるエネルギー・時間積は,プロセッサにハードウェアを追加して,プログラムの実行クロックを削減しても,全体の消費電力が増大してしまえば評価値を逆に下げてしまう可能性がある.本設計では,スーパースケーラ化を行った際に,それが顕著に現れている.これは,追加したハードウェアに見合う実行クロック削減ができていないとも言える.しかし,近年のコンテストに提出された作品に見られるエネルギー・時間積を削減するためだけの改良では,プロセッサ自体の汎用性が失われがちである.
**総括 [#maf8732e]
第14回ASICデザインコンテストの規定課題である"16-bit CPU"に応募するにあたって,教育用16ビットRISCプロセッサであるPICO-16プロセッサをベースに設計を行った.
設計したプロセッサのアーキテクチャはマルチサイクル実行方式,パイプライン実行方式,VLIW実行方式,スーパースケーラ実行方式の4つで,汎用的な命令セットを備えている.
コンパイラは,例題パッケージのSN/Xに含まれるコンパイラセットをベースにして,PICO-16プロセッサの命令セットで,規定されたプログラム言語をコンパイルできるようにバックエンド部を改編した.また,8つの汎用レジスタを使用可能にするための最低限の機能を実装し,変数と定数の加減算の改良を行った.さらに,VLIW実行方式では,命令の並列化をコンパイラで行った.
**感想 [#x0288e29]
第14回ASICデザインコンテストへの応募を決めたのは,締切りを延長するというアナウンスを聞いた4月1日のことであった.本来の締切りを過ぎた後に,急に思い立ったエントリーであるが,非常に面白い経験になった.
参考までに,プロセッサの設計にかかった時間は2日,コンパイラの設計にかかった時間は2日,そして,ドキュメントの執筆は2日で行った.合計として3日間で全ての設計を完了した.ただし,プロセッサとコンパイラに関しては,ベースとなった設計があり,それに改良を加えた形になる.
SN/XやPICOプロセッサを通じて,コンピュータアーキテクチャを楽しく勉強することができ,プロセッサの設計について大いに理解することができた.このようなプロセッサを考案された清水先生や天野先生,パルテノンASICデザインコンテスト実行委員会,およびパルテノン研究会関係者の皆様には心から深く感謝致します.
**提出したドキュメント [#le076782]
&ref(第14回ASICデザインコンテスト/pico16col.pdf);
ページ名: