プロセッサ

提供: IS2005 Wiki (CPU実験)
移動: 案内検索

目次

命令実行数(1/19)

命令 命令数
ADDI 1.08G (1,085,744,581)
LOAD 1.48G (1,483,879,478)
STORE 0.91G (906,507,176)
BE 0.00G (2,844,897)
BNE 0.22G (219,303,503)
BL 0.00G (4,529,133)
BLE 0.00G (4,637,002)
FBL 0.00G (458,378)
FBLE 0.05G (49,806,643)
JR 0.40G (402,071,764)
JAL 0.32G (319,600,847)
ADD 0.42G (422,709,176)
SUB 0.00G (2,993,400)
SLL 0.14G (139,808,215)
SRR 0.03G (27,755,586)
AND 0.00G (4,266,022)
OR 0.00G (0)
XOR 0.03G (28,076,134)
XNOR 0.00G (6,419)
FADD 0.06G (60,243,705)
FSUB 0.06G (57,413,099)
FMUL 0.12G (119,571,653)
FDIV 0.00G (1,516,985)
FSQRT 0.00G (2,197,885)
RD 0.00G (1,300)
WR 0.00G (154,917)
MOV 1.06G (1,056,161,640)
NOP 1.26G (1,260,320,465)
7.66G (7,662,580,003)
  • MOVは、ADDIから、即値がゼロのものを取り分けたもの。
  • NOPは、アセンブラが加えたもの。

50Mz 236.731s動作(1/18)

しました。よかった。

不安定さの元凶(1/18)

見返すと、今回の問題では、1週間も嵌っているようだ。鬱になる。試行錯誤の結果、どうやらIOAのOUTのタイミングに原因があると睨んでいる。だとするとfibがなぜ動いていたか謎だが、現象からしてそうとしか考えられない。明日、というかもう今日だがDCM二段重ね(DLL用とDPS用で二段重ね)の荒業に挑戦をしてみる。

30MHz 394.537s動作(1/16)

しかし誓約満たしても動かないFPGAはツンツンしすぎである。

クロックアップしようと思ったら(1/12)

逆にクロックダウンする羽目に。昨日の25MHzの画像が、ちょっと乱れていたのが判明。

というわけで20MHz 591.781sが現在の記録。

キタコレ(1/11)

プロセッサ-raytrace.pngUSBによる完全動作を確かめた。記録は、25MHz 443.52s。記録としては、まだまだといったところか。ソースコードは、12/29のとほぼ同じだが、クロックを25MHzに落とした。本当は50MHzで動かしたかったのだが、動かず。多分40MHzだと動くので、明日には試してみる。まあ、今日のところは、とりあえず動くのが優先であった。

引き続き、コンテスト出場基準に至るために、RS-232Cへの対応、sin/cos /atanプリミティブの精度向上(高山氏よろしく)、アーキテクチャ改良を考えるために、各関数の実行数の把握(高山氏よろしく?)、キャッシュの研究といったあたりを、取り組んでいく。

revision 20: updated stable version(12/29)

media:プロセッサ-20051229.zip

すべての測定値が計画値と一致(12/29)

さて自宅に帰ってくると出かける際に仕掛けておいたModelsimのジョブが完了していた。そこで、

$ diff -u simulator.log processor.log

$

システムドライブの空き容量僅少(12/29)

突然、システムドライブの空き容量僅少との警告。どうやらModelsimがメッセージのログを起動中ずっとファイルに吐き続けていて、6GByteに達していた。たまに再起動をかけてやるか、毎回起動時に[Tools]-[Options]-[Transcript File...]でファイル名を単に空にするといいようだ。

アセンブラの遅延LOADに続くNOP挿入に不具合(12/29)

ロードのrsとrtが同じレジスタを指している場合に、自分自身が衝突を起こしているという解釈を行い、間違った場所にNOP挿入を行う不具合があった。

また、連続するLOADがある際、本来NOPの省略ができ、実際省略を行っていたのだが、制御の流れによっては、(つまり連続するLOADの最後のLOADにジャンプしてきた際などは、)省略が行われるとまずいので、省略を一切行わないこととした。速いことより動くこと優先である。(ちなみに、NOP挿入回数が、1007から1667になった。)

