{"id":214,"date":"2026-10-22T17:28:54","date_gmt":"2026-10-22T21:28:54","guid":{"rendered":"https:\/\/www.terryellsworth.com\/?p=214"},"modified":"2026-10-22T17:28:54","modified_gmt":"2026-10-22T21:28:54","slug":"a-new-cpu-architecture-aurora","status":"publish","type":"post","link":"https:\/\/www.terryellsworth.com\/?p=214","title":{"rendered":"A new CPU Architecture- AURORA"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Of my four big software\/hardware projects, I have decided to build a new processor architecture.  This is not a RISC architecture, but a hybrid architecture- a hybrid CISC-VLIW- full 64-bit data and address lines, and a 512-bit VLIW for packetization.  It&#8217;s a two-ring (user\/supervisor) processor, where the instruction set will be open-source, without a single piece of legacy instructions or seeking backward compatibility at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The 512-but packetization allows compiling several operations into one instruction for parallel processing, if the developer sees it as needed. This allows compilers written on AURORA the ability to make operations more efficient.<br><br>Here is the guide to the instruction set so far:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>AURORA v0.13 defines 32 scalar instructions, plus the optional 512-bit packet format that bundles those same instructions.<\/strong> I checked the source archive\u2019s ISA specification, assembler, decoder, and emulator. The reference below distinguishes the architectural rules from limitations in the current implementation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Machine model and instruction encoding<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AURORA is a little-endian, byte-addressed architecture with 64-bit integer registers, addresses, and program counter.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Component<\/th><th>Definition<\/th><\/tr><\/thead><tbody><tr><td>General-purpose registers<\/td><td>32 registers, <code>R0<\/code>\u2013<code>R31<\/code>, each 64 bits<\/td><\/tr><tr><td>Zero register<\/td><td>None; <code>R0<\/code> is writable<\/td><\/tr><tr><td>Stack pointer<\/td><td>Conventionally <code>R30<\/code>; remains an ordinary register<\/td><\/tr><tr><td>Link register<\/td><td>Conventionally <code>R31<\/code>; <code>CALL<\/code> and <code>RET<\/code> explicitly use it<\/td><\/tr><tr><td>Program counter<\/td><td>64-bit <code>PC<\/code><\/td><\/tr><tr><td>Arithmetic condition flags<\/td><td>No carry, zero, sign, or overflow flags defined<\/td><\/tr><tr><td>Scalar alignment<\/td><td>Instructions may start at any byte address<\/td><\/tr><tr><td>Scalar lengths<\/td><td>Currently 1, 3, 4, 5, or 10 bytes; packet slot lengths can represent 1\u201315<\/td><\/tr><tr><td>Packet alignment<\/td><td>Mandatory 64-byte alignment<\/td><\/tr><tr><td>Integer byte order<\/td><td>Little-endian, including instruction immediates<\/td><\/tr><tr><td>Privilege modes<\/td><td>User and Supervisor<\/td><\/tr><tr><td>Floating-point\/vector registers<\/td><td>Not defined in the current instruction set<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Each scalar instruction begins with a one-byte opcode. Each register operand occupies one byte: bits 4\u20130 select the register, and bits 7\u20135 must be zero.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the tables below, <code>Rd<\/code> is a destination register, <code>Rs<\/code> a source, and <code>Ra<\/code>\/<code>Rb<\/code> additional sources. Instruction lengths include the opcode byte. All opcode values are hexadecimal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Data movement \u2014 2 instructions<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Opcode<\/th><th>Instruction<\/th><th>Bytes<\/th><th>Operation<\/th><\/tr><\/thead><tbody><tr><td><code>10<\/code><\/td><td><code>MOV Rd, Rs<\/code><\/td><td>3<\/td><td>Copy all 64 bits of <code>Rs<\/code> into <code>Rd<\/code>.<\/td><\/tr><tr><td><code>11<\/code><\/td><td><code>MOVI Rd, imm64<\/code><\/td><td>10<\/td><td>Load a full 64-bit immediate into <code>Rd<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Encodings:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MOV:  opcode, destination, source\nMOVI: opcode, destination, immediate64<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>MOVI<\/code> can load an entire 64-bit constant or address in one instruction:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MOVI R1, 0x123456789ABCDEF0\nMOV  R2, R1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There are no separate high-half\/low-half immediate instructions. The assembler supports symbol relocations for scalar <code>MOVI<\/code>, allowing the linker to fill in a 64-bit address.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Integer arithmetic and logic \u2014 8 instructions<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Opcode<\/th><th>Instruction<\/th><th>Bytes<\/th><th>Operation<\/th><\/tr><\/thead><tbody><tr><td><code>20<\/code><\/td><td><code>ADD Rd, Ra, Rb<\/code><\/td><td>4<\/td><td><code>Rd = Ra + Rb<\/code>, modulo \\(2^{64}\\).<\/td><\/tr><tr><td><code>21<\/code><\/td><td><code>SUB Rd, Ra, Rb<\/code><\/td><td>4<\/td><td><code>Rd = Ra \u2212 Rb<\/code>, modulo \\(2^{64}\\).<\/td><\/tr><tr><td><code>22<\/code><\/td><td><code>AND Rd, Ra, Rb<\/code><\/td><td>4<\/td><td>Bitwise AND.<\/td><\/tr><tr><td><code>23<\/code><\/td><td><code>OR Rd, Ra, Rb<\/code><\/td><td>4<\/td><td>Bitwise OR.<\/td><\/tr><tr><td><code>24<\/code><\/td><td><code>XOR Rd, Ra, Rb<\/code><\/td><td>4<\/td><td>Bitwise exclusive OR.<\/td><\/tr><tr><td><code>25<\/code><\/td><td><code>MUL Rd, Ra, Rb<\/code><\/td><td>4<\/td><td>Low 64 bits of the product.<\/td><\/tr><tr><td><code>26<\/code><\/td><td><code>SHL Rd, Rs, imm8<\/code><\/td><td>4<\/td><td>Logical left shift by <code>imm8 &amp; 63<\/code>.<\/td><\/tr><tr><td><code>27<\/code><\/td><td><code>SHR Rd, Rs, imm8<\/code><\/td><td>4<\/td><td>Logical right shift by <code>imm8 &amp; 63<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The first six use this encoding:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>opcode, destination, source_a, source_b<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The shifts use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>opcode, destination, source, shift_immediate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Arithmetic wraps without setting flags or raising an integer-overflow exception. <code>MUL<\/code> is specified as the low half of an unsigned product; the low 64-bit result also matches two\u2019s-complement signed multiplication.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both shifts introduce zero bits. <code>SHR<\/code> is <strong>not<\/strong> an arithmetic, sign-preserving right shift. Shift counts are masked to six bits, so a count of 64 becomes zero.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are no immediate forms of <code>ADD<\/code>, <code>SUB<\/code>, or the bitwise operations. A constant must first be placed in a register:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MOVI R2, 1\nADD  R1, R1, R2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Memory access \u2014 8 instructions<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All memory instructions are five bytes long and use a base register plus a signed 16-bit byte displacement:\\[ \\text{address} = R_\\text{base} + \\operatorname{signExtend}(\\text{disp16}) \\]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The displacement range is <strong>\u221232,768 through +32,767 bytes<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Opcode<\/th><th>Instruction<\/th><th>Access width<\/th><th>Operation<\/th><\/tr><\/thead><tbody><tr><td><code>30<\/code><\/td><td><code>LD64 Rd, [Rb+disp16]<\/code><\/td><td>64 bits<\/td><td>Load a complete 64-bit value.<\/td><\/tr><tr><td><code>31<\/code><\/td><td><code>ST64 Rs, [Rb+disp16]<\/code><\/td><td>64 bits<\/td><td>Store a complete 64-bit value.<\/td><\/tr><tr><td><code>32<\/code><\/td><td><code>LD8U Rd, [Rb+disp16]<\/code><\/td><td>8 bits<\/td><td>Load a byte and zero-extend to 64 bits.<\/td><\/tr><tr><td><code>33<\/code><\/td><td><code>ST8 Rs, [Rb+disp16]<\/code><\/td><td>8 bits<\/td><td>Store the low 8 bits of <code>Rs<\/code>.<\/td><\/tr><tr><td><code>34<\/code><\/td><td><code>LD16U Rd, [Rb+disp16]<\/code><\/td><td>16 bits<\/td><td>Load and zero-extend to 64 bits.<\/td><\/tr><tr><td><code>35<\/code><\/td><td><code>ST16 Rs, [Rb+disp16]<\/code><\/td><td>16 bits<\/td><td>Store the low 16 bits of <code>Rs<\/code>.<\/td><\/tr><tr><td><code>36<\/code><\/td><td><code>LD32U Rd, [Rb+disp16]<\/code><\/td><td>32 bits<\/td><td>Load and zero-extend to 64 bits.<\/td><\/tr><tr><td><code>37<\/code><\/td><td><code>ST32 Rs, [Rb+disp16]<\/code><\/td><td>32 bits<\/td><td>Store the low 32 bits of <code>Rs<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Their binary layout is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>opcode, data_register, base_register, displacement16<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Natural alignment is required:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Width<\/th><th>Required address alignment<\/th><\/tr><\/thead><tbody><tr><td>8 bits<\/td><td>1 byte<\/td><\/tr><tr><td>16 bits<\/td><td>2 bytes<\/td><\/tr><tr><td>32 bits<\/td><td>4 bytes<\/td><\/tr><tr><td>64 bits<\/td><td>8 bytes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>LD64  R3, &#91;R10+16]\nLD8U  R4, &#91;R10+1]\nST32  R5, &#91;R10+8]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The assembler also accepts memory-first store syntax, such as <code>ST32 [R10+8], R5<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are no signed narrow-load instructions, indexed\/scaled addressing modes, auto-increment addressing, or direct memory-to-memory moves. More elaborate address calculations use ordinary register arithmetic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Control flow \u2014 5 instructions<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Opcode<\/th><th>Instruction<\/th><th>Bytes<\/th><th>Operation<\/th><\/tr><\/thead><tbody><tr><td><code>40<\/code><\/td><td><code>JMP rel32<\/code><\/td><td>5<\/td><td>Unconditional PC-relative jump.<\/td><\/tr><tr><td><code>41<\/code><\/td><td><code>BRZ Rs, rel16<\/code><\/td><td>4<\/td><td>Branch if the full 64-bit source register equals zero.<\/td><\/tr><tr><td><code>42<\/code><\/td><td><code>BRNZ Rs, rel16<\/code><\/td><td>4<\/td><td>Branch if the source register is nonzero.<\/td><\/tr><tr><td><code>43<\/code><\/td><td><code>CALL rel32<\/code><\/td><td>5<\/td><td>Save the following instruction\u2019s address in <code>R31<\/code>, then branch.<\/td><\/tr><tr><td><code>44<\/code><\/td><td><code>RET<\/code><\/td><td>1<\/td><td>Set <code>PC<\/code> to <code>R31<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">All relative offsets are measured from the <strong>first byte after the instruction<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>target = instruction_address + instruction_length + signed_offset<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>JMP<\/code> and <code>CALL<\/code> have signed 32-bit byte displacements; <code>BRZ<\/code> and <code>BRNZ<\/code> have signed 16-bit byte displacements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is no <code>CMP<\/code> instruction or condition-code register. Equality can be tested by subtracting or XORing two values and branching on the result:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>XOR R3, R1, R2\nBRZ R3, equal<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CALL<\/code> does not push a return address onto the stack. Nested functions must preserve <code>R31<\/code> explicitly; the initial C compiler does this for functions containing calls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The current ISA has no dedicated general-register indirect jump or indirect call. <code>RET<\/code> provides register-directed control transfer specifically through <code>R31<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An assembler detail matters here: a symbolic operand such as <code>CALL function<\/code> resolves to a target address, but a numeric operand such as <code>JMP 16<\/code> is interpreted as a <strong>relative displacement<\/strong>, not an absolute address.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>System and privilege instructions \u2014 6 instructions<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Opcode<\/th><th>Instruction<\/th><th>Bytes<\/th><th>Operation<\/th><\/tr><\/thead><tbody><tr><td><code>50<\/code><\/td><td><code>SVC<\/code><\/td><td>1<\/td><td>Enter the Supervisor exception handler.<\/td><\/tr><tr><td><code>51<\/code><\/td><td><code>ERET<\/code><\/td><td>1<\/td><td>Return from an exception using saved status and PC.<\/td><\/tr><tr><td><code>52<\/code><\/td><td><code>WFI<\/code><\/td><td>1<\/td><td>Advance PC and wait for an interrupt.<\/td><\/tr><tr><td><code>53<\/code><\/td><td><code>MFSR Rd, csr8<\/code><\/td><td>3<\/td><td>Read a system register into a GPR.<\/td><\/tr><tr><td><code>54<\/code><\/td><td><code>MTSR csr8, Rs<\/code><\/td><td>3<\/td><td>Write a GPR value to a system register.<\/td><\/tr><tr><td><code>55<\/code><\/td><td><code>TLBINV<\/code><\/td><td>1<\/td><td>Invalidate all cached address translations.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ERET<\/code>, <code>MFSR<\/code>, <code>MTSR<\/code>, and <code>TLBINV<\/code> are Supervisor-only. The current emulator does not impose a Supervisor-only check on <code>WFI<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>SVC<\/code> has no immediate syscall-number operand. Selecting a service and passing arguments are responsibilities of the operating-system ABI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On exception entry, the processor:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Saves <code>STATUS<\/code> in <code>ESTATUS<\/code>.<\/li>\n\n\n\n<li>Exchanges <code>R30<\/code> and <code>KSP<\/code> if entering from User mode.<\/li>\n\n\n\n<li>Records the return\/restart address in <code>EPC<\/code> and exception information in <code>CAUSE<\/code> and <code>BADADDR<\/code>.<\/li>\n\n\n\n<li>Clears the User and interrupt-enable bits.<\/li>\n\n\n\n<li>Transfers execution to <code>EVEC<\/code>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">For <code>SVC<\/code>, <code>EPC<\/code> points to the next instruction. <code>ERET<\/code> restores <code>STATUS<\/code> from <code>ESTATUS<\/code>, returns to <code>EPC<\/code>, and reverses the stack exchange when returning to User mode.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>WFI<\/code> allows device and timer activity to continue while the core is idle. An enabled pending interrupt wakes it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>TLBINV<\/code> currently flushes the entire TLB. Writing <code>PTBR<\/code> or <code>ASID<\/code> does <strong>not<\/strong> implicitly flush it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>System-register map<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The CSR selector is one byte, with these ten selectors implemented:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>ID<\/th><th>Name<\/th><th>Meaning and behavior<\/th><\/tr><\/thead><tbody><tr><td><code>0<\/code><\/td><td><code>STATUS<\/code><\/td><td>Current interrupt-enable, MMU-enable, and privilege bits.<\/td><\/tr><tr><td><code>1<\/code><\/td><td><code>EVEC<\/code><\/td><td>Exception-handler entry address.<\/td><\/tr><tr><td><code>2<\/code><\/td><td><code>EPC<\/code><\/td><td>Exception return\/restart address.<\/td><\/tr><tr><td><code>3<\/code><\/td><td><code>CAUSE<\/code><\/td><td>Exception or interrupt cause.<\/td><\/tr><tr><td><code>4<\/code><\/td><td><code>BADADDR<\/code><\/td><td>Address associated with a fault.<\/td><\/tr><tr><td><code>5<\/code><\/td><td><code>PTBR<\/code><\/td><td>Physical page-table root address; low 12 bits are cleared on write.<\/td><\/tr><tr><td><code>6<\/code><\/td><td><code>ASID<\/code><\/td><td>Address-space identifier used to tag translations.<\/td><\/tr><tr><td><code>7<\/code><\/td><td><code>KSP<\/code><\/td><td>Stack-exchange register for User\/Supervisor transitions.<\/td><\/tr><tr><td><code>8<\/code><\/td><td><code>ESTATUS<\/code><\/td><td>Saved status restored by <code>ERET<\/code>.<\/td><\/tr><tr><td><code>9<\/code><\/td><td><code>TICKS<\/code><\/td><td>Reference emulator cycle counter; writes are ignored.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>STATUS<\/code> and <code>ESTATUS<\/code> use:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Bit<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>0<\/code><\/td><td>Interrupt enable<\/td><\/tr><tr><td><code>1<\/code><\/td><td>MMU enable<\/td><\/tr><tr><td><code>2<\/code><\/td><td>User mode<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Other bits are discarded on writes in the current implementation. Unsupported CSR selectors raise an illegal-instruction exception.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The assembler currently expects numeric CSR selectors:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MFSR R1, 0\nMTSR 5, R2\nTLBINV<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Execution and debugging \u2014 3 instructions<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Opcode<\/th><th>Instruction<\/th><th>Bytes<\/th><th>Operation<\/th><\/tr><\/thead><tbody><tr><td><code>00<\/code><\/td><td><code>NOP<\/code><\/td><td>1<\/td><td>No operation.<\/td><\/tr><tr><td><code>01<\/code><\/td><td><code>HALT<\/code><\/td><td>1<\/td><td>Stop the core; Supervisor-only.<\/td><\/tr><tr><td><code>FF<\/code><\/td><td><code>BREAK<\/code><\/td><td>1<\/td><td>Debugger breakpoint operation.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In the reference emulator, <code>BREAK<\/code> sets the breakpoint indicator and halts execution. Although the ISA document describes it as a breakpoint trap, it does <strong>not currently enter the guest exception handler<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>512-bit VLIW packet format<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Packetization adds a container and scheduling metadata, not another set of arithmetic instructions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every packet is exactly <strong>64 bytes<\/strong>, starts at a 64-byte-aligned address, and contains an eight-byte header followed by up to 56 bytes of instruction payload.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Byte offset<\/th><th>Contents<\/th><\/tr><\/thead><tbody><tr><td><code>0<\/code><\/td><td>Packet marker <code>F0<\/code><\/td><\/tr><tr><td><code>1<\/code>, bits 3\u20130<\/td><td>Format number; currently <code>0<\/code><\/td><\/tr><tr><td><code>1<\/code>, bits 7\u20134<\/td><td>Number of active slots minus one<\/td><\/tr><tr><td><code>2<\/code><\/td><td>Stop mask: bit <em>n<\/em> places a stop after slot <em>n<\/em><\/td><\/tr><tr><td><code>3<\/code><\/td><td>Flags; must currently be zero<\/td><\/tr><tr><td><code>4<\/code><\/td><td>Slot 0 length in low nibble; slot 1 length in high nibble<\/td><\/tr><tr><td><code>5<\/code><\/td><td>Slot 2 and slot 3 lengths<\/td><\/tr><tr><td><code>6<\/code><\/td><td>Slot 4 and slot 5 lengths<\/td><\/tr><tr><td><code>7<\/code><\/td><td>Slot 6 and slot 7 lengths<\/td><\/tr><tr><td><code>8\u201363<\/code><\/td><td>Scalar instructions followed by zero padding<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A packet contains <strong>one through eight instructions<\/strong>. The sum of their lengths must not exceed 56 bytes. Nested packets are illegal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stop bits divide the packet into <strong>issue groups<\/strong>. Every instruction within a group reads the register values present at the beginning of that group. Register results become visible at the group boundary. The last active slot always ends a group.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.packet\n    ADD R5, R1, R2\n    XOR R6, R3, R4\n.stop\n    MUL R7, R5, R6\n.endpacket<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>ADD<\/code> and <code>XOR<\/code> can execute independently. The stop makes their results available to <code>MUL<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without that stop, <code>MUL<\/code> would read the <strong>old<\/strong> values of <code>R5<\/code> and <code>R6<\/code>. Two instructions in the same group may not write the same GPR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Packetization does not guarantee eight operations per cycle. An implementation may execute a group serially or in parallel, provided it preserves the group\u2019s architectural semantics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Current packet eligibility<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Instruction family<\/th><th>v0.13 reference emulator<\/th><\/tr><\/thead><tbody><tr><td><code>NOP<\/code>, <code>MOV<\/code>, <code>MOVI<\/code><\/td><td>Supported<\/td><\/tr><tr><td>All eight arithmetic\/logic instructions<\/td><td>Supported<\/td><\/tr><tr><td><code>LD64<\/code>, <code>LD8U<\/code>, <code>LD16U<\/code>, <code>LD32U<\/code><\/td><td>Supported<\/td><\/tr><tr><td><code>ST64<\/code><\/td><td>Supported<\/td><\/tr><tr><td><code>ST8<\/code>, <code>ST16<\/code>, <code>ST32<\/code><\/td><td>Rejected during packet execution<\/td><\/tr><tr><td>Jumps, conditional branches, calls, returns<\/td><td>Prohibited<\/td><\/tr><tr><td>All six system instructions<\/td><td>Prohibited<\/td><\/tr><tr><td><code>HALT<\/code>, <code>BREAK<\/code><\/td><td>Prohibited<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">There are two material implementation gaps:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Narrow stores:<\/strong> the assembler can encode them inside packets, but the emulator rejects them.<\/li>\n\n\n\n<li><strong>Memory ordering and exceptions:<\/strong> the specification calls for slot-ordered memory behavior and precise slot-order retirement. The emulator instead evaluates a group and defers its stores until the group ends. It therefore does not fully implement same-group store-to-load forwarding or the specified precise restart behavior.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For current programs, potentially aliasing memory operations should be placed in separate groups. Packet exception handling still needs development before treating it as a complete production implementation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Address translation and exceptions<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Version 0.13 retains the same instruction opcodes while expanding the MMU to cover the full 64-bit virtual address space.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Property<\/th><th>v0.13 definition<\/th><\/tr><\/thead><tbody><tr><td>Virtual address width<\/td><td>64 bits<\/td><\/tr><tr><td>Architectural physical address width<\/td><td>64 bits<\/td><\/tr><tr><td>Page size<\/td><td>4 KiB<\/td><\/tr><tr><td>Page-table levels<\/td><td>Six<\/td><\/tr><tr><td>Address decomposition<\/td><td>7\/9\/9\/9\/9\/9 index bits, then 12 offset bits<\/td><\/tr><tr><td>Canonical-address restriction<\/td><td>None<\/td><\/tr><tr><td>Reference TLB<\/td><td>64 entries, ASID-tagged<\/td><\/tr><tr><td>Unimplemented physical destinations<\/td><td>Fault rather than truncate the address<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The defined exception causes are:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Cause<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>1<\/code><\/td><td>Supervisor call<\/td><\/tr><tr><td><code>2<\/code><\/td><td>Illegal instruction<\/td><\/tr><tr><td><code>3<\/code><\/td><td>Alignment fault<\/td><\/tr><tr><td><code>4<\/code><\/td><td>Instruction-fetch page fault<\/td><\/tr><tr><td><code>5<\/code><\/td><td>Load page fault<\/td><\/tr><tr><td><code>6<\/code><\/td><td>Store page fault<\/td><\/tr><tr><td><code>7<\/code><\/td><td>Privilege fault<\/td><\/tr><tr><td><code>8<\/code><\/td><td>Bus fault<\/td><\/tr><tr><td><code>0x100 + irq_line<\/code><\/td><td>Hardware interrupt<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Device access uses memory-mapped I\/O; there are no separate <code>IN<\/code> or <code>OUT<\/code> instructions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Instructions not yet defined<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The current instruction set does not include division\/remainder, high-half multiplication, carry\/borrow arithmetic, arithmetic right shift, register-count shifts, rotates, signed narrow loads, ordered comparisons, conditional moves, dedicated stack operations, atomic read-modify-write operations, memory fences, floating point, SIMD, cryptographic instructions, or matrix operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The ISA reserves opcode range <code>80\u2013EF<\/code> and packet formats <code>1\u201315<\/code> for future expansion, but those reservations are not implemented extensions. Likewise, AURORA\u2019s hardware-integrity goals do not yet introduce any additional instructions into this 32-opcode ISA.<\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - http:\/\/www.hupso.com\/share\/ --><a class=\"hupso_toolbar\" href=\"http:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/share-medium.png\" style=\"border:0px; padding-top:5px; float:left;\" alt=\"Share\"\/><\/a><script type=\"text\/javascript\">var hupso_services_t=new Array(\"Twitter\",\"Facebook\",\"Google Plus\",\"Linkedin\",\"StumbleUpon\",\"Digg\",\"Reddit\",\"Bebo\",\"Delicious\"); var hupso_toolbar_size_t=\"medium\";var hupso_url_t=\"\";var hupso_title_t=\"A new CPU Architecture- AURORA\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/share_toolbar.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>Of my four big software\/hardware projects, I have decided to build a new processor architecture. This is not a RISC architecture, but a hybrid architecture- a hybrid CISC-VLIW- full 64-bit data and address lines, and a 512-bit VLIW for packetization. It&#8217;s a two-ring (user\/supervisor) processor, where the instruction set will be open-source, without a single [&hellip;]<\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - http:\/\/www.hupso.com\/share\/ --><a class=\"hupso_toolbar\" href=\"http:\/\/www.hupso.com\/share\/\"><img src=\"https:\/\/static.hupso.com\/share\/buttons\/share-medium.png\" style=\"border:0px; padding-top:5px; float:left;\" alt=\"Share\"\/><\/a><script type=\"text\/javascript\">var hupso_services_t=new Array(\"Twitter\",\"Facebook\",\"Google Plus\",\"Linkedin\",\"StumbleUpon\",\"Digg\",\"Reddit\",\"Bebo\",\"Delicious\"); var hupso_toolbar_size_t=\"medium\";var hupso_url_t=\"\";var hupso_title_t=\"A new CPU Architecture- AURORA\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/share_toolbar.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-214","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=\/wp\/v2\/posts\/214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=214"}],"version-history":[{"count":1,"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=\/wp\/v2\/posts\/214\/revisions"}],"predecessor-version":[{"id":215,"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=\/wp\/v2\/posts\/214\/revisions\/215"}],"wp:attachment":[{"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.terryellsworth.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}