RISC-V RV32I Base Instruction Set Overview
Word size: 32 bits
Registers: 32 general-purpose registers (x0–x31)
x0 is always zero
All instructions are 32 bits wide
1. Arithmetic Instructions (R-type and I-type)
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
ADD rd, rs1, rs2 |
R | rd = rs1 + rs2 | Add |
SUB rd, rs1, rs2 |
R | rd = rs1 – rs2 | Subtract |
ADDI rd, rs1, imm |
I | rd = rs1 + imm | Add immediate |
SLT rd, rs1, rs2 |
R | rd = (rs1 < rs2)?1:0 | Set 1 if less than (signed) |
SLTU rd, rs1, rs2 |
R | rd = (rs1 < rs2)?1:0 | Set 1 if less than (unsigned) |
SLTI rd, rs1, imm |
I | rd = (rs1 < imm)?1:0 | Set 1 if less than immediate |
SLTIU rd, rs1, imm |
I | rd = (rs1 < imm)?1:0 | Unsigned version |
2. Logical Instructions
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
AND rd, rs1, rs2 |
R | rd = rs1 & rs2 | Bitwise AND |
OR rd, rs1, rs2 |
R | rd = rs1 | rs2 | Bitwise OR |
XOR rd, rs1, rs2 |
R | rd = rs1 ^ rs2 | Bitwise XOR |
ANDI rd, rs1, imm |
I | rd = rs1 & imm | AND immediate |
ORI rd, rs1, imm |
I | rd = rs1 | imm | OR immediate |
XORI rd, rs1, imm |
I | rd = rs1 ^ imm | XOR immediate |
3. Shift Instructions
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
SLL rd, rs1, rs2 |
R | rd = rs1 << (rs2[4:0]) | Shift left logical |
SRL rd, rs1, rs2 |
R | rd = rs1 >> (rs2[4:0]) | Shift right logical |
SRA rd, rs1, rs2 |
R | rd = rs1 >> (rs2[4:0]) (sign-extend) | Shift right arithmetic |
SLLI rd, rs1, shamt |
I | rd = rs1 << shamt | Shift left immediate |
SRLI rd, rs1, shamt |
I | rd = rs1 >> shamt | Shift right logical imm |
SRAI rd, rs1, shamt |
I | rd = rs1 >> shamt (sign-extend) | Shift right arithmetic imm |
4. Load Instructions (I-type)
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
LB rd, offset(rs1) |
I | Load byte (sign-extend) | 8 bits |
LH rd, offset(rs1) |
I | Load halfword (sign-extend) | 16 bits |
LW rd, offset(rs1) |
I | Load word | 32 bits |
LBU rd, offset(rs1) |
I | Load byte unsigned | 8 bits |
LHU rd, offset(rs1) |
I | Load halfword unsigned | 16 bits |
5. Store Instructions (S-type)
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
SB rs2, offset(rs1) |
S | Store byte | |
SH rs2, offset(rs1) |
S | Store halfword | |
SW rs2, offset(rs1) |
S | Store word |
6. Branch Instructions (B-type)
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
BEQ rs1, rs2, label |
B | if (rs1 == rs2) branch | |
BNE rs1, rs2, label |
B | if (rs1 != rs2) branch | |
BLT rs1, rs2, label |
B | if (rs1 < rs2) branch (signed) | |
BGE rs1, rs2, label |
B | if (rs1 ≥ rs2) branch (signed) | |
BLTU rs1, rs2, label |
B | if (rs1 < rs2) branch (unsigned) | ignore sign bit |
BGEU rs1, rs2, label |
B | if (rs1 ≥ rs2) branch (unsigned) | ignore sign bit |
7. Jump and Link Instructions
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
JAL rd, label |
J | rd = PC+4; PC = label | Jump to label and load PC+4 to rd |
JALR rd, offset(rs1) |
I | rd = PC+4; PC = rs1 + offset | Jump and link register |
8. Upper Immediate Instructions (U-type)
| Mnemonic | Type | Operation | Description |
|---|---|---|---|
LUI rd, imm20 |
U | rd = imm20 << 12 | Load upper immediate 20 bits (lower 12 bits 0) |
AUIPC rd, imm20 |
U | rd = PC + (imm20 << 12) | Add upper immediate to PC 20 bits (lower 12 bits 0) |
9. System Instructions
| Mnemonic | Type | Description |
|---|---|---|
ECALL |
System | Environment call (system call) |
EBREAK |
System | Breakpoint for debugger |
FENCE |
System | Memory ordering fence |
CSRRS, CSRRW, etc. |
System | Control and status register access (privileged) |
Register Summary (RV32I)
| Register | ABI Name | Description |
|---|---|---|
| x0 | zero | Constant 0 |
| x1 | ra | Return address |
| x2 | sp | Stack pointer |
| x3 | gp | Global pointer |
| x4 | tp | Thread pointer |
| x5–x7 | t0–t2 | Temporaries |
| x8 | s0/fp | Saved register / frame pointer |
| x9 | s1 | Saved register |
| x10–x17 | a0–a7 | Function arguments / return values |
| x18–x27 | s2–s11 | Saved registers |
| x28–x31 | t3–t6 | Temporaries |
Summary:
-
RV32I = 47 core instructions
-
Clean, orthogonal design (regular formats)
-
Easy to decode and ideal for hardware or teaching CPU design
System Instruction
| Category | Instructions | Purpose |
|---|---|---|
| Environment call / break | ECALL, EBREAK |
ECALL: request service from OS (like system call). EBREAK: trigger breakpoint for debugging. |
| CSR access | CSRRW, CSRRS, CSRRC and variants |
Read/write or modify Control and Status Registers (CSRs) like mtime, mstatus, mtvec. |
| Return from trap | MRET, SRET, URET |
Return from machine, supervisor, or user-mode trap/exception. |
| Fence / memory ordering | FENCE, FENCE.I |
Ensure memory or instruction ordering (used for I/O and cache management). |
| Hints / no-op | NOP, PAUSE |
For optimization or timing purposes; doesn’t change program state. |
System Instruction
? RISC‑V ISA を学習するための演習課題案
以下は、RISC‑V(特に基本整数命令セット:例えば RV32I)の命令セットを学ぶための段階的な課題案です。
| 課題 | 目的 | 説明・詳細 |
|---|---|---|
| 課題 1:RV32I 命令形式の理解 | 命令形式(R, I, S, B, U, J 形式など)を手で書いて理解 | – 各種命令形式(R, I, S, B, U, J)を取り上げ、それぞれのビット構造 (opcode, rd, rs1, rs2, immediate) を図示させる。 – 具体例(例: add, addi, lw, sw, beq, auipc, jal)を選んで、バイナリ (機械語) 表現を手で書かせる。 |
| 課題 2:手書きアセンブリ → バイナリ対応演習 | 命令がどのようにエンコードされるかを理解 | – 簡単なアセンブリスニペットを提示 (例:addi x1, x0, 5、beq x1, x2, label など)。– それらをバイナリ (32ビット命令ワード) に変換させる。 – 相互に逆変換 (機械語からアセンブラ) も練習。 |
| 課題 3:実際にアセンブラを書いて動かす | 実際にアセンブリを実行させて効果を確認 | – 簡単なプログラム (アセンブリ) を書き、RISC‑V シミュレータ (例:spike) 上で実行。– 例:2 レジスタを加算 → 結果をメモリに保存 → 分岐 → ループ。 – 実行後、レジスタ/メモリの内容を確認。 |
| 課題 4:命令セット最小化/拡張の考察 | ISA の設計思想 (拡張性) を考える | – RISC‑V の “基本命令 + 拡張命令” の概念 (たとえば M, A, C 拡張など) を説明させる。APS の記事などを参照。 APS|組み込み業界専門メディア – 生徒に「もしあなたが小さな組み込みコアを設計するとき、どの命令拡張 (M, A, C など) を有効にするか」を議論させ、その理由を発表。 |
| 課題 5(発展):カスタム命令設計 | ISA 拡張/カスタム命令の理解 | – RISC‑V の拡張性を利用して、カスタム命令を考える。 – 例えば、ある特定処理(例:乗算+加算を一命令でやる、または特定条件で分岐+加算命令)を “新しい命令” として設計。 – 擬似的にその命令のビットエンコーディング (opcode フィールド) を定義し、アセンブリ形式を作成。 – 可能であれば、シミュレータ/エミュレータ (例:自作 or 既存ツール) による実行やシミュレーションを試す。 Reddit などでもカスタム命令拡張の議論がある。 Reddit+1 |
? 講義・解説/補足ポイント
-
命令形式 (フォーマット) の重要性
RISC‑V では命令が固定長 (基本 32 ビット)/即値形式などが統一されており、これが RISC の特徴。 rsg.ci.i.u-tokyo.ac.jp+2アメーバブログ(アメブロ)+2 -
最小 ISA の思想
RISC‑V の命令セット設計は「最小限のコア + 拡張」という哲学がある。 Qiita+1 -
レジスタ構成
-
RV32I では 32 本の汎用レジスタがある (x0–x31)。 アメーバブログ(アメブロ)+1
-
レジスタ番号のビット幅 (5 ビット) やその意味を示す。
-
-
命令エンコーディング
-
各命令形式 (R, I, S, B, U, J) のビットフィールド (opcode, funct3, funct7, immediate) を詳しく説明。<br> 例えば I形式 (即値あり): rd, rs1, imm12 など。 アメーバブログ(アメブロ)
-
-
ISA 拡張
-
基本命令セット (I 拡張) に加えて、拡張 (M:乗除算、A:アトミック、C:圧縮、など) がある。 APS|組み込み業界専門メディア+1
-
拡張を使う意味 (性能、コードサイズ、用途) を議論させる。
-
✅ 実施上のポイント
-
使用ツール:RISC‑V アセンブリ+シミュレータ (例:
spike/ 他エミュレータ) -
環境準備:ツールチェイン (GCC for RISC‑V, spike など) の事前インストールを講習前に確認。 Gihyo 記事などを参考にセットアップ。 gihyo.jp
-
資料:命令リファレンス (RV32I の命令一覧) をスライド/演習用に配布。例えば Qiita のまとめを参考に。 Qiita
-
発展対応:カスタム命令を考える演習は、上級者や興味のある受講者向けにオプションとして追加。
もしよければ、Tang Nano 9K + PicoRV32 セミナー用に最適化された命令セット演習シラバス (時間配分 +解答例付き) を設計できます。やりましょうか?
あなた:
ChatGPT:
以下は、Tang Nano 9K + PicoRV32 セミナー向け(または類似の RISC‑V FPGA 講習)で使える、RISC‑V 命令セット学習の演習シラバス案(時間配分+課題+解答・評価ポイント付き)です。
RISC‑V 命令セット演習シラバス案
全体概要(モジュール)
-
対象 ISA:RV32I(基本 32 ビット整数命令)+オプションで拡張(例:
MやCなど) -
目的:命令形式 (フォーマット)、エンコーディング、デコード、実行の基本を理解する。さらに、簡単なカスタム命令の設計を通じて ISA 拡張の考え方を学ぶ。
-
所要時間:2時間(あるいは 3 セッション × 各 40 分など)
各セッション詳細
以下、3 セッション構成を想定。
| セッション | 時間 | 内容 | 演習 / 課題 | 解答・評価ポイント |
|---|---|---|---|---|
| セッション 1:命令形式とエンコーディング | 40分 | – RISC‑V の ISA のモジュラ構造(基本命令+拡張) – 命令フォーマット (R, I, S, B, U, J 形式) 解説 |
課題 A:命令形式演習 – 与えられた命令 (例: add, addi, lw, sw, beq, jal) について、対応する命令形式 (R, I, …) を分類させる– 各形式のビットフィールド (opcode, rd, rs1, rs2, immediate) を図示 – その命令を 32 ビットのバイナリ (機械語) に手でエンコードさせる |
– 命令形式の分類が正しい – ビットフィールド図が正確 (各フィールド幅, 符号ビット, 即値分割など) – 手で作ったバイナリが仕様に沿っている (デコードして検証) |
| セッション 2:アセンブラ → 実行/デコード | 40分 | – 命令のデコード (バイナリ → 各フィールド) – シミュレータ / 実行環境 (例:spike) を使った命令実行 |
課題 B:アセンブリ実行演習 – 簡単なアセンブリ・コード (例:加算 + 分岐 + メモリアクセス + ループ) を書いてもらう – アセンブルしてシミュレータ (spike など) で実行 – 実行後、レジスタ / メモリの値を確認 – objdump などで命令のバイナリ/アセンブリ対応を調べる |
– プログラムが正しく動作 (期待したループ回数、分岐、ロード/ストア結果など) – objdump 等での確認結果が正しい – 命令が正しくエンコード/実行されたかを説明できる |
| セッション 3:ISA 拡張とカスタム命令設計 | 40分 | – RISC‑V の拡張命令 (例:M, C, A など) の紹介 APS|組み込み業界専門メディア+1 – カスタム命令 (ISA 拡張) の思想 – 教育・研究での命令拡張例 |
課題 C:カスタム命令設計 – 受講者に簡単な演算 (例: (a * b) + c や特定ビット操作) を一命令で行うカスタム命令を設計させる– 命令のアセンブリ表記 (命令名、オペランド) を定義 – ビットエンコーディング (opcode, funct3/funct7 など) の案を作成 – (オプション) シミュレータ / 自作デコーダでその命令の動きをシミュレートさせる |
– 命令設計の妥当性 (操作内容+オペランド設計が意味を持つ) – ビットエンコーディングが適切 (命令フォーマット、opcode 重複の回避など) – 拡張を選ぶ理由を説明できる (なぜその命令が必要か、どんなユースケースか) – (オプション) シミュレーション結果が設計に合致する |
補足・講師向けノート
-
命令セット構造の解説
RISC‑V は「基本命令 (Base ISA) + 拡張 (Extension)」というモジュラー構造を持つ。例:RV32I が基本。 APS|組み込み業界専門メディア+1 -
命令形式
各命令形式 (R, I, S, B, U, J) の構造 (フィールドの意味と幅) を示す。特に即値 (immediate) のビット割り付け (符号ビット、シフトなど) を丁寧に説明。 -
レジスタモデル
RV32I では 32 本レジスタ (x0–x31) を使用。 東京大学情報学環 RSG+1 -
拡張命令の解説
-
“M” 拡張:乗算 / 除算命令
-
“C” 拡張:16 ビット圧縮命令 (RVC) による命令長の削減 APS|組み込み業界専門メディア
-
その他 (例:原子命令 “A” など)
-
-
カスタム命令設計
-
RISC‑V では自分で独自命令 (カスタム命令) を定義できる。 EDA EXPRESS
-
カスタム命令設計の際には opcode の割り当て、命令形式 (どのフォーマットを使うか)、オペランド設計、エンコーディングを考える必要がある。
-
実務/研究で使われる ISA 拡張例 (例えばカスタム SIMD 命令など) も紹介可能。 arXiv
-
-
評価基準
-
命令形式・エンコーディングが正しいか
-
プログラム (アセンブリ) の正しさとシミュレーション動作
-
(拡張) 命令設計の論理性と使いどころの妥当性
-
このシラバス案を受けて、講義資料 (スライド)、演習ガイド、配布用課題シート (Word または PDF) を作成すれば、RISC‑V ISA を深く理解させる実践的なモジュールが構築できます。