Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

RvMmio

RvCore のメモリマップドペリフェラル (docs/riscv.md「メモリマップ」)

レイテンシと握手は RvMem と同じ(要求の次サイクルに o_done).

オフセット幅動作
0x00 TOHOSTW終了通知.o_tohost_valid を 1 サイクル上げ値を出す(riscv-tests と同じ規約)
0x10 UARTW下位 8 bit を UART TX へ送出する
0x10 UARTRbit0 = 送信可(0 なら前のバイトが未送出)
0x14 UART RXRbit8 = 受信あり,bit7-0 = データ.読むと 1 バイト消費する
0x20 LEDW下位 6 bit を LED へ(極性は Top 側で扱う)
0x30 MTIME_LOR自走カウンタ(クロック毎に +1)の下位 32 bit
0x34 MTIME_HIR同上位 32 bit
0x38 MTIMECMP_LOR/W比較値の下位 32 bit
0x3C MTIMECMP_HIR/W同上位 32 bit
0x50 TF_CTRLWbit0 = 開始,bit1 = 方向(0 = リード,1 = ライト)
0x50 TF_CTRLR状態語(bit0 busy / bit1 init_done / bit4:2 init_err / bit7:5 err / bit8 rx_valid / bit9 tx_space)
0x54 TF_LBAR/W入出力する論理ブロックアドレス
0x58 TF_DATARbit8 = 受信あり,bit7:0 = 受信データ.読むと 1 バイト消費する
0x58 TF_DATAW下位 8 bit をライトデータとして送出する

タイマ割り込みは mtime >= mtimecmp で o_timer_irq を上げる(CLINT 相当). mtimecmp はリセット時に全 1 とし,設定するまで割り込まない.

UART は 1 バイトのバッファのみ持つ.ソフトウェアは送信前に 0x10 を読んで bit0 が 1 であることを確認する.

Ports


i_clk input clock クロック
i_rst input reset リセット
i_valid input logic アクセス要求
i_addr input logic<32> バイトアドレス
i_write input logic 1 でストア
i_wdata input logic<32> ストアデータ
o_done output logic 完了(1 サイクル)
o_rdata output logic<32> リードデータ
tx modport stream_if source UART TX へ
rx modport stream_if sink UART RX から
o_leds output logic<6> LED(active-high.Top で反転する)
o_tohost_valid output logic 終了通知
o_tohost output logic<32> 終了コード
o_timer_irq output logic タイマ割り込み(mtime >= mtimecmp)
o_tf_start output logic TF セクタ入出力開始(1 サイクルパルス)
o_tf_wr output logic TF の方向(0 = リード,1 = ライト)
o_tf_lba output logic<32> TF の読み出し LBA
i_tf_status input logic<32> TF の状態語
o_tf_rx_pop output logic TF 受信バイト消費(1 サイクルパルス)
i_tf_rx_data input logic<8> TF 受信バイト
i_tf_rx_valid input logic TF 受信バイトあり
o_tf_tx_push output logic TF 送信バイト追加(1 サイクルパルス)
o_tf_tx_data output logic<8> TF 送信バイト
i_tf_tx_space input logic TF 送信 buffer に空きがある