しかし、シミュレータでもプロセッサでもなく、アセンブラの不具合であった。アセンブリレベルでの衝突判定に、意外と罠あり。

Modelsim XE III/Starter(12/28)

製品版より100倍ビジーループで時間を浪費する(との噂の)評価版であるが、ISE Simulatorよりましである。

おかげで、完全動作を確認、といいたいところであったが、むしろまた問題発覚。

とりあえず、setup_rect_tableでconst.(2) (同関数は何回も呼ばれるが、初回だと、530401)に代入される値が、初回だと、(Modelsim上の)プロセッサが0xc2a00000、(cygwin上の)シミュレータが0xc1a00000というふうに。どちらが正しいかなど(たぶんプロセッサが誤っているが)、万毒なのでまた明日。

ISE Simulatorがだんまりになる件(12/28)

[#20370: 7.1i ISE Simulator (ISIM) - ISE Simulator の既知の問題]

質問 1: デザインに対して 60 秒以上シミュレーションを実行すると、ISE が停止し、クラッシュしたように見えます。これはなぜですか。
回答 1: これは、波形の保存方法に問題があるため発生します。 この問題は、ISE 8.1i の ISE Simulator で修正される予定です。

うぼあ。

プロトタイプ完成(12/28)

ISE Simulatorで4x4のレイトレースを走らせているが、ISE Simulatorがしょぼいため、途中で固まってしまうようだ。しかし、総SRAM書き換え231,285回中少なくとも15,166回までは、アドレス、データとも、測定値が計画値通りとなっており、おそらく現在のソースコードで実機完全動作できる公算大である。

続・sinの引数がDon't care(12/28)

遡ること数百us、2,136,460nsに元凶を発見。別のメモリコントローラ不具合の模様。

sinの引数がDon't care(12/28)

sinの寸前にprint_float (print_int int_of_float)を置いてみると、やはり変な挙動を示す。sinの引数がDon't careになってしまい永久ループにはまっている可能性がある。

sinで停止(12/27)

先ほどの不具合を直したが、sin (called by tan (called by adjust_position (called by calc_dirvec)))で相当永いループにはまってしまう。ライブラリの不具合でなくプロセッサの別な不具合である予感がするが、万毒なので明日にしよう。

メモリコントローラ不具合(12/27)

Modelsim製品版は地底でしか使えないので、仕方なくISE Simulatorを使っているわけだが、使い勝手はいまいちである。

しかし、load/store + fadd/fsub/fmul/finv/fsqrt/rd/wrの命令列で不正な位置に制御が移る現象を見つけた。完全動作の決め手になるか。

revision 15: stable version(12/16)

media:プロセッサ-20051216.zip

FSQRT実機動作(12/15 20:00)

しますた。

実は、先の記事を投稿した際にFDIVにバグがあったのだが、もはや問題ない。

さてそろそろ本気でレイトレでも動かしますかね。

FDIV(=FINV+FMUL)実機動作(12/15 12:00)

した模様。

FSQRTも今日中には動く。

なおFTOI、ITOFはプロトタイプにおけるハードウェアでの実現は見送り。ソフトウェアで実現することとする。

謎事象(12/14)

次の条件を全て満たすとUSB転送において先頭1バイトのデータが消える

  1. 異なるbitファイルを焼きこむ(setup.bitにcpu.bitか、cpu.bitにsetup.bit)。
  2. 焼き変えたときにUSBを繋いだままにする。
  3. USB転送をバッファリングする。

このいずれかを避ければ大丈夫である。謎。

再誤差評価メモ(12/12)

12/8のFDIV墜つというのはおそらく何かの間違いだったようで、やや改良を施した誤差評価プログラムを、16台のクラスタで三日三晩ぶん回したときの、絶対値の誤差の許容誤差に対する割合を次に示す。

プリミティブ 下限 上限
FADD -99.996305%(csc003) 99.998188%(csc000)
FSUB -99.998176%(csc000) 99.997377%(csc003)
FMUL -99.987310%(csc001) 00.000000%(------)
FDIV -90.710601%(csc002) 99.777329%(csc002)
FSQRT -87.797710%(------) 77.754951%(------)

kosak氏のメモをコピペ(12/9)

sin x = 6.283185253x-41.34161766x^3+81.58431506x^5-75.03564774x^7
cos x = 0.9999999102-19.73907713x^2+64.90806899x^4-83.02261683x^6
tan x = (3.141592786x-2.230781803x^3-0.5370510434x^5-0.2262894106x^7)/
        (1-3.999937220x^2)
arctan x = (0.9999995347x+0.6667364106x^3+0.04243594020x^5)/
           (1+1.000037148x^2+0.1761470730x^4)

FDIV弄り(12/9)

今度こそ大丈夫だと思うが。

FDIV墜つ(12/8)

  • 0 78 060080
  • 1 4b 17aa1b

という引数に対して墜ちた。


誤差評価メモ(12/8)

昨日の誤差評価プログラムを一晩ぶん回したときの、絶対値の誤差の許容誤差に対する割合を次に示す。

プリミティブ 下限 上限
FADD -99.99% 99.99%
FSUB -99.99% 99.99%
FMUL -99.86% 0.00%
FDIV -89.66% 99.77%
FSQRT -99.58% 97.66%

FINV, FSQRT(12/7)

  • FINVは、9x10のテーブル引き
  • FSQRTは、9x(10+19)のテーブル引き

で、合計9x39bitとすると効率がよろしくないので、隣接する値は差分を使うことにして、9x36bitに収める(もっと詰めると35bitに収まるが、1bitは計算を省くのに使おうか謎)。デュアルポートBlock SelectRAMがポートごとに帯域幅の指定ができるのを忘れていて、うまくいかねーヨと悩んでいたが、気付いてしまったのでかなりぴったりはまったようだ。

浮動小数点数演算は、2 ** 64通りもあるので、全通り試すのは無理で、乱数を引いてきてひたすら繰り返して基準を満たしているか調べている。とりあえず、数時間動かしたところ、誤差の許容誤差に対する割合が、FSQRTは99.578990%、FDIV(FINV+FMUL)は99.731248%となっている。FDIVのほうがかなり心配だが、まあおそらく大丈夫なのだろう。


浮動小数点数(12/7)

FINV、FSQRTのテーブル引きに影響があるので、非正規化数をあきらめた。すなわち、浮動小数点数の扱いを次の擬似コードのように定める。

$e ? (-1) ** $s * ($e - 128) * (1 + $f / 2 ** -23) : $f ? undef : (-1) ** $s * 0;

ITOF備忘録(12/3)

intからfloatへのキャストは、ハードウェアでやると確かに超楽であり、1〜2クロックでできるであろうが、レイトレのソースにはほとんど出現しないので(シミュレータがないと本当にほどんど実行されないかどうかはわからないが)、ソフトウェアでやることも考えられるので、非正規化数を使ったレシピを。

  1. 整数Aを非負か負で場合分け。ここでは非負の場合についてのみ述べるが、負の場合もほぼ同様の手順である。
  2. Aを23ビット右シフトしBとする。
  3. Bを23ビット左シフトしCとする。
  4. AとCを整数減算し、Dとする。
  5. Bに2^98を浮動小数点乗算し、Eとする。
  6. Dに2^75を浮動小数点乗算し、Fとする。
  7. EとFを浮動小数点加算し、Gとする。
  8. Gに2^75を浮動小数点乗算すると、完了。

ざっと20クロック弱か。大変だなあ。

FADD, FSUB, FMUL実機動作(12/3)

結構サークルの1〜2年生をサポートするのに忙しかったが、駒場祭は儚くも過ぎ去り、再びそこそこ暇である。ここしばらく記録を取っていなかったが、FPUに取り掛かっている。途中、もはやバグなどないと思っていたレジスタファイルのコンポーネントにバグがあったせいで時間がかかっていた。

で、本日FADD, FSUB, FMULを実装。FDIV、FSQRT、FTOI、ITOF等をソフトウェアでやるという仕様にすればレイトレが動くと思われる。まあさすがにできればハードウェアでやりたいが。というわけで、シミュレータ、コンパイラのほうの進捗状況を禿きぼんぬしたい。

浮動小数点数は、現在のところ、IEEE形式と似て非なる形式となっており、指数部のバイアスが128である。つまり、IEEE形式と比べて指数部を1つずらした格好になっており、InfやNaNを省いている。本来Infとなるべき計算をすると、適当な非正規化数になる。

非正規化数を入れる計算は、律儀にやっているが、非正規化数が出てくる計算は、基準を満たす程度でごまかしているので、指数部は合っているが、仮数部は間違っている。

ちなみに現在50MHzぎりぎりになっており、頭が痛い。さらに機能追加をするとついに周波数を落とさざるをえないかもしれないので、優先度をつけて機能追加をしていきたい。噂によると、FDIVよりFSQRTのほうが頻繁に呼ばれるという話だがどうなんだろうか。

FPUはもちろん、floatのデバッグ用プログラムとかもあくせく作ったのでまたバックアップ。media:プロセッサ-20051203.zip

I/O命令対応(11/23)

VHDLよりPC側のプログラムに時間がかかった。cygwinだと、Ctrl+Cをしたとき、ターミナルを扱っているプロセスグループでなくプロセス単体にしかシグナルが来ないようである。

ちなみにfib 38の精密な実行時間を測ったところ、23.454秒であった。

文法のチェックを厳しくし(汚いhackなので綺麗にしてくれるとありがたいが)、opやfunctのバイナリを改めたアセンブラを含むプロセッサのソースを置いておく。media:プロセッサ-20051123.zip

やっぱり命令追加(11/22)

結局FB*を追加。I/Oを後回しにしすぎだが、あっさり動く自信などあり。

命令固定(11/21)

いろいろ調整したつもりだったが、大して改良になっていないという話も(むしろ改悪という説も)。毎日のように弄ったopcodeをこれにて固定。あ、要望があればFBLEとかは加えるかもだが。環境が整ったので、明日よりIO命令の装備に着手。

I/O命令対応準備(11/18)

FPUやIOなど1クロックでできない命令に対応するための準備作業無事完了。途中、しょうもないところでいろいろはまって鬱。

フィボナッチ動作(11/16)

プロセッサ-fibonacci.jpegついに再帰でフィボナッチ数列の第38項を再帰で求めるプログラムが50MHz 24秒で動作。ちなみに学科PCだとPentium 1.7GHz 1秒ぐらいのようである。LEDが下位1バイト0x29を示しているのがわかるだろう。

プロトタイプによるレイトレ完動、単位確定がだんだんと見えて来た気がする。次FPUに取り掛かる算段。

さらに、完動してからのアーキテクチャについて、そろそろ考えていきたいところ。結局のところ、FPGAにおいて、Register FileやCacheがRAMであるというのが最もネックになるので、それを踏まえている必要がある。

レジスタウィンドウもどきとか面白そうだが、それで速くなるのはスタックだけでヒープは大して速くならないだろうな。そんなこんなをいろいろシミュレーションしてみたい。

フィボナッチ秒読み(11/15)

中島氏とメモリのタイミングについて議論。誤った知識を正す。するとぎりぎりだと思っていたSRAMのタイミングを余裕にできた。

そんなこんなで、スムーズに開発進行。フィボナッチの動作が秒読みに入ってきた。

なお、条件分岐の性能向上により、無条件分岐と条件分岐でパイプラインが止まるクロック数が同じになった。無条件分岐不要論再燃だがとりあえずフィボナッチに突き進む。

久しぶりにバックアップしておく: media:プロセッサ-20051115.zip

続行(11/14夕)

とりあえず、なぜか動いているソースに戻して修正を続行。

発覚(11/14もう朝)

一晩かかって、わけがわかった。というかむしろ、昨日までなぜ動いていたかが謎。ご丁寧にWARNINGを吐いてくれていたのだが、昨日までなぜか動いていたためにまったく気にしようとしていなかった。見たくないものを見ないようにする姿勢があったのかもしれぬ。反省。。。また作り直し。作り直すたびに賢くなっているといいのだが。

まあ、罠にはまればはまるほど、動いたときの感慨につながるはずである。

混迷(11/14未明)

ぜんぜんだめ。

LOAD/STORE実験(11/12)

STOREの実験がうまくいくが、命令セットを変えようとしてつまる。

LOAD/STORE準備(11/11)

タイミングをつめる。何でもかんでもALUを通すといいようだ。

順調(11/10)

日付が変わったころから面白いようにはかどる。昨日一昨日罠だらけだったのが嘘のようである。

1つの関門であるところのLOAD/STORE命令も、このまま罠がなければおそらくはまもなく対応できるはず。

ちなみに今日地下には漏れ以外誰も泊まっていない。

回帰(11/9)

初めは知らなかったノウハウも溜まってきたところだったので、いい機会だと思って全体をほぼ1から作り直す。

挫折(11/8)

制御回路の肥大化に伴いSRAMのタイミングが間に合わなくなり、動かなくなる。

命令を整理(11/7)

ひたすらひたすらプロトタイプアーキテクチャ(11/6)

プロトタイプアーキテクチャをひたすら作業中。

現在の割り当てメモ。

ALU命令 000X XXXS SSSX TTTT XDDD DXXX XXFX FFXX
ALUI命令 011F FFXS SSSX DDDD MMMM MMMM MMMM MMMM
MMU命令 010X WXXS SSSX DDDD MMMM MMMM MMMM MMMM
分岐命令 1XXC CCXS SSSX XXXX MMMM MMMM MMMM MMMM

ひたすらプロトタイプアーキテクチャ(11/5)

プロトタイプアーキテクチャをひたすら作業中。 ALU命令、即値ALU命令、条件分岐命令の一部に対応。

プロトタイプアーキテクチャ(11/4)

プロトタイプアーキテクチャをひたすら作業中。

プレプロトタイプアーキテクチャ(11/1)

オペランド2で、オペレーションADD(16bit)、SUB(16bit)、ADDI(4bit)、SUBI(4bit)、B(10bit)、BZ(10bit)、BNZ(10bit)に対応。レジスタ16。遅延スロット2。演算結果をLEDに表示。

4から1までの総和を計算し、10を表示。

SUB 0 0 ; 念のためr0を初期化
SUB 1 1 ; 念のためr1を初期化
ADDI 0 4 ; 4をr0に代入
BNZ 510 ; 下の2つの命令を実行してから、同じ命令へ遷移
ADD 1 0 ; r1にr0を加算してr1に代入
SUBI 0 1 ; r0から1を減算してr0に代入
ADDI 1 0 ; LEDにr1を表示するだけ
ADDI 1 0 ; LEDにr1を表示するだけ
B 508 ; 永久ループ。下の2つの命令を実行してから、2つ上の命令へ遷移
ADDI 1 0 ; LEDにr1を表示するだけ
ADDI 1 0 ; LEDにr1を表示するだけ

命令はあくまでも実験用で、頻繁な変更を想定。

いよいよ本体に着手(10/31)

JUMP命令とNOP命令に対応

タイミング(10/30)

SRAMへの信号のタイミングを見直してエラーが起こる確率を0とした。

技術提携(10/29)

深夜大学へ。

中島班と技術提携。昨日のucfファイルの件を教える代わりに、DCMの件、ModelSimの件について教えてもらう。

SRAM(10/28)

成果があった: media:プロセッサ-20051028.zip

USBからSRAMへのデータのセットアップ、SRAMからUSBへのデータのダンプにおおむね成功。しかし、タイミングが微妙なせいか100回に1回くらいの確率でエラーが起こっている。

そもそも、配布されているucfファイルにミスがあった。なかなか気付かなかったので、ぜひ他班に教えないでおきたい。

FPGAが石に(10/27)

あぼんぬ氏FPGA破壊祭りで地底大いに湧く。

USB(10/21)

USBでの送受信に成功。マニュアルの参照の仕方を分かってきた。

LED(10/6)

LED動作に失敗。翌日scarlet氏立会いの下基盤を交換。