// --------------------32 bit Blitz-64 instructions------------------------------------------- // // Harry Porter - 8 January 2020 // Harry Porter - 16 MRCH 2023 // // Copied and modified from Kirk Weedman's code. // package op_codes; typedef enum logic [3:0] { // If changed from 4 bits, the use in SEL field must be changed. MMU_NOP, // 0000 MMU_LOADB, // 0001 MMU_LOADH, // 0010 MMU_LOADW, // 0011 MMU_LOADD, // 0100 MMU_STOREB, // 0101 MMU_STOREH, // 0110 MMU_STOREW, // 0111 MMU_STORED, // 1000 MMU_FETCH, // 1001 MMU_CAS, // 1010 MMU_TLBCLEAR, // 1011 MMU_TLBFLUSH, // 1100 MMU_FENCE, // 1101 MMU_INVALID, // 1110 MMU_TLBDEBUG // 1111 -- Used by CONTROL instruction for debugging MMU } MMU_COMMAND; typedef enum logic [2:0] { MEM_NOP, // 000 MEM_READ, // 001 MEM_READ_INST, // 010 MEM_READ_AND_LOCK, // 011 MEM_WRITE, // 100 MEM_FENCE // 101 } MEM_COMMAND; typedef enum logic [2:0] { TLB_NOP, // 000 TLB_CLEAR, // 001 TLB_FLUSH, // 010 TLB_PROMOTE, // 011 TLB_ADD // 100 } TLB_COMMAND; // Format A 0000 0000 ---OP2---- Rs3 Rs2 Rs1 Rd // Arithmetic and Logical `define OP2_ADD 8'h01 `define OP2_ADDOK 8'h02 `define OP2_ADD3 8'h03 `define OP2_SUB 8'h04 `define OP2_AND 8'h09 `define OP2_OR 8'h0a `define OP2_XOR 8'h0b // Illegal // `define ILLEGAL 0000_0000 // Multiply and Divide `define OP2_MULADD 8'h05 `define OP2_MULADDU 8'h06 `define OP2_DIV 8'h07 `define OP2_REM 8'h08 // Shift `define OP2_SLL 8'h0c `define OP2_SLA 8'h0d `define OP2_SRL 8'h0e `define OP2_SRA 8'h0f `define OP2_ROTR 8'h10 // Sign Extend `define OP2_SEXTB 8'h11 `define OP2_SEXTH 8'h12 `define OP2_SEXTW 8'h13 // Range Checking `define OP2_NULLTEST 8'h14 `define OP2_CHECKB 8'h15 `define OP2_CHECKH 8'h16 `define OP2_CHECKW 8'h17 `define OP2_INDEX0 8'h18 `define OP2_INDEX1 8'h19 `define OP2_INDEX2 8'h1a `define OP2_INDEX4 8'h1b `define OP2_INDEX8 8'h1c `define OP2_INDEX16 8'h1d `define OP2_INDEX24 8'h1e `define OP2_INDEX32 8'h1f // Byte Reordering `define OP2_INDIANH 8'h20 `define OP2_INDIANW 8'h21 `define OP2_INDIAND 8'h22 // Test & Set Boolean `define OP2_TESTEQ 8'h23 `define OP2_TESTNE 8'h24 `define OP2_TESTLT 8'h25 `define OP2_TESTLE 8'h26 // Align `define OP2_ALIGNH 8'h27 `define OP2_ALIGNW 8'h28 `define OP2_ALIGND 8'h29 `define OP2_INJECT1H 8'h2a `define OP2_INJECT2H 8'h2b `define OP2_INJECT1W 8'h2c `define OP2_INJECT2W 8'h2d `define OP2_INJECT1D 8'h2e `define OP2_INJECT2D 8'h2f // Misc. `define OP2_SYSRET 8'h30 `define OP2_SLEEP1 8'h31 `define OP2_SLEEP2 8'h32 `define OP2_RESTART 8'h33 `define OP2_DEBUG 8'h34 `define OP2_BREAKPOINT 8'h35 `define OP2_CAS 8'h36 `define OP2_FENCE 8'h37 `define OP2_CSRSWAP 8'h38 `define OP2_CSRREAD 8'h39 `define OP2_GETSTAT 8'h3a `define OP2_PUTSTAT 8'h3b `define OP2_TLBCLEAR 8'h3c `define OP2_TLBFLUSH 8'h3d // Floating Point `define OP2_FADD 8'h3e `define OP2_FSUB 8'h3f `define OP2_FMUL 8'h40 `define OP2_FDIV 8'h41 `define OP2_FMIN 8'h42 `define OP2_FMAX 8'h43 `define OP2_FNEG 8'h44 `define OP2_FABS 8'h45 `define OP2_FSQRT 8'h46 `define OP2_FEQ 8'h47 `define OP2_FLT 8'h48 `define OP2_FLE 8'h49 `define OP2_FCVTFI 8'h4a `define OP2_FCVTIF 8'h4b `define OP2_FMADD 8'h4c `define OP2_FNMADD 8'h4d `define OP2_FMSUB 8'h4e `define OP2_FNMSUB 8'h4f // Format B 00--OP1-- -------Imm16------- Rs1 Rd // Arithmetic & Logical `define OP1_ADDI 8'h01 `define OP1_ANDI 8'h02 `define OP1_ORI 8'h03 `define OP1_XORI 8'h04 // Shift `define OP1_SLLI 8'h05 `define OP1_SLAI 8'h06 `define OP1_SRLI 8'h07 `define OP1_SRAI 8'h08 `define OP1_ROTRI 8'h09 // Test & Set Boolean `define OP1_TESTEQI 8'h0a `define OP1_TESTNEI 8'h0b `define OP1_TESTLTI 8'h0c `define OP1_TESTLEI 8'h0d `define OP1_TESTGTI 8'h0e `define OP1_TESTGEI 8'h0f // Larger Addresses `define OP1_UPPER16 8'h15 `define OP1_SHIFT16 8'h16 // Jump `define OP1_JALR 8'h1a // Load `define OP1_LOADB 8'h1b `define OP1_LOADH 8'h1c `define OP1_LOADW 8'h1d `define OP1_LOADD 8'h1e // Misc. `define OP1_SYSCALL 8'h23 `define OP1_CONTROL 8'h24 `define OP1_CONTROLU 8'h25 // CSR Manipulation `define OP1_CSRSET 8'h26 `define OP1_CSRCLR 8'h27 // Virtual Memory `define OP1_CHECKADDR 8'h28 // Virtual Memory `define OP1_ENTERFUN 8'h29 `define OP1_EXITFUN 8'h2a // Format C 00--OP1-- *******Imm16** Rs2 Rs1 **** // Branch `define OP1_BEQ 8'h10 `define OP1_BNE 8'h11 `define OP1_BLT 8'h12 `define OP1_BLE 8'h13 // Store `define OP1_STOREB 8'h1f `define OP1_STOREH 8'h20 `define OP1_STOREW 8'h21 `define OP1_STORED 8'h22 // Format D 00--OP1-- -------Imm20------------ Rd // Larger Addresses `define OP1_UPPER20 8'h14 `define OP1_ADDPC 8'h17 `define OP1_AUIPC 8'h18 // Jump `define OP1_JAL 8'h19 endpackage