16-bit hardwired CPU implemented in Verilog with Yosys-compatible SystemVerilog
- Hardware user stack/call stack
- 8x registers (with zero registers)
- Up to 32 instructions (5-bit opcode)
- PC is not directly program-accessible
- 16-bit address space (Theoretically 24-bit with memory banking)
- Strictly unsigned operations
Extensions like signed operations are planned to come in Argon v2.
Hardwired zero register
General-purpose register
General-purpose register
General-purpose register
General-purpose register
Upper 8 bits serve as the memory bank Lower 8 bits serve as read-only stack pointer
Config/control register
Interrupt control PLL control, like a divider?
ALU flags register
7 -> Error 5 -> Borrow 4 -> Less 3 -> Greater 2 -> Equal 1 -> Zero 0 -> Carry
RS1 -> register source 1 RS1 -> register source 2 RD -> register destination F -> flags register MP -> memory pointer SP -> stack pointer CSP -> call stack pointer
Instructions are 32-bit words, containing a 6-bit opcode, 3x 3-bit register indices (source 1, source 2, destination), a RFU bit, and a 16-bit immediate value OOOOOORR-RSSSDDDF-IIIIIIII-IIIIIIII
O -> opcode bit R -> RS1 bit S -> RS2 bit F -> RFU (reserved for future use) bit I -> immediate bit
*instruction updates flags register
RD = RS1 + RS2
RD = RS1 + RS2 + CF
RD = RS1 - RS2 - BF
RD = 0 F = RS1 CMP RS2
RD = RS1 + 1
RD = RS1 - 1
RD = ~(RS1 & RS2)
RD = RS1 & RS2
RD = RS1 | RS2
RD = ~(RS1 | RS2)
RD = RS1 ^ RS2
RD = RS1 << RS2
RD = RS1 >> RS2
MP = RS1 RD = memory[address]
MP = RS1 memory[address] = RS2
stack[SP] = RS1 SP -= 1
RD = stack[SP+1] SP += 1
callstack[CSP] = PC PC = RS1 CSP -= 1
PC = callstack[CSP+1] CSP += 1
if EF: PC = RS1
if ~EF: PC = RS1
if CF: PC = RS1
if ~EF: PC = RS1
if ZF: PC = RS1
if ~ZF: PC = RS1
if GF: PC = RS1
if ~LF: PC = RS1