RvRegFile
RV32I のレジスタファイル (docs/riscv.md「マイクロアーキテクチャ」)
32 x 32 bit.読み出し 2 ポート・書き込み 1 ポート.
読み出しは 1 サイクル遅れる(i_rs1 / i_rs2 を与えた次のサイクルに
o_rd1 / o_rd2 が確定する).RvCore はこのために rdreg 状態を持つ.
実装は $std::ram を 2 面(読み出しポートごとに 1 面)で,書き込みは
両面へ同じ内容を行う.フリップフロップ + マルチプレクサで作ると
32:1 x 32 bit のマルチプレクサが 2 組必要になり LUT を大きく食うため
(実測でコア全体の LUT の大半を占めていた.docs/riscv.md「資源」),
メモリマクロへ寄せて論理を削る.
x0 は読み出し 0 固定・書き込み無効(RV32I のレジスタ定義). x0 のエントリは書かれないため RAM 上の値は不定だが,読み出し側で 定数 0 に置き換えるため観測されない.
Ports
| i_clk | input | clock | クロック |
|---|---|---|---|
| i_rst | input | reset | リセット |
| i_rs1 | input | logic<5> | 読み出しレジスタ番号 1 |
| o_rd1 | output | logic<32> | 読み出し値 1(1 サイクル遅れ) |
| i_rs2 | input | logic<5> | 読み出しレジスタ番号 2 |
| o_rd2 | output | logic<32> | 読み出し値 2(1 サイクル遅れ) |
| i_we | input | logic | 書き込みイネーブル |
| i_rd | input | logic<5> | 書き込み先レジスタ番号 |
| i_wdata | input | logic<32> | 書き込みデータ |