모듈식 ISA: 베이스와 확장
RISC-V 칩의 설명서에는 RV32IMAC, RV64GC, rv64imafdcv_zba_zbb_zicond 같은 알쏭달쏭한 이름이 붙어 있다. 이것은 암호가 아니라 “어떤 블록을 쌓았는가”를 적은 목록이다. RISC-V는 반드시 있어야 하는 작은 베이스 ISA 위에 필요한 확장만 골라 쌓는 모듈식 ISA다. 이 장에서는 그 이름 규칙을 해독하고, 확장 사이의 의존 관계와 명령어 인코딩 공간이 어떻게 나뉘어 있는지 살펴본다.
- 네 가지 베이스 ISA(RV32I·RV64I·RV32E·RV64E)의 차이와 RV128I의 현재 위치를 안다.
- M·A·F·D·Q·C·B·V·H 같은 단일 문자 확장과 G의 뜻을 안다.
- Z·S·X로 시작하는 여러 글자 확장의 이름 규칙(분류 문자, 순서, 밑줄)을 적용한다.
rv64i2p1같은 버전 표기와 정규 순서를 읽고 직접 만들어 본다.- D→F→Zicsr 같은 확장 의존 관계와 Zcmp↔Zcd 같은 충돌을 설명한다.
- 명령어 하위 비트로 길이를 판정하는 방법과 주 opcode 지도, custom-0~3 공간을 이해한다.
레고처럼 쌓는 ISA
x86과 Arm 같은 기존 ISA는 세대가 바뀔 때마다 명령어가 덧붙어 왔다. 새 칩은 옛 명령을 모두 지원해야 하고, 그 결과 ISA는 하나의 거대한 덩어리가 되었다. RISC-V는 반대로 접근했다. 컴파일러와 운영체제를 돌리기에 딱 충분한 베이스 정수 ISA(base integer ISA)를 정해 두고, 나머지는 모두 확장(extension)으로 떼어 냈다. 구현자는 필요한 블록만 골라 쌓는다.
규격 서론은 이 방식을 다른 ISA와 대비해 이렇게 설명한다. 다른 아키텍처는 ISA를 한 덩어리로 다루며 버전이 오를 때마다 명령이 늘어나지만, RISC-V는 베이스와 각 표준 확장을 시간이 지나도 바꾸지 않고, 새 명령은 또 다른 선택적 확장으로 얹는다. 그래서 베이스 ISA만으로도 언제까지나 독립된 ISA로 쓸 수 있다.
“RISC-V will endeavor to keep the base and each standard extension constant over time, and instead layer new instructions as further optional extensions. For example, the base integer ISAs will continue as fully supported standalone ISAs, regardless of any subsequent extensions.”
| 덧붙이는 ISA (x86 등) | 모듈식 ISA (RISC-V) | |
|---|---|---|
| 새 기능 | 다음 세대 ISA 버전에 추가 | 새 이름의 선택 확장으로 추가 |
| 작은 칩 | 쓰지 않는 옛 명령도 구현해야 함 | 베이스 + 필요한 확장만 |
| 소프트웨어가 아는 방법 | CPUID 같은 기능 비트 | ISA 문자열·프로파일·misa CSR·장치 트리 |
| 단점 | ISA가 계속 비대해짐 | 조합이 너무 많아짐 → 23장의 프로파일로 묶음 |
네 가지 베이스 ISA
베이스 ISA는 정수 레지스터의 폭(XLEN)과 개수로 구별된다. 현재 규격에는 네 가지가 있다. 폭이 32비트인 RV32I와 64비트인 RV64I가 주된 두 갈래이고, 각각에서 레지스터 수를 32개에서 16개로 줄인 RV32E와 RV64E가 있다. 규격은 이 넷을 서로 다른 별개의 ISA로 취급한다. RV32I는 RV64I의 부분집합이 아니다. 예컨대 같은 add 인코딩이 RV32I에서는 32비트 덧셈, RV64I에서는 64비트 덧셈이다.
| 베이스 | XLEN | 정수 레지스터 | 주소 공간 | 현행 버전 · 상태 |
|---|---|---|---|---|
RV32I | 32 | 32개 (x0–x31) | 232 바이트 | 2.1 · Ratified |
RV64I | 64 | 32개 (x0–x31) | 264 바이트 | 2.1 · Ratified |
RV32E | 32 | 16개 (x0–x15) | 232 바이트 | 2.0 · Ratified |
RV64E | 64 | 16개 (x0–x15) | 264 바이트 | 2.0 · Ratified |
RV128I | 128 | — | — | 현행 매뉴얼에 없음 (2019년판까지 Draft 1.7) |
E 변형은 레지스터만 16개로 줄었을 뿐 인코딩은 I와 같다. x16–x31을 가리키는 인코딩은 모두 예약(reserved)으로 남겨 두었다. 이전 초안은 이 인코딩을 custom 용도로 풀어 주었지만, 비준된 2.0은 나중에 custom 공간이나 새 표준 인코딩 어느 쪽으로든 쓸 수 있도록 더 보수적으로 예약해 두었다. 또 규격은 “특별히 언급하지 않는 한 RV32I·RV64I와 호환되는 표준 확장은 RV32E·RV64E와도 호환된다”고 적는다. 예외로 H 확장은 레지스터 32개짜리 I 베이스를 요구한다. 레지스터 모델은 3장, 64비트로 넓어질 때의 차이는 6장에서 자세히 본다.
2019년판 매뉴얼까지는 128비트 주소 공간을 위한 RV128I가 “Draft 1.7”로 실려 있었고, misa.MXL=3도 XLEN 128을 뜻했다. 최근 개정에서 비준되지 않은 내용을 걷어 내면서 RV128I 스케치가 삭제되었고, 현행 특권 규격에서 MXL=3은 Reserved다. 서론은 여전히 “128비트 평면 주소 공간이 언젠가 필요해지면 기존 RISC-V 틀 안에서 새 RV128I 베이스로 수용할 수 있다”고만 적어 둔다.
단일 문자 표준 확장과 G
가장 기본적인 표준 확장은 알파벳 한 글자로 이름 붙인다. 정수 곱셈·나눗셈은 M, 원자적 메모리 연산은 A, 단정밀도 부동소수점은 F, 배정밀도는 D 하는 식이다. 규격의 표 1은 이 글자들을 나열하는 동시에, ISA 문자열에서 글자가 나와야 하는 정규 순서까지 정한다. 표의 위에서 아래로가 문자열의 앞에서 뒤로다.
| 순서 | 이름 | 내용 | 암시하는 것 | 현행 버전 | 이 책 |
|---|---|---|---|---|---|
| 1 | I / E | 베이스 정수 (32개 / 16개 레지스터) | 2.1 / 2.0 | 5장 | |
| 2 | M | 정수 곱셈·나눗셈 | Zmmul | 2.0 | 9장 |
| 3 | A | 원자적 연산 (= Zaamo + Zalrsc) | 2.1 | 10장 | |
| 4 | F | 단정밀도 부동소수점 | Zicsr | 2.2 | 12장 |
| 5 | D | 배정밀도 부동소수점 | F | 2.2 | 12장 |
| 6 | G | 일반 목적 묶음 = IMAFD + Zicsr + Zifencei | IMAFDZicsr_Zifencei | — | 이 장 |
| 7 | Q | 4배정밀도 부동소수점 | D | 2.2 | 12장 |
| 8 | C | 16비트 압축 명령 | 2.0 | 13장 | |
| 9 | B | 비트 조작 (= Zba + Zbb + Zbs) | 1.0 | 14장 | |
| 10 | P | Packed-SIMD | 미비준 | — | |
| 11 | V | 벡터 | D | 1.0 | 15장 |
| 12 | H | 하이퍼바이저 | 1.0 (특권 규격) | 21장 |
따라서 RV32IMACV는 올바른 이름이지만 RV32IMAVC는 그렇지 않다(규격이 직접 드는 예다). 맨 위의 G는 확장이 아니라 줄임말이다. 규격은 “표준 범용 ISA”를 나타내려고 G = IMAFDZicsr_Zifencei로 정했다. 그래서 리눅스 배포판이 흔히 쓰는 RV64GC를 풀어 쓰면 RV64IMAFDC_Zicsr_Zifencei가 된다.
규격은 “ISA 이름 문자열은 대소문자를 구별하지 않는다”고 정한다. 문서에서는 RV64GC처럼 대문자를, 툴체인 옵션에서는 rv64gc처럼 소문자를 주로 쓴다. 이 책의 시뮬레이터도 소문자로 정규화한다.
초기 매뉴얼에서는 CSR 명령과 FENCE.I가 베이스 I에 들어 있었다. 2019년 개정에서 이 둘을 베이스 밖으로 빼내 각각 Zicsr, Zifencei라는 확장으로 만들었고, 베이스 버전을 2.1로 올렸다. FENCE.I는 명령어 캐시와 데이터 캐시가 서로 일관되지 않은 큰 구현에서 다루기 까다로웠고 리눅스 사용자 ABI에서도 빠졌기 때문이다. G가 예전과 같은 뜻을 유지하도록 두 이름을 G의 정의에 명시해 넣은 것이다.
Z·S·X: 여러 글자 확장의 이름
알파벳은 26자뿐이고, 작은 확장은 수십 개다. 그래서 규격은 여러 글자로 된 이름을 쓰는 세 가지 접두어를 정했다.
- Z + 이름 — 표준 비특권 확장. 예:
Zicsr,Zba,Zfh,Zvbb. - S + 이름 — 표준 특권 확장. 감독자 수준 가상 메모리는
Sv(예:Svnapot), 그 밖의 감독자 수준은Ss(예:Sstc), 하이퍼바이저 수준은Sh, 머신 수준은Sm(예:Smepmp). - X + 이름 — 비표준 확장. 회사나 연구실이 스스로 정의한다. 예: 규격이 드는
Xhwacha.
Z 이름에는 숨은 규칙이 하나 더 있다. Z 바로 뒤의 글자는 가장 가까운 단일 문자 확장의 분류를 나타낸다. Zfa의 f는 F(부동소수점)와 관련 있다는 뜻이고, Zicsr의 i는 베이스 I와 관련 있다는 뜻이다. 분류 문자의 순서는 규격이 IMAFDQLCBKJTPVH로 정해 두었다. 여러 Z 확장을 나열할 때는 먼저 분류 순서로, 같은 분류 안에서는 알파벳 순서로 적는다.
IMAFDQLCBKJTPVH는 단일 문자 확장 순서에서 E·G를 빼고, 지금의 단일 문자 표에는 없는 L·K·J·T를 끼워 넣은 모양이다. 규격은 이것을 “관례적으로(conventionally)” 따르는 규칙이라 부른다.여러 글자 이름에도 형식 제약이 있다. 이름은 영문자로 끝나야 하고, 마지막 글자가 p라면 그 앞 글자는 숫자일 수 없다. 이름 끝의 숫자나 “숫자+p”는 버전 번호로 읽히기 때문이다(다음 절). 그래서 Zvl128b처럼 숫자가 이름 가운데 들어가는 것은 괜찮다. 규격은 sv32, sv39, sv48이 이 규칙이 생기기 전에 정해진 예외라고 밝힌다.
| 접두어 | 뜻 | 문자열 안 위치 | 예 |
|---|---|---|---|
Z | 표준 비특권 확장 | 단일 문자 뒤, 분류 순 → 알파벳 순 | Zicond, Zba, Zvbb |
Ss · Sv | 표준 감독자 수준 확장 | Z 뒤, 알파벳 순 | Sstc, Svinval, Svnapot |
Sh | 표준 하이퍼바이저 수준 확장 | 감독자 수준 뒤, 알파벳 순 | (감독자 쪽에서 안 보이는 소수만) |
Sm | 표준 머신 수준 확장 | 덜 특권적인 확장들 뒤, 알파벳 순 | Smepmp, Smstateen |
X | 비표준 확장 | 모든 표준 확장 뒤, 알파벳 순 | Xhwacha |
ISA 문자열의 문법: 순서·밑줄·버전
이제 조각을 모아 ISA 문자열 하나를 해부해 보자. 문자열은 XLEN → 베이스 → 단일 문자 → Z → S → X의 순서를 따르고, 여러 글자 확장끼리는 반드시 밑줄 _로 구분한다.
xvendorx는 가상의 비표준 확장 이름이다. 아래 줄처럼 확장 이름 뒤에 주버전 p 부버전을 붙일 수 있다. 버전을 붙이면 글자 경계가 모호해지므로 툴체인은 보통 모든 확장 사이에 밑줄을 넣는다.버전 번호
확장 이름 바로 뒤의 숫자는 버전이다. 주버전과 부버전 사이에 p를 넣고, 부버전이 0이면 p0을 생략해도 된다. 따라서 rv32i2p1은 “RV32I 버전 2.1”이다. 주버전이 바뀌면 하위 호환이 깨질 수 있고, 부버전만 바뀌면 반드시 하위 호환이어야 한다. 버전을 적지 않으면 버전 번호 체계가 도입된 두 번째 판 당시의 버전이 기본값이어서, RV32I는 RV32I2와 같다.
Packed-SIMD 확장의 이름이 하필 P라서 버전 구분자와 헷갈린다. 규격은 버전이 붙은 확장 뒤에 P가 오면 반드시 밑줄을 넣으라고 한다. rv32i2p2는 “RV32I 버전 2.2”이고, rv32i2_p2는 “RV32I 버전 2.0 + P 버전 2.0”이다.
“If multiple "Z" extensions are named, they should be ordered first by category, then alphabetically within a category—for example, "Zicsr_Zifencei_Ztso".”
ISA 문자열 해독기 · 조립기
rv64gc를 넣고 펼친 이름에 무엇이 나타나는지 보자. 그다음 D를 끄면 C가 Zcd를 더 이상 포함하지 않는 것을 확인하자. rv32imafdc_zcmp는 왜 오류일까? 마지막으로 V를 켜면 Zve64d·Zvl128b 같은 하위 확장이 저절로 따라온다.확장 사이의 의존과 충돌
확장들은 서로 독립적이지 않다. 배정밀도 D는 단정밀도 F의 레지스터와 명령을 바탕으로 하고, F는 부동소수점 상태 레지스터 fcsr을 읽고 쓰기 위해 Zicsr이 필요하다. 규격은 이런 의존이 “ISA 이름에 암묵적으로 들어 있을 수 있다”고 말한다. 즉 RV32ID는 RV32IFD, 그리고 RV32IFDZicsr와 같은 뜻이다.
| 규칙 | 종류 | 규격 근거 |
|---|---|---|
| D → F → Zicsr, Q → D | 의존 | Naming 표 1, F·D·Q 장 |
| M → Zmmul (곱셈만 있는 부분집합) | 포함 | Naming 표 1 |
| C → Zca, C+F → Zcf (RV32만), C+D → Zcd | 포함 | Zc* 장 |
| Zcmp · Zcmt ✕ Zcd | 충돌 | Zc* 장 (c.fsdsp 인코딩 재사용) |
| Zcf는 RV64에 없음 | 제약 | Zc* 장 |
| V → Zve64d + Zvl128b, Zve64d → D | 의존 | V 장 |
| H는 32개 레지스터의 I 베이스 필요 (E 불가) | 제약 | 특권 규격 H 장 |
| Zfinx 계열 ↔ F 계열: 소프트웨어 서로 비호환, 같은 명령 인코딩을 다른 레지스터로 해석 | 대안 | Zfinx 장 |
표준, 예약, custom, 그리고 비준 상태
규격은 인코딩 공간(그리고 CSR 같은 관련 공간)을 서로 겹치지 않는 세 범주로 나눈다. standard는 RISC-V International이 정의한 것, reserved는 아직 비어 있지만 미래 표준을 위해 남긴 것, custom은 표준이 절대 쓰지 않겠다고 약속한 공간이다. 표준이 아닌 확장은 모두 non-standard이며, custom 공간만 쓰면 custom 확장, 표준이나 예약 공간을 건드리면 non-conforming 확장이 된다.
확장 규격 자체에는 개발 단계가 있다. 2019년판 매뉴얼은 각 모듈에 Ratified(비준), Frozen(비준 전 큰 변경이 없을 것으로 예상), Draft(비준 전에 바뀔 것으로 예상) 상태를 표시했다. 당시 V는 Draft 0.7, RV32E는 Draft 1.9였다. 2025년 판부터는 비준되지 않은 내용을 매뉴얼에서 모두 걷어 냈기 때문에, 이 책의 기준인 v20260120에 실린 모듈은 모두 Ratified다. 비준 전 확장을 컴파일러에서 쓰려면 보통 “실험적” 옵션이 필요하다.
명령어 길이 인코딩
모듈식 설계를 하려면 인코딩 공간도 넉넉해야 한다. RISC-V는 처음부터 가변 길이 명령어를 염두에 두었다. 명령은 16비트 파슬(parcel)의 배수 길이이고, 길이는 첫 파슬의 하위 비트만 보면 알 수 있다. 베이스 ISA의 32비트 명령은 모두 하위 두 비트가 11이다. 하위 두 비트가 00, 01, 10인 공간은 선택적인 16비트 압축 명령(C, Zc*)에 쓰인다.
규격은 0으로만 된 명령과 1로만 된 명령을 일부러 불법 명령으로 정했다. 비트 [15:0]이 모두 0이면 불법 명령이고(16비트 확장이 있으면 16비트 길이로, 없으면 32비트 길이로 본다), 비트 [ILEN-1:0]이 모두 1인 것도 불법이다. 잘못된 점프로 0으로 채워진 메모리나 지워진 플래시(모두 1)로 뛰어들면 곧바로 트랩이 나도록 하려는 것이다.
명령어는 메모리 엔디언과 관계없이 16비트 리틀 엔디언 파슬의 나열로 저장된다. 낮은 주소의 파슬이 명령의 낮은 비트를 담으므로, 길이를 정하는 비트가 언제나 가장 먼저 읽힌다. 아래 그림에서 명령어 가져오기 장치가 파슬을 따라가며 길이를 판정하는 모습을 보자.
11인지에 따라 2바이트 또는 4바이트를 건너뛴다. C 확장이 있으면 32비트 명령도 2바이트 경계에 놓일 수 있다(IALIGN = 16).규격은 명령어 주소 정렬 단위를 IALIGN, 구현이 지원하는 가장 긴 명령 길이를 ILEN이라 부른다. 베이스만 있으면 IALIGN = 32, ILEN = 32다. C 같은 확장이 IALIGN을 16으로 완화하며, IALIGN은 16이나 32 외의 값을 가질 수 없다.
규격 해설에 따르면 IMAFD만 구현하는 칩은 명령어 캐시에 상위 30비트만 저장해도 된다(6.25% 절약). 또 베이스 RV32I는 32비트 명령어 공간의 1/8도 쓰지 않으므로, C 확장이 필요 없는 구현은 하위 두 비트가 00·01·10인 세 공간을 비표준(non-conforming) 30비트 명령 공간 세 개로 쓸 수도 있다.
명령어 길이 해독기
11로 만들었다 풀었다 해 보자. 비트 [4:2]까지 모두 1로 만들면 현행 규격에서는 “예약”이 되고, 옛 제안에서는 비트 [6:5]와 [14:12]에 따라 48·64·80비트 이상으로 갈린다. 길이를 정하는 데 필요한 비트가 모두 아래쪽에 모여 있는 점에 주목하자.주 opcode 지도와 custom 공간
32비트 명령의 하위 7비트가 주 opcode(major opcode)다. 하위 두 비트는 늘 11이므로 실제로 고르는 것은 나머지 5비트, 즉 32칸이다. 규격은 이 32칸을 비트 [6:5]를 행, 비트 [4:2]를 열로 하는 4×8 표로 정리한다. 이 표가 RISC-V 인코딩 공간의 지도다.
add의 opcode 0110011은 행 01, 열 100 칸, 곧 아래 지도의 OP 칸이다. 같은 칸 안에서 어떤 연산인지는 funct3·funct7이 가른다(4장).RV 주 opcode 지도 (inst[1:0] = 11)
“Opcodes marked as reserved should be avoided for custom instruction-set extensions as they might be used by future standard extensions. Major opcodes marked as custom-0 through custom-3 will be avoided by future standard extensions and are recommended for use by custom instruction-set extensions within the base 32-bit instruction format.”
Volume I, RV32/64G Instruction Set Listings — 이 장의 표 1이 위 지도의 원본이다.
custom 칸이 넷뿐이라고 작아 보이지만, 칸 하나가 32비트 명령 공간의 1/128이다. funct3·funct7을 마음대로 쓰면 칸 하나에 수천 개 명령을 넣을 수 있다. 실제로 여러 회사가 AI 가속, DSP, 보안용 명령을 custom 공간에 넣고 X 이름을 붙여 배포한다. 표준이 그 공간을 침범하지 않으므로, 같은 칩이 RISC-V 표준 소프트웨어를 그대로 돌리면서 자기만의 명령도 쓸 수 있다.
이름이 쓰이는 곳: 컴파일러·ELF·misa
ISA 문자열은 문서용 꼬리표에 그치지 않는다. 컴파일러는 -march 옵션으로 문자열을 받아 어떤 명령을 만들어도 되는지 정하고, 짝꿍인 -mabi로 함수 호출 규약을 정한다(7장). 결과 오브젝트 파일에는 펼친 ISA 문자열이 기록되고, 링커는 서로 맞지 않는 파일을 걸러 낸다. 실행 시에는 하드웨어가 misa CSR로 자기가 가진 단일 문자 확장을 알려 준다.
Tag_RISCV_arch 속성에 소문자, 밑줄 구분, 버전 명시, 줄임말 펼침 형태로 기록하라고 정한다. 아래는 RV64IMAFDC + S·U 모드 칩의 misa 값으로, 비트 0이 A, 비트 25가 Z인 글자 비트다. 여러 글자 확장은 misa에 나타나지 않으므로 장치 트리 같은 다른 수단으로 알린다. misa는 17장에서 자세히 본다.“the architecture rv32g has to be presented as rv32i2p1_m2p0_a2p1_f2p2_d2p2_zicsr2p0_zifencei2p0 in which the abbreviation g is expanded to the imafd_zicsr_zifencei combination with default versions of the standard extensions.”
Zicsr와 Zifencei가 베이스에서 분리된 뒤로, 2019년 이후 규격을 따르는 툴체인에서 -march=rv64imafdc에는 fence.i가 들어 있지 않다(F가 Zicsr를 암시하므로 CSR 명령은 쓸 수 있다). G는 정의상 둘 다 포함하므로 범용 리눅스 코드는 보통 rv64gc를 쓴다. 최근 GCC·LLVM은 -march=rva23u64처럼 프로파일 이름을 직접 받기도 한다.
| 상황 | 흔한 -march / -mabi |
|---|---|
| 작은 MCU (곱셈·압축) | -march=rv32imc -mabi=ilp32 |
| 초소형 E 코어 | -march=rv32ec -mabi=ilp32e |
| 단정밀도 FPU 달린 MCU | -march=rv32imafc -mabi=ilp32f |
| 64비트 리눅스 (전통적 기준선) | -march=rv64gc -mabi=lp64d |
| RVA23 리눅스 배포판 | -march=rva23u64 -mabi=lp64d (프로파일 이름을 아는 툴체인) |
핵심 정리
- RISC-V ISA = 베이스 하나(RV32I·RV64I·RV32E·RV64E) + 선택 확장. 베이스와 비준된 확장은 시간이 지나도 바뀌지 않고, 새 기능은 새 확장으로 얹는다. RV128I 스케치는 현행 매뉴얼에서 빠졌다.
- 단일 문자 확장의 정규 순서는
I E M A F D G Q C B P V H이고,G=IMAFDZicsr_Zifencei다. - 여러 글자 확장은 Z(비특권) → Ss/Sv(감독자) → Sh(하이퍼바이저) → Sm(머신) → X(비표준) 순서로 밑줄을 넣어 잇는다. Z는 분류 문자(
IMAFDQLCBKJTPVH) 순, 같은 분류 안에서는 알파벳 순이다. - 버전은
주버전p부버전(예:i2p1)으로 붙이며p0은 생략할 수 있다. 버전이 붙은 확장 뒤의 P에는 밑줄이 필요하다. - 확장은 서로 의존한다(D→F→Zicsr, V→Zve64d→D, C+D→Zcd). Zcmp·Zcmt와 Zcd처럼 인코딩이 겹쳐 함께 쓸 수 없는 쌍도 있다.
- 하위 두 비트가
11이 아니면 16비트,11이고 비트 [4:2]가111이 아니면 32비트 명령이다. 비트 [4:2] = 111은 더 긴 명령을 위해 예약되어 있다. - 주 opcode 지도의 custom-0~3은 표준이 쓰지 않기로 약속한 공간으로, 회사 전용 X 확장이 들어가는 자리다.
확인 퀴즈
다음 중 규격의 정규 순서를 지킨 ISA 문자열은?
G를 풀어 쓴 것으로 옳은 것은?
여러 Z 확장을 올바른 순서로 나열한 것은?
rv32i2_p2의 뜻은?
rv32i2p2였다면 RV32I 버전 2.2다.첫 16비트 파슬의 하위 비트가 ...10111일 때 이 명령의 길이는? (현행 규격)
회사가 자기만의 명령을 넣으려 할 때 규격이 권하는 주 opcode는?
rv32imafdc_zcmp가 문제인 이유는?
더 읽을거리
- Volume I — ISA Extension Naming Conventions (v20260120)
- Volume I — Introduction (RISC-V ISA Overview, Base Instruction-Length Encoding)
- Volume I — RV32E and RV64E Base Integer Instruction Sets, Version 2.0
- Volume I — RV32/64G Instruction Set Listings (opcode map)
- Volume I — Zc* 확장 (C·Zca·Zcf·Zcd·Zcmp 관계)
- RISC-V ABIs Specification v1.0 — Attributes (Tag_RISCV_arch)
- RVA23 Profiles — 시뮬레이터의 프로파일 비교 기준