RvMulDiv
RV32M の乗除算ユニット (docs/riscv.md「ISA スコープ」)
i_start の 1 サイクルパルスで起動し,完了サイクルに o_done を 1 にする.
多サイクルコアから見ると RvMem と同じ「要求 → 完了」の形になる.
- 乗算は 1 サイクル.符号付き / 符号なしの組み合わせは絶対値を取ってから 符号なし乗算し,結果の符号を戻す(MULHSU があるため被乗数と乗数で 符号の扱いが異なる)
- 除算は復元法で 32 反復.ハードウェア除算器は持たない
ゼロ除算とオーバフローの扱いは RISC-V 仕様に従う.
| 条件 | DIV | DIVU | REM | REMU |
|---|---|---|---|---|
| 除数 0 | -1 | 2^32-1 | 被除数 | 被除数 |
| -2^31 / -1 | -2^31 | — | 0 | — |
Ports
| i_clk | input | clock | クロック |
|---|---|---|---|
| i_rst | input | reset | リセット |
| i_start | input | logic | 起動 (1 サイクルパルス) |
| i_funct3 | input | logic<3> | 命令の funct3 |
| i_a | input | logic<32> | rs1 |
| i_b | input | logic<32> | rs2 |
| o_result | output | logic<32> | 結果 |
| o_done | output | logic | 完了 (1 サイクル) |