A RISC-V eleganciája nem csupán abban rejlik, hogy nyílt architektúrájú, hanem abban is, hogy már a kezdetektől moduláris felépítéssel tervezték. Míg az x86 több mint ezer utasítást, az ARM több százat tartalmaz, a RISC-V alapverziója mindössze 40 utasítást foglal magában, ha pedig a gyártó többre vágyik, utasításkiegészítéseket (extensions) alkalmazhat.
A RISC-V utasításmagja kicsi, és csak egész számokkal (integer) végzett műveleteket támogat. A specifikáció négy különböző utasításbázist különböztet meg: RV32I, RV32E, RV64I és RV128I, ahol az „I” az egész számokkal végzett műveleteket jelöli, a szám pedig az címzési busz szélességét adja meg: 32, 64, illetve a jövőben akár 128 bitet is (a 64 bittel nagyobb memóriabuszok használata várhatóan körülbelül 2030 körül lesz szükséges). Az RV32E kifejezetten mikrokontrollerekhez (embedded) készült, még kompaktabb változat: 32 helyett csak 16 munkaregisztert tartalmaz, és nem feltétlenül támogatja az időzítőket. A cél az, hogy csak a legszükségesebb minimum legyen meg, így a tervezők csak azokat a funkciókat adhatják hozzá, amelyekre valóban szükségük van.
A mag a processzor számára csak a legszükségesebb alapfunkciókat biztosítja, amelyeket kiegészítésekkel (extensions) lehet bővíteni. A kiterjesztéseket betűkkel jelölik, amelyek a funkciójukat fejezik ki: az F (Floating Point) a lebegő tizedesvesszős számításokhoz, a D (Double-precision Floating Point) a dupla pontosságú műveletekhez, a Q pedig a négyszeres pontosságú (Quad-precision Floating Point) műveletekhez tartozik. Egyes kiterjesztések már le vannak zárva (frozen), másokon még dolgoznak, és vannak jövőbeli kiterjesztések is, például a J, amely a dinamikusan fordított nyelvek támogatását célozza. A nyíltan specifikált kiterjesztéseken (standard extensions) túl a konkrét processzormodell saját, nem standard kiterjesztéseket (non-standard extensions) is tartalmazhat, amelyek nagyon specializáltak lehetnek, és akár ütközhetnek más kiterjesztésekkel is. Ezeket a gyártók teljesen a saját igényeik szerint alakíthatják, így a processzor rugalmasan testreszabható a konkrét felhasználásra.
Minden RISC-V processzor képes jelezni a program számára, hogy mely kiterjesztéseket támogatja. A már lezárt (frozen) kiterjesztések esetén a támogatás azt jelenti, hogy a processzornak minden utasítást ismernie kell az adott osztályból. Ha a program a processzornak olyan utasítást küld, amelyet az nem tud feldolgozni (illegal instruction, unsupported instruction), akkor kivétel (trap) keletkezik, amelyet az operációs rendszer kezelhet úgy, hogy a nem kompatibilis programot leállítja, vagy a hiányzó utasítást szoftveresen emulálja. Az utasítások szoftveres emulációja lassabb ugyan, de sok alkalmazásban ennek ellenére hasznos lehet.
A specifikáció „alulról felfelé” építkezik, és „felfújható”, ami teljesen ellentétes más architektúrák filozófiájával, ahol általában csak újabb és újabb utasításokat adnak hozzá, és nagyon ritkán távolítanak el bármit. További különbség, hogy a hagyományos rendszereknél a fejlesztő határozza meg az utasításokat, és a gyártó az architektúrát jellemzően úgy módosítja, hogy saját kiegészítéseket ad hozzá. A RISC-V esetében a gyártó teljesen maga is megtervezheti az architektúrát, akár úgy, hogy teljesen az alapoktól indul, és nem kell senkitől engedélyt kérnie.
A teljes utasításkészlet-specifikáció (User Level ISA) ingyenesen letölthető a risc.org weboldalról.