四畳半テクノポリス

コロナのストレスで気が狂い、D進した院生

RISC-Vの設計図

Day4:Risc-Vの設計図

f:id:toriten1024:20190328001254p:plain

RISC-Vの設計図

 最近色々うだうだしていて進捗があまりないのですが、とりあえずRISC-Vの設計図が出来上がったので中間報告します。印刷してはマーカーでバスをなぞってデバッグする作業で割と面倒臭かったですが、二回やってなんとか動きそうなものができましたのでおまけ程度に各部位について説明します。

マルチプレクサ

図面中にある台形は全部コレです。台形の長い辺に複数の入力を受けて、制御信号によって選択し、台形の短い方から出力されます。

PC

プログラムカウンタは次に実行するプログラムのアドレスが格納されているポインタです。RISC-Vは32bitCPUなのでアドレスは4byte区切りになっています。IntelCPUだとインストラクションポインタとか言うらしいですが、こっちの方がわかりやすいですね。

ProgramMemory

名前の通りプログラムが格納されているメモリです。今回実装したRISC-Vはハーバード・アーキテクチャに基づいて設計されているため、ProgramMemoryとDataMemoryが分けられています。

プログラムメモリは名前の通りプログラムが格納されているメモリでPCで指定された番地のデータを読み込みInstructionDecoderに渡します。

InstructionDecoder

CPUの司令塔であり命令を解釈してALUやRegisterFileなどの部品を制御します。InstructionDecoderからはimmという信号が出ていますが、これは即値命令(immediate)のことであり、命令上の即値部分を出力します。その後にシフト演算(<<)の記号がついた部品がありますがこれは即値を12bitシフトする演算器です。ロード命令(疑似命令でld)はシフト演算器を利用しレジスタの上位20bitに即値を格納するlui命令と、即値を加算するaddi命令の組み合わせる事によって実現されます。

 

RegisterFile

CPUで一時的に用いる数値を格納しておくメモリです。CPUが演算に用いることの出来る値はこのレジスタか、もしくは命令に含まれる即値だけであり、たとえばプログラムメモリ上のデータを演算に用いようとした場合、そのデータを一度レジスタにロードする必要があります。

レジスタの数は命令セットによって変わります。例えばRV32Iは32個の32bitレジスタを持ちますが、RV32FおよびRV32Dなどの小数点命令を追加すると小数点に関するレジスタが別に搭載されます。この辺はアウトオブオーダとか想定してるのかな?

 

ALU

演算を行う部位です。Instructionデコーダからの司令に基づき加算、論理シフト、比較など、2つの入力同士を計算します。今回の実装でALUは演算命令だけでなくジャンプ命令やストア命令のアドレス計算にも用いられるようになっています。

Datamemory

 演算に利用されるデータが格納されている命令メモリです。演算に用いられるデータで、レジスタに収まらないものや、大きなデータはこのDataMemoryに格納されます。読み出すときにマスク機能があり、X番地の4byteのデータの下位Nbyteまでをマスクして取り出すといった操作ができます。データの出力の先にはSignConverterがついており、数値を符号付きに変換することができます。

たまに組み込みだと整数配列にプログラムのバイナリを書き込んで関数ポインタとして呼び出す実装を見かけるんだけど、なんで出来るんだろう、不思議だよね。