Article #1145

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on November 9, 2026 #1145

設計ファイル

ファイル 中身 形 使う段
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で回帰確認できる順にします。各ステップの終わりで確認し、次へ進みます。ハザードは最初はストールだけで正しく動かし、フォワーディングは性能改善として後から入れます。

  1. 検証環境(Claude)
    • RISC-V GCCでriscv-tests(rv32ui-p)とfibo.cをビルドし、$readmemh用の.memを作る。
    • Makefile、bsimとVerilatorの両実行、tohost書き込みでの合否判定、コミットログ出力を用意する。
    • 期待値はISS(Spike)のコミットログと照合する。
  2. Types.bsvと段間FIFO
    • 段間構造体、mkPipelineFIFO、mkPipeQで6段をつなぐ。各段を止めるテスト用の発火条件とepochもここで入れる。
    • 完了条件:任意の段を任意のサイクルで止めるテストで、期待どおりのタイミングになる。
  3. IMemと<PC>/<IF>
    • BRAMCoreでIMemを作り、<PC>でreq、<IF>で命令を受け取る。
    • 完了条件:<ID>で逆アセンブル表示を出し、fiboのobjdumpと一致する。
  4. Decoder、RegFile、ALU
    • decodeでDecInstを作り、<EX>で演算、<WB>で書き戻す。データハザードは<ID>の発火条件で止める。
    • 完了条件:rv32uiの演算系(add, addi, sub, and, or, xor, sll, srl, sra, slt, lui, auipc など)が通る。
  5. DMemとロード/ストア
    • <EX>でアドレス計算とreq、<MA>で受け取り、バイト/ハーフワードの整列と符号拡張。
    • 完了条件:lb/lh/lw/lbu/lhu/sb/sh/swが通る。
  6. 分岐とジャンプ
    • <EX>で分岐を解決し、<PC>へredirect。epoch不一致の命令は<ID>と<EX>で捨てる。予測は「常に非分岐」から始める。
    • 完了条件:rv32ui-p全テストとfiboが通る。
  7. フォワーディング
    • <EX>→<EX>、<MA>→<EX>のバイパスを、方針7の判定で入れる。
    • 完了条件:段をランダムに止めても結果が変わらず、サイクル数が減る(CPIを計測)。
  8. CSRとEIT
    • Zicsr、ecall/ebreak/mret、不正命令・アドレス例外を<MA>で一括判定する。
    • 完了条件:rv32mi-pの主要テストが通る。
  9. キャッシュ
    • プロセッサ完成後の別フェーズ。Memのインタフェースは変えずに裏をICache→DCacheに差し替え、その後に仮想記憶(TLB)を加える。
    • 完了条件:全テストがそのまま通り、ミス率とCPIを計測できる。
  10. 拡張(任意):M拡張、BTB、FPGA実装。

未決事項

  • [ ] ソースの置き場所。git svnでGitHubのprivateリポジトリへ移行する。リポジトリ名待ち
  • [ ] 対象ISAはRV32I + Zicsr、特権はMモードのみでよいか
  • [ ] 最終ターゲットのFPGA(Ultra96、Arty など)。BRAM容量とキャッシュの要否に効く

左矢前のブログ 次のブログ右矢

Leave a Comment

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.