Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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> 書き込みデータ