G.RV32IM Under the Prover

This one needs a wider screen.

The visualizer puts the program, the datapath, all 32 registers and memory side by side and steps them together, one data transfer at a time. Shrinking that into a phone would mean hiding most of it, which would defeat the point.

It needs at least 1024 × 560 logical pixels — a landscape tablet, a laptop, or a desktop.

this screen: —

On a tablet, turning it to landscape is usually enough. Otherwise open this page on a laptop or a desktop.

Read what it does instead →
G. RV32IM Under the Prover RISC-V instruction visualizer
Speed 0.9 s
ready
cycle 0

Program

ROM · 0x00000000 in address order

Datapath

idle each box shows what it is holding

Instruction

pc —

Operation detail

what the architecture says this instruction did

Execution trace

0 rows

Registers

x0 hardwired zero

Memory

byte-addressed, little-endian

RV32IM Under the Prover

An RV32IM machine you can step one data transfer at a time. Everything on screen is architectural: what the instruction is defined to do, which component holds which value, and how the bits change on the way through. Nothing here describes a particular implementation — no pipeline, no cache, no arithmetization.

The name marks the scope, not the content: RV32IM with a read-only program region and no system instructions is the machine a zero-knowledge VM actually implements, which is why the omissions below are what they are. What the tool says about each instruction is plain RISC-V.

The instruction set

The machine implements RV32I plus the M extension — the 32-bit base integer instructions and multiply/divide, 45 opcodes in all, every one of which the sample program executes at least once.

Not implementedWhy
RV64I widthsThis is a 32-bit machine; the *W family exists only to keep 32-bit arithmetic exact on a 64-bit one.
A — atomicsOne hart, no interrupts, no preemption: every atomicity and ordering guarantee is already satisfied by executing in order.
C — compressedEvery instruction here is four bytes wide, which keeps the address arithmetic and the ROM layout uniform.
ecall, ebreak, fence, CSRsThese are the boundary with an execution environment and privileged software, and there is neither here. There is no console: results are written into RAM, where you read them.

Memory

Byte-addressed and little-endian, split into three regions:

Alignment is enforced: a halfword access must be even and a word access a multiple of four. The base ISA leaves misaligned access to the execution environment, and this one declines it and reports load/store address misaligned — the same choice most real implementations make.

Stepping

One Step button, and a selector beside it that decides how far one step goes. One transfer is the fine grain: a single value moving between two components. The sender lights teal, the receiver amber, the wire animates, and the value rides across on it. A component computing on what it already holds lights steel. An instruction is eight to thirteen transfers. Whole instruction finishes whatever is in flight and lands on the last transfer. Run uses the same setting, at anything from ten steps a second down to one every four seconds.

An ALU is not one circuit but a bundle of them — an adder, a logic array, a shifter, a comparator — so the execute box stays labelled ALU and adds which part is engaged: ALU · ADDER, ALU · LOGIC, ALU · SHIFTER, ALU · COMPARE, ALU · BRANCH (the condition), ALU · TARGET (a jump destination), ALU · ADDRESS (an effective address), and ALU · PASS for LUI, which does no arithmetic at all. Multiply and divide are the M extension and get their own unit in essentially every implementation, so those two read MUL UNIT and DIV UNIT — no ALU involved.

The program listing is disassembly of what is actually in ROM — every row is a real RV32IM instruction, decoded from its own encoded word. Assembler shorthand never appears, because it is not part of the machine: li is not an opcode (a 32-bit constant is lui then addi), mv is addi rd, rs, 0, ret is jalr x0, 0(ra), and j is jal x0, offset. Branch and jump targets are shown as labels only because an address is easier to follow with a name on it; the encoded immediate is the offset.

Every box keeps what it was given until the next instruction overwrites it, so the diagram accumulates the state of the instruction as you walk it. The side panels stay honest about time: the highlighted line in the program does not advance, a register write shows dashed and still holding its old value, and a stored word stays unchanged, until the transfer that actually does it goes through.

Things worth stepping through

Keys

Space step   ⇧→I finish the instruction   step back   Enter run / pause   R reset   P next phase   ? this guide   Esc close

Companion reading

RISC-V Opcodes Under the Prover — an opcode-by-opcode treatment of this same instruction set, and of what it costs to prove each family inside a zkVM. The subset implemented here is the subset that piece is about.