The ISA You Can Actually Customize
RISC-V's most distinctive feature isn't that it's open-source — it's that it's designed to be extended. The base instruction set (RV32I or RV64I) is intentionally minimal: integer arithmetic, loads/stores, branches, and not much else. Everything else — multiplication, floating-point, atomic operations, vector processing — comes as standardized extensions that you can include or leave out. And beyond those standard extensions, RISC-V reserves a huge opcode space for custom instructions that you design yourself.
This isn't theoretical. Companies like SiFive, Andes Technology, Esperanto, Ventana Micro, and Tenstorrent are all shipping or developing RISC-V processors with custom extensions tailored to specific workloads. The ability to add instructions that accelerate your particular application — without paying ARM a licensing fee or waiting for Intel to add it to x86 — is what makes RISC-V genuinely different.
RISC-V Extension Naming
RISC-V uses a letter-based naming scheme for extensions:
- I — Base integer instructions (required)
- M — Integer multiplication and division
- A — Atomic instructions (load-reserved/store-conditional, AMOs)
- F — Single-precision floating-point
- D — Double-precision floating-point
- C — Compressed instructions (16-bit encodings for common instructions)
- V — Vector extension (scalable vector processing, ratified in 2021)
- B — Bit manipulation
- H — Hypervisor extension
- Zicsr, Zifencei — CSR access and instruction-fence (split from base I)
The shorthand "RV64GC" means a 64-bit core with G (= IMAFD, the "general-purpose" bundle) and C (compressed instructions). This is the typical profile for a Linux-capable application processor.
See also: Neuromorphic Chips Guide: Brain-Inspired Computing with Inte.
Custom Extension Design
The Opcode Space
RISC-V reserves four "custom" opcode ranges (custom-0 through custom-3) specifically for user-defined instructions. Each range provides room for hundreds of unique custom instructions. The encoding format follows RISC-V conventions — you pick from R-type, I-type, S-type, etc. instruction formats depending on how many register operands your instruction needs.
A Practical Example: Cryptographic Acceleration
Say you're building a RISC-V core for a network security appliance that needs fast AES encryption. You could use the standard Zkne/Zknd extensions for AES, which were ratified as part of the scalar crypto extensions. But if your workload also needs a custom hash function that doesn't map well to existing instructions, you can add a custom instruction that performs multiple rounds of your hash in a single cycle.
The implementation looks something like this in the RTL:
This connects to the ideas in Emerging Memory Technologies: MRAM, ReRAM, and Processing-in.
// Custom instruction decode in the execution pipeline
// Format: custom-0, funct7 = 0x01, funct3 = 0x0
// HASH_ROUND rd, rs1, rs2
// Performs one round of custom hash: rd = hash_round(rs1, rs2)
always @(*) begin
if (opcode == 7'b0001011 && funct7 == 7'h01 && funct3 == 3'h0) begin
custom_result = hash_round_logic(rs1_data, rs2_data);
custom_valid = 1'b1;
end
end
On the software side, you'd use inline assembly or compiler intrinsics to emit the custom instruction:
// GCC inline assembly for custom HASH_ROUND instruction
static inline uint64_t hash_round(uint64_t a, uint64_t b) {
uint64_t result;
asm volatile (".insn r 0x0b, 0, 1, %0, %1, %2"
: "=r"(result)
: "r"(a), "r"(b));
return result;
}
Domain-Specific Accelerators
The more interesting use case is building domain-specific processors. Tenstorrent's RISC-V AI chips add custom tensor operation instructions. Esperanto's ET-SoC-1 packs over 1,000 RISC-V cores with custom machine learning extensions. Andes Technology's V5 series adds custom DSP instructions for audio and signal processing.
The pattern is consistent: take the base RISC-V ISA for general-purpose control flow, then add custom instructions for the hot loop of your specific workload. You get a general-purpose processor that can run standard software (Linux, drivers, management code) combined with accelerator-level performance for your target application.
This connects to the ideas in Chip Design Flow: RTL to GDSII and the Electronic Design Aut.
Toolchain Support
Custom extensions need compiler support, and this is where things get practical. GCC and LLVM both support RISC-V custom instructions through inline assembly and, increasingly, through the -march flag for ratified extensions. For truly custom instructions, you'd typically write intrinsics or use the .insn assembler directive (as shown above) rather than modifying the compiler's code generation.
SiFive's custom extension framework provides a more structured approach — they have tools that let you describe your custom instructions in a specification format, which then auto-generates assembler support, simulator models, and verification testbenches. This significantly reduces the engineering effort of bringing up custom extensions.
Verification Challenges
Adding custom instructions means you need to verify that they work correctly and don't break anything in the base ISA. The RISC-V architecture tests (riscv-tests and riscv-arch-test) cover standard extensions, but custom instructions need their own test suites. Formal verification tools from companies like OneSpin (now Siemens) and Cadence Jasper can prove correctness properties of custom instruction implementations, which is increasingly expected for safety-critical applications.
The real power of RISC-V custom extensions isn't any single feature — it's that you can iterate on your instruction set the same way you iterate on software. Ship a first version, measure performance on real workloads, add or refine instructions in the next silicon revision. That feedback loop, which ARM and x86 licensees can't do, is what makes RISC-V genuinely disruptive for application-specific processors.