PSM3Dの部屋
更新日:2010/05/29
リンクは自由にしていただいてかまいませんが、なるべくmototomのページのHOMEに張っていただけますようにお願いします。
HOME以外のアドレスは変更になる可能性があります
ホームへ戻る
【ソースのダウンロードはこちら(自己責任でお使い下さい)】
【最新版】
PSM3D開発スナップショット 2010-05-29版
【旧版】
PSM3D開発スナップショット 2010-04-04版
PSM3D開発スナップショット 2010-04-03版(Cコンパイラにバグがあったので、公開を取りやめました)
PSM3D 開発スナップショット 2010-03-22版 (更新したCコンパイラとデモソフトのみ。RTL等は2010-02-28版を使用してください)
PSM3D 開発スナップショット 2010-02-28版 (cコンパイラ対応版)
PSM3D 開発スナップショット 2008-11-24版 (古いスナップショット・・・Cコンパイラ非対応です)
【PSM3Dの仕様概略】
・パイプラインは3段
これは、分岐時のペナルティが少ない事、
演算結果のフォワーディング無しでも、性能的なペナルティが低いだろうということで決定しました。
(フォワーディングをするとセレクタが巨大になり、回路規模、動作速度ともに不利になるだろうという判断です)
[20100403追記]
・・・と昔の筆者は書いていますが、この判断は間違いでした。たとえ3段パイプラインであろうと、フォワーディング無しなら
性能的に無視できないペナルティがあります。
むろん、コンパイラが頑張ればこのペナルティは少なくできるはずですが、ぶっちゃけてしまうと、コンパイラで命令の順番を正しく並べ替える
処理を作りこむよりも、(少なくとも3段パイプライン程度であれば)ハードでフォワーディングしてしまった方が筆者にとっては簡単です。
経緯は、こちら に書いていますが、最終的にはフォワーディングと、動的分岐予測ま組み込みました。
効果としては、フォワーディングが大、分岐予測が小です。 ただし、分岐予測に関しては、仮にPSM3Dのパイプライン段数が深ければ、
もっと効果があったと思います。
あと、命令セットの定義にも失敗しています。当初は、ベースアドレスレジスタを、プレ/ポスト・インクリメント/デクリメント出来る
ロード/ストア命令を実装していましたが、最終的にこの命令への対応を無くしています。筆者のコンパイラに関するスキルが低くて
この便利な命令を上手に使う実行コードをコンパイラが生成できない事が大きな要因の一つですが、これらの命令に対応する為、
回路規模が不要に大きくなっていました。結局、これらの命令に対応する為の回路を削除し、フォワーディングと、動的分岐予測を
組み込んだ方が、動作周波数は同等で、回路規模が小さくなりました。
又、3段パイプラインを実現する為に、レジスタファイルには、分散RAM(LUTをRAMとして使用)を使ってます。
ブロックRAMを使うと、どうしてもレジスタ読み出しに1サイクル余計にかかってしまうので、やむなくといった感じです。
このため、このPSM3DはXilinx専用といった感があります。
といったわけで、Alteraでも合成はできますが、回路規模がかなり大きくなってしまいます。
・汎用レジスタ
R0〜R14が汎用レジスタ、R15がPCです。 このへんはARMの影響をもろに受けています。
[20100403追記]
R15にPCを割り当てたのは失敗でした。もともとは、PC相対で32bit即値をロードしたくて、R15にPCが見えるようにしてたのですが、
結局、32bit即値をロードするたびにデータキャッシュを汚してしまい、性能劣化につながってました。キャッシュがせめて2WAYあれば
よいのですが、ダイレクトマップと比べると動作周波数&回路規模が犠牲になりますし。。。
また、コンパイラ開発の視点からも、貴重な汎用レジスタを1個損してます。
・Dualコア
PSM2の時の経験からCPU一個あたり回路規模がおおよそ予想できたので、Spartan3Eスターターキットなら、CPU2個入れて余裕ありそう⇒ならばDualコアだ! というノリで決定。
・命令キャッシュ 各コア独立で4Kバイト (ダイレクトマップ)
・データキャッシュ 各コア独立で4Kバイト (ダイレクトマップ・ライトバック)
容量については、Spartan3EスターターキットのFPGA(XC3S500E)のブロックRAM数から可能な数字を逆算して決定。
ダイレクトマップは、一番簡単だからという理由で決定。
データキャッシュに関しては、最初はライトスルー方式で開発し、今ではライトバックに対応しています。
ブロックサイズは命令/データキャッシュどちらも16バイトです。これはSpartan3EスターターキットのDDR-SDRAMが2バイト幅なので、8バースト×2バイト=16バイトで決定。
・キャッシュのスヌープ機能は断念
今の作者には、敷居が高すぎます。でも、いつか挑戦したいと思っています。
・一部の命令を除いて、1サイクル1命令の実行が可能
すべての命令を1サイクル実行したいところですが、乗算命令、除算命令、シフト命令と、ロード/ストア系でアドレスの自動更新する命令(POPとか)がマルチサイクルになってます。
・その他
ちょっとユニークな特徴として、バレルシフタと割算器は二つのCPUコアで共有してます。
いずれも、単体の演算器としては回路規模が大きい事(どちらも200スライス前後)、又、使用頻度もそう高くなさそうと事で、 回路規模削減の為に共有してしまおうという魂胆です。
(キャッシュのスヌープ機能をあきらめたので、なにか他にDualコアならでわな所をつくりたいという思いもありました)
【性能】
・動作速度
Spartan3Eスターターキットで、
CPU周波数70MHzにて配置配線後のタイミングエラー無し(ISEのオプションをいじってぎりぎりでMet)です。実動作も確認してます。
(デバッグ機能でパイプラインを強引に止める所と、キャッシュのタグ一致判定&その結果によるデータパス切り替え部分がクリティカルパスになっているようです。ちなみに、デバッグ機能なし、キャッシュなしのブロックRAM直結なら100MHzまで配置配線後のタイミングエラー無しでした。デバッグ機能を省いているので実機動作は確認してませんが・・・)
・回路規模
ISEのmapレポート(.mrp)によると、PSM3D単体(CPUコア2個+それぞれのキャッシュ)で、約3100スライス強です。
かなり大きくなってしまいました。。。。
【SW開発ツール】
・アセンブラ
一応、使えるものがあります。(かなり癖が強いですが)【追記】コンパイラに合わせて作り直しました。 リンカを作るのが面倒だったので、アセンブラ兼リンカになっています。
RTL検証用のコードを作るための簡単なものからスタートし、行き当たりばったりに機能を追加していったので、作った本人でさえメンテしたくない状態になっています。
下記のCコンパイラが出来たら、書き直す予定。
・Cプリプロセッサ
未着手。簡単なようで奥が深ーいプリプロセッサ。余力があればオリジナルなものを作りたいですが、当面はフリーのものを活用することとします。
【追記】とりあえず、bccのプリプロセッサを使って開発しています。
・Cコンパイラ
作成中。CPUと同じく一回は作ってみたかったコンパイラ。ANSI Cに準拠しようとしたら一生かかっても出来そうにないので、まずは、Cの入門書に載ってるレベルの記述くらいはコンパイル出来ることを目標に作成中です。次のステップで、Dhrystoneをコンパイル出来るようにしたいと思っています。やっぱりDhrystoneMIPSは計ってみたいので。
開発状況 :字句解析まではそれっぽいのが出来ましたが、構文解析で壁に激突中。 ほんとに完成させる事が出来るのかとっても不安。
【追記】完成度低く、バグがたくさん残っている感じですが、トップページの写真の『Wello、World!』をビットマップ表示させるプログラムをCで書いて動かせるまでになりました。
【追記】コンパイラ開発に関する別室を作りました。
・リンカ
未着手。Cコンパイラが出来てから考えます。
【追記】独立したリンカを作るのが面倒だったので、アセンブラ兼リンカになっています。
・デバッガ(ICE)
一応、使えるものがあります。(必要最小限の事しかできない上、操作性も悪いですが)
C#で書きました。シリアルでFPGAボードと接続します。
こんな感じです。 XGAのモニタだと、画面からはみ出してしまい実質使えません。ごめんなさい。
アセンブラと同じく行き当たりばったりで、しかも初めて使うC#で作ったので、ソースの方はぐっちゃぐちゃです。
これもCコンパイラが出来たらつくり直す予定です。作りなおしたい筆頭です。
【追記】PSM4向けで作り直すことになると思います。
【今後の予定】
・まずは、Cコンパイラを完成させる。・Cコンパイラが出来たら、いろいろベンチマークしてみる。
[20100403追記]現状、37.05DMIPS
・Cコンパイラを作りながら感じた事と、ベンチマークした結果から、次のCPUを設計する。
【ドキュメントなど】
こちらから
このページに関するご意見などございましたら mototom@xsj.biglobe.ne.jp までお願いします。
ホームへ戻る