SNAPKITTYWEST's picture
October 2026 main drop: mirror from GitHub
a8baeed verified
|
Raw History Blame Contribute Delete
10.1 kB

Bit-String Hardware Accelerator ISA Specification

1. ISA Overview

Architecture: RISC-style bit-manipulation ISA
Operand Width: 64-bit integer registers
Word Size: 64 bits
Addressing: Bit-addressed linear address space


2. Register File

Registers: R0-R31 (32 Γ— 64-bit GPRs)
Special Registers:
  - R0: Hard-wired zero
  - R31: Return value / implicit accumulator

3. Instruction Format

3.1 R-Type (Register-Register)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Opcode  β”‚ Rd  β”‚ Rs1 β”‚ Rs2 β”‚ Reserved   β”‚
β”‚ 6 bits  β”‚ 5   β”‚ 5   β”‚ 5   β”‚ 13 bits    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3.2 I-Type (Register-Immediate)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Opcode  β”‚ Rd  β”‚ Rs1 β”‚  Immediate   β”‚
β”‚ 6 bits  β”‚ 5   β”‚ 5   β”‚  18 bits     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3.3 L-Type (Load Immediate)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Opcode  β”‚ Rd  β”‚      Immediate       β”‚
β”‚ 6 bits  β”‚ 5   β”‚     53 bits (sign-ext) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4. Opcode Assignments

Mnemonic Opcode Type Semantics
BITLOAD 0x01 R rd ← mem[rs1 + rs2 bit offset] & 1
BITSTORE 0x02 R mem[rs1 + rs2 bit offset] ← rs3 & 1
BITFIELD 0x03 R rd ← (mem[rs1 + rs2] >> rs3) & ((1 << rs4) - 1)
BITTEST 0x04 R flag ← (mem[rs1 + rs2] >> bit_offset) & 1
BITCOUNT 0x05 R rd ← popcount(mem[rs1])
BITSCANFWD 0x06 R rd ← first_set_bit(rs1)
BITSCANREV 0x07 R rd ← last_set_bit(rs1)
LOADIMM64 0x08 L rd ← immediate (53-bit sign-extended)
BITEXTRACT 0x09 R rd ← extract_field(rs1, rs2, rs3)
BITINSERT 0x0A R rd ← insert_field(rs1, rs2, rs3, rs4)
BITROTL 0x0B R rd ← rotate_left(rs1, rs2)
BITROTR 0x0C R rd ← rotate_right(rs1, rs2)

5. Instruction Semantics

5.1 BITLOAD (Single-Bit Load)

Encoding: BITLOAD Rd, Rs1, Rs2

Operation:

effective_bit_address = Rs1 + Rs2
word_index = effective_bit_address / 64
bit_index = effective_bit_address mod 64
Rd ← (memory[word_index] >> bit_index) & 1

Constraints:

  • Rs1: Bit base address (64-bit)
  • Rs2: Bit offset (64-bit)
  • Rd: Destination register (bit 0 set, bits [63:1] = 0)
  • No privilege required
  • May fault: page fault if effective address invalid

Latency: 3 cycles (address generation + memory access + extract)


5.2 BITSTORE (Single-Bit Write)

Encoding: BITSTORE Rs1, Rs2, Rs3

Operation:

effective_bit_address = Rs1 + Rs2
word_index = effective_bit_address / 64
bit_index = effective_bit_address mod 64
bit_value = Rs3 & 1
old_word = memory[word_index]
mask = 1 << bit_index
new_word = (old_word & ~mask) | (bit_value << bit_index)
memory[word_index] ← new_word

Constraints:

  • Rs1: Bit base address
  • Rs2: Bit offset
  • Rs3: Bit value (only bit 0 is meaningful)
  • No destination register
  • Requires write permission on target memory
  • May fault: segmentation fault, write-protect fault

Latency: 3 cycles (address generation + RMW cycle)


5.3 BITFIELD (Multi-Bit Extract)

Encoding: BITFIELD Rd, Rs1, Rs2, Rs3, Rs4

Operation:

effective_bit_address = Rs1 + Rs2
word_index = effective_bit_address / 64
bit_index = effective_bit_address mod 64
field_width = Rs3
bit_offset_in_word = Rs4

word = memory[word_index]
extracted = (word >> bit_offset_in_word) & ((1 << field_width) - 1)
Rd ← extracted

Constraints:

  • field_width must be in range [1, 64]
  • If bit_offset + field_width > 64, behavior is undefined (may trap)
  • No cross-boundary extraction in this instruction (use software loop)

Latency: 3 cycles


5.4 BITTEST (Test and Branch)

Encoding: BITTEST Rs1, Rs2

Operation:

effective_bit_address = Rs1 + Rs2
word_index = effective_bit_address / 64
bit_index = effective_bit_address mod 64
condition_flag ← (memory[word_index] >> bit_index) & 1

Latency: 3 cycles

Conditional Execution: Sets zero flag (ZF) in status register:

  • ZF = 0 if bit is set
  • ZF = 1 if bit is clear

5.5 BITCOUNT (Population Count)

Encoding: BITCOUNT Rd, Rs1

Operation:

Rd ← popcount(Rs1)

Latency: 2 cycles (specialized hardware)


5.6 BITSCANFWD (Find First Set Bit)

Encoding: BITSCANFWD Rd, Rs1

Operation:

If Rs1 = 0:
  Rd ← 64 (or undefined, behavior determined by hardware)
Else:
  Rd ← position of rightmost set bit (0-indexed)
  Range: Rd ∈ [0, 63]

Latency: 2-3 cycles


5.7 BITSCANREV (Find Last Set Bit)

Encoding: BITSCANREV Rd, Rs1

Operation:

If Rs1 = 0:
  Rd ← 64 (or undefined)
Else:
  Rd ← position of leftmost set bit (0-indexed)
  Range: Rd ∈ [0, 63]

Latency: 2-3 cycles


5.8 LOADIMM64 (Load 53-Bit Immediate)

Encoding: LOADIMM64 Rd, immediate

Operation:

Rd ← sign_extend(immediate[52:0], 64)

Latency: 1 cycle


5.9 BITEXTRACT (Field Extraction with Width)

Encoding: BITEXTRACT Rd, Rs1, Rs2, Rs3

Operation:

value = Rs1
start_bit = Rs2
field_width = Rs3

extracted = (value >> start_bit) & ((1 << field_width) - 1)
Rd ← extracted

Latency: 1 cycle (register-only, no memory)


5.10 BITINSERT (Field Insertion)

Encoding: BITINSERT Rd, Rs1, Rs2, Rs3, Rs4

Operation:

dest_value = Rs1
source_value = Rs2
start_bit = Rs3
field_width = Rs4

mask = ((1 << field_width) - 1) << start_bit
shifted_source = (source_value & ((1 << field_width) - 1)) << start_bit
Rd ← (dest_value & ~mask) | shifted_source

Latency: 2 cycles


5.11 BITROTL (Rotate Left)

Encoding: BITROTL Rd, Rs1, Rs2

Operation:

value = Rs1
rotate_amount = Rs2 mod 64
Rd ← (value << rotate_amount) | (value >> (64 - rotate_amount))

Latency: 2 cycles


5.12 BITROTR (Rotate Right)

Encoding: BITROTR Rd, Rs1, Rs2

Operation:

value = Rs1
rotate_amount = Rs2 mod 64
Rd ← (value >> rotate_amount) | (value << (64 - rotate_amount))

Latency: 2 cycles


6. Memory Semantics

6.1 Byte Ordering (Little-Endian)

All operations assume little-endian byte ordering:

Memory layout (64-bit word at address 0x00):
Bit 0    at byte 0, bit 0
Bit 7    at byte 0, bit 7
Bit 8    at byte 1, bit 0
Bit 63   at byte 7, bit 7

6.2 Alignment Requirements

  • No alignment requirement for bit addresses
  • Memory accesses are naturally granular to 64-bit words
  • Unaligned word access: hardware loads containing word, extracts bits

6.3 Virtual Memory Integration

  • Bit addresses translate to physical addresses via TLB
  • word_address = bit_address >> 6 (divide by 64)
  • word_address is then translated through MMU
  • Page boundaries: if bit_address and bit_address+63 span different pages, may require two memory accesses
  • Hardware handles transparently for single-bit operations
  • Multi-word operations may trap if boundary conditions not met

6.4 Cache Coherency

  • Follows processor's existing cache coherency protocol
  • BITSTORE is treated as a regular write for coherency purposes
  • No special coherency instruction needed

7. Exception Behavior

Exception Opcode Trigger Action
PAGE_FAULT Any memory op Address not in TLB Interrupt handler, retry
PROTECTION_FAULT BITSTORE Page not writable Interrupt handler
INVALID_ADDRESS Any memory op Address > max physical Trap
UNDEFINED_FIELD_WIDTH BITFIELD width = 0 or width > 64 Trap

8. Status Register (Implicit)

Bit Name    Meaning
0   ZF      Zero Flag (set by BITTEST)
1   CF      Carry Flag (unused in this ISA)
2-63        Reserved

9. Privilege Levels

All bit-string instructions are user-mode executable. No privilege escalation.

Exception: Bit addresses pointing to kernel memory may trigger protection faults.


10. Formal Semantics (First-Order Logic)

Correctness Property: Single-Bit Load

βˆ€ base, offset ∈ β„• :
  let eff_addr = base + offset
  let word_idx = eff_addr >> 6
  let bit_idx = eff_addr mod 64
  BITLOAD base offset = (mem[word_idx] >> bit_idx) & 1

Correctness Property: Single-Bit Store

βˆ€ base, offset, value ∈ β„• :
  let eff_addr = base + offset
  let word_idx = eff_addr >> 6
  let bit_idx = eff_addr mod 64
  let mask = 1 << bit_idx
  
  after BITSTORE base offset value:
    mem[word_idx] = (mem[word_idx] & ~mask) | ((value & 1) << bit_idx)
    βˆ€ j β‰  word_idx : mem[j] unchanged

Correctness Property: Field Extraction

βˆ€ value, start, width ∈ β„•, width ≀ 64 :
  BITEXTRACT value start width = (value >> start) & ((1 << width) - 1)

11. Implementation Constraints

  • Max memory size: 2^64 bits (addressable)
  • Max single extraction: 64 bits per instruction
  • Max rotation: Full 64-bit rotation with any offset
  • Frequency: Target 1+ GHz (1-3 cycle latency operations)
  • Power: < 2mW per operation (estimated)
  • Area: ~100-200k gates (estimates as sub-module)

12. Future Extensions (Out of Scope)

  • SIMD bit-parallel operations
  • GPU integration
  • Vector bit strings
  • Conditional bit operations
  • Atomic bit operations (hardware locks)