読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

自作CPUはじめました

さてさて仕事も全然決つてゐませんし現實逃避感が否めませんが、
折角手元に
AZPR EvBoard AZPREVBOARD 余熱@れすぽん製|マルツオンライン

CPU自作入門 ~HDLによる論理設計・基板製作・プログラミング~CPU自作入門 ~HDLによる論理設計・基板製作・プログラミング~
水頭 一壽 米澤 遼 藤田 裕士

技術評論社 2012-10-20
売り上げランキング : 48024

Amazonで詳しく見る
by G-Tools
もあることですし、そろそろここらで32ビットCPUでも作つてみませうかといふ流れになる訣です。
GitHubの方に取敢ず既にレポジトリも作つてあつたりするんです。ゆとりーなCPUです。
GitHub - nagoya313/YutorinaCPU: 自作CPUらしい
で、まあ命令セットをどうしようかといふ話になつて(本と一緒でええやんと思ふかもしれませんが折角なら俺々命令セット作りたいぢやないですか)考へようかといふ話になるのですが、これが案外惱むのですよね。私がちよろつとだけ知つてゐる命令セットはx86とかMIPSになるのですが、まあどう轉がつてもx86をお手本にしたいとは全く思へないのでやつぱりMIPS(といふかRISC)をお手本にしようかしらといふ所迄は決つたのですがここから先がなかなか進まないのですね。
以下取敢ず決つた事です

汎用レジスタ

32ビット汎用レジスタは32本用意することにします。で、$0はゼロレジスタです。これはあると便利さうなので汎用(笑)な勢いで作ることにしました。で、MIPSとかでは他にも$raが函數とかの戻り番地として使はれるのですが、これはなしにしました。$raがあるとJR(ジャンプレジスタ)命令で戻れるのでRET(リターン)命令みたいなのが不要になるのですが、あんましMIPSと同じでも面白くないので...(謎)。

命令形式

3レジスタ形式(ADDとか)
31:26=オペコード、25:21=レジスタ1、20:16=レジスタ2、15:10=レジスタ3、9:6=豫約、5:0=機能コード

所謂3つのレジスタを取る算術命令がこれですね。レジスタの割當て順は適當なんですが、他の命令セットではその邊りも意味があつたりするのですかね。

2レジスタ形式(LSR、SSRとか)
31:26=オペコード、25:21=レジスタ1、20:16=レジスタ2、15:6=豫約、5:0=機能コード

特殊レジスタ讀出しとか書込みとかです。

2レジスタ即値形式(ADDIU、LW、SW、BEQとか)
31:26=オペコード、25:21=レジスタ1、20:16=レジスタ2、15:0=即値

3つめのレジスタの代りに即値を取る算術命令とかロード、ストアとか比較分岐命令がこれですね。。

1レジスタ形式(JMPRとか)
31:26=オペコード、25:21=飛び先レジスタ、20:6=豫約、5:0=機能コード

レジスタ一つだけです。ジャンプレジスタ命令とかがこれになるんですかね。機能コード付けておいたのはここでサブルーチンコールとかを指定すればオペコードケチれるかなとか思つたのですがどうなんですかね。

0レジスタ即値形式(JMPとか)
31:26=オペコード、25:0=即値

ジャンプとかです。

0レジスタ形式(TRAPとか)
31:26=オペコード、25:6=豫約、5:0=機能コード

TRAPとかその邊です。

命令セット

で、これにどう數字を割當てるかが問題になるんですよね。取敢ず現状實裝豫定の命令を列擧して行きます。()で括つてあるのは未定です。

算術演算:ADD、SUB、(MUL)、(DIV)、(REM)、(SLT)、(SLTU)、ADDIS、ADDIU、(SLTI)、(SLTUI)、ADDUI
論理演算:AND、OR、XOR、(NOR)、ANDI、ORI、XORI、(NORI)、ANDUI、ORUI、XORUI、(NORUI)
シフト演算:SLL、SLR、SAL、SAR、SLLI、SLRI、SALI、SARI
ストア命令:SW、SH、SB
ロード命令:LW、LH、LB、LHU、LBU
分岐命令:BEQ、BNE、(BGE)、(BGT)、(BLE)、(BLT)、(BGEU)、(BGTU)、(BLEU)、(BLTU)
ジャンプ命令:JMP、CALL、JMPR、CALLR
特殊命令:TRAP、RET
特權命令:ERET、LSR、SSR

掛け算、割り算、餘りが未定なのは、verologで*/%を書いても合成されない説があるからといふので保留つてことです。實際に乘算器を作るかどうかは謎です。SLTとかはこれを作ればこれとBEQ、BNEだけで比較全て出來てしまふ(Boost.Operatorsとかと同じ原理ですね)ので實裝命令數は減るのですが實行に2命令要るのはどうなのかなといふことです。まあ比較命令は符號附き無しを含めると8つ必要になるのでこれが即値を使ふ奴を含めて4つで濟むのは結構アドなのかなと思はなくもないですね。
さて、肝心の數字の割當てですが、兔に角デコードの實裝が樂になる樣に割當てたい所です。きつと私が樂にデコードのコードが書けるといふことは合成される囘路も小さくて濟むに違ひないと云ふ素人的感覺です。
3レジスタ形式のオペコードは0で確定(nopを0x00000000にしたくて、ゼロレジスタ同士の算術演算は實際何もしないのでこれで耐へる)でこれは搖るぎないのですが問題はそれ以外ですね。あとは即値系の演算のオペコードの下位を對應する算術命令の機能コードと合はせれば樂できるのではないかとか考へていて、これを元に割當てを考へ中だつたりするのが現状です。