|
9 |
RISC-Vプロセッサの設計 (34) |
設計ファイル
| ファイル | 中身 | 形 | 使う段 |
|---|---|---|---|
| Types.bsv | Addr, Data, Inst, DecInst, 段間構造体(IF2ID など) | 型定義 | 全段 |
| PipeQ.bsv | lastメソッド付きの1段パイプラインFIFO(PCの箱) | モジュール | <PC>・<IF> |
| Decoder.bsv | decode(Bit#(32)) -> DecInst、即値生成を含む | 純関数 | <ID> |
| RegFile.bsv | 32x32bit、x0固定ゼロ、2読み1書き、書き込みバイパス | モジュール | <ID>読み、<WB>書き |
| Alu.bsv | alu(op, a, b)、brCond(cond, a, b)、分岐先計算 | 純関数 | <EX> |
| NextPC(mkProcessor内) | PCの箱+4 / 分岐先 / トラップ先の選択、epochの反転 | rule | <PC> |
| Mem.bsv | req/resp型のメモリIF、BRAMCoreによるIMem・DMem。DMemはバイトイネーブル付き | モジュール | <PC>・<IF>、<EX>・<MA> |
| Csr.bsv | mstatus, mtvec, mepc, mcause など。ecall/mret、例外の一括判定 | モジュール | <EX>〜<WB> |
| Processor.bsv | 6段のrule、段間FIFO、発火条件とepochの制御、ハザード検出 | モジュール | — |
| Tb.bsv ほか検証環境 | プログラムのロード、終了判定、トレース出力、期待値比較 | テストベンチ | (Claude担当) |
後から足す部品は、ICache/DCache(Mem.bsvと同じインタフェースの裏に入れる)、乗除算器、BTB(<PC>での予測)です。
設計順序
「命令が実際に流れる」状態を早く作り、以後は常にriscv-testsで回帰確認できる順にします。各ステップの終わりで確認し、次へ進みます。ハザードは最初はストールだけで正しく動かし、フォワーディングは性能改善として後から入れます。
- 検証環境(Claude)
- RISC-V GCCでriscv-tests(rv32ui-p)とfibo.cをビルドし、$readmemh用の.memを作る。
- Makefile、bsimとVerilatorの両実行、tohost書き込みでの合否判定、コミットログ出力を用意する。
- 期待値はISS(Spike)のコミットログと照合する。
- Types.bsvと段間FIFO
- 段間構造体、mkPipelineFIFO、mkPipeQで6段をつなぐ。各段を止めるテスト用の発火条件とepochもここで入れる。
- 完了条件:任意の段を任意のサイクルで止めるテストで、期待どおりのタイミングになる。
- IMemと<PC>/<IF>
- BRAMCoreでIMemを作り、<PC>でreq、<IF>で命令を受け取る。
- 完了条件:<ID>で逆アセンブル表示を出し、fiboのobjdumpと一致する。
- Decoder、RegFile、ALU
- decodeでDecInstを作り、<EX>で演算、<WB>で書き戻す。データハザードは<ID>の発火条件で止める。
- 完了条件:rv32uiの演算系(add, addi, sub, and, or, xor, sll, srl, sra, slt, lui, auipc など)が通る。
- DMemとロード/ストア
- <EX>でアドレス計算とreq、<MA>で受け取り、バイト/ハーフワードの整列と符号拡張。
- 完了条件:lb/lh/lw/lbu/lhu/sb/sh/swが通る。
- 分岐とジャンプ
- <EX>で分岐を解決し、<PC>へredirect。epoch不一致の命令は<ID>と<EX>で捨てる。予測は「常に非分岐」から始める。
- 完了条件:rv32ui-p全テストとfiboが通る。
- フォワーディング
- <EX>→<EX>、<MA>→<EX>のバイパスを、方針7の判定で入れる。
- 完了条件:段をランダムに止めても結果が変わらず、サイクル数が減る(CPIを計測)。
- CSRとEIT
- Zicsr、ecall/ebreak/mret、不正命令・アドレス例外を<MA>で一括判定する。
- 完了条件:rv32mi-pの主要テストが通る。
- キャッシュ
- プロセッサ完成後の別フェーズ。Memのインタフェースは変えずに裏をICache→DCacheに差し替え、その後に仮想記憶(TLB)を加える。
- 完了条件:全テストがそのまま通り、ミス率とCPIを計測できる。
- 拡張(任意):M拡張、BTB、FPGA実装。
未決事項
- [ ] ソースの置き場所。git svnでGitHubのprivateリポジトリへ移行する。リポジトリ名待ち
- [ ] 対象ISAはRV32I + Zicsr、特権はMモードのみでよいか
- [ ] 最終ターゲットのFPGA(Ultra96、Arty など)。BRAM容量とキャッシュの要否に効く
Leave a Comment