.definition add = [0000000..........000.....0110011] addi = [.................000.....0010011] sub = [0100000..........000.....0110011] and = [0000000..........111.....0110011] andi = [.................111.....0010011] or = [0000000..........110.....0110011] ori = [.................110.....0010011] xor = [0000000..........100.....0110011] xori = [.................100.....0010011] sll = [0000000..........001.....0110011] slli = [0000000..........001.....0010011] sra = [0100000..........101.....0110011] srai = [0100000..........101.....0010011] srl = [0000000..........101.....0110011] srli = [0000000..........101.....0010011] lui = [.........................0110111] auipc= [.........................0010111] slt = [0000000..........010.....0110011] sltu = [0000000..........011.....0110011] slti = [.................010.....0010011] sltiu= [.................011.....0010011] beq = [.................000.....1100011] bne = [.................001.....1100011] bge = [.................101.....1100011] blt = [.................100.....1100011] bgeu = [.................111.....1100011] bltu = [.................110.....1100011] jal = [.........................1101111] jalr = [.................000.....1100111] lb = [.................000.....0000011] lh = [.................001.....0000011] lw = [.................010.....0000011] sb = [.................000.....0100011] sh = [.................001.....0100011] sw = [.................010.....0100011] lbu = [.................100.....0000011] lhu = [.................101.....0000011] fence = [0000........00000000000000001111] fence.i = [00000000000000000001000000001111] ebreak = [00000000000100000000000001110011] ecall = [00000000000000000000000001110011] mret = [00110000001000000000000001110011] wfi = [00010000010100000000000001110011] csrrc_ro = [............00000011.....1110011] csrrc_rw0 = [............1....011.....1110011] csrrc_rw1 = [.............1...011.....1110011] csrrc_rw2 = [..............1..011.....1110011] csrrc_rw3 = [...............1.011.....1110011] csrrc_rw4 = [................1011.....1110011] csrrci_ro = [............00000111.....1110011] csrrci_rw0 = [............1....111.....1110011] csrrci_rw1 = [.............1...111.....1110011] csrrci_rw2 = [..............1..111.....1110011] csrrci_rw3 = [...............1.111.....1110011] csrrci_rw4 = [................1111.....1110011] csrrs_ro = [............00000010.....1110011] csrrs_rw0 = [............1....010.....1110011] csrrs_rw1 = [.............1...010.....1110011] csrrs_rw2 = [..............1..010.....1110011] csrrs_rw3 = [...............1.010.....1110011] csrrs_rw4 = [................1010.....1110011] csrrsi_ro = [............00000110.....1110011] csrrsi_rw0 = [............1....110.....1110011] csrrsi_rw1 = [.............1...110.....1110011] csrrsi_rw2 = [..............1..110.....1110011] csrrsi_rw3 = [...............1.110.....1110011] csrrsi_rw4 = [................1110.....1110011] csrw = [.................001000001110011] csrrw0 = [.................001....11110011] csrrw1 = [.................001...1.1110011] csrrw2 = [.................001..1..1110011] csrrw3 = [.................001.1...1110011] csrrw4 = [.................0011....1110011] csrwi = [.................101000001110011] csrrwi0 = [.................101....11110011] csrrwi1 = [.................101...1.1110011] csrrwi2 = [.................101..1..1110011] csrrwi3 = [.................101.1...1110011] csrrwi4 = [.................1011....1110011] mul = [0000001..........000.....0110011] mulh = [0000001..........001.....0110011] mulhsu = [0000001..........010.....0110011] mulhu = [0000001..........011.....0110011] div = [0000001..........100.....0110011] divu = [0000001..........101.....0110011] rem = [0000001..........110.....0110011] remu = [0000001..........111.....0110011] .input rv32i = { i[31] i[30] i[29] i[28] i[27] i[26] i[25] i[24] i[23] i[22] i[21] i[20] i[19] i[18] i[17] i[16] i[15] i[14] i[13] i[12] i[11] i[10] i[9] i[8] i[7] i[6] i[5] i[4] i[3] i[2] i[1] i[0] } .output rv32i = { alu rs1 rs2 imm12 rd shimm5 imm20 pc load store lsu add sub land lor lxor sll sra srl slt unsign condbr beq bne bge blt jal by half word csr_read csr_clr csr_set csr_write csr_imm presync postsync ebreak ecall mret mul rs1_sign rs2_sign low div rem fence fence_i pm_alu } .decode rv32i[mul] = { mul rs1 rs2 rd low } rv32i[mulh] = { mul rs1 rs2 rd rs1_sign rs2_sign } rv32i[mulhu] = { mul rs1 rs2 rd } rv32i[mulhsu] = { mul rs1 rs2 rd rs1_sign } rv32i[div] = { div rs1 rs2 rd presync postsync} rv32i[divu] = { div rs1 rs2 rd unsign presync postsync} rv32i[rem] = { div rs1 rs2 rd presync postsync rem} rv32i[remu] = { div rs1 rs2 rd unsign presync postsync rem} rv32i[add] = { alu rs1 rs2 rd add pm_alu } rv32i[addi] = { alu rs1 imm12 rd add pm_alu } rv32i[sub] = { alu rs1 rs2 rd sub pm_alu } rv32i[and] = { alu rs1 rs2 rd land pm_alu } rv32i[andi] = { alu rs1 imm12 rd land pm_alu } rv32i[or] = { alu rs1 rs2 rd lor pm_alu } rv32i[ori] = { alu rs1 imm12 rd lor pm_alu } rv32i[xor] = { alu rs1 rs2 rd lxor pm_alu } rv32i[xori] = { alu rs1 imm12 rd lxor pm_alu } rv32i[sll] = { alu rs1 rs2 rd sll pm_alu } rv32i[slli] = { alu rs1 shimm5 rd sll pm_alu } rv32i[sra] = { alu rs1 rs2 rd sra pm_alu } rv32i[srai] = { alu rs1 shimm5 rd sra pm_alu } rv32i[srl] = { alu rs1 rs2 rd srl pm_alu } rv32i[srli] = { alu rs1 shimm5 rd srl pm_alu } rv32i[lui] = { alu imm20 rd lor pm_alu } rv32i[auipc] = { alu imm20 pc rd add pm_alu } rv32i[slt] = { alu rs1 rs2 rd sub slt pm_alu } rv32i[sltu] = { alu rs1 rs2 rd sub slt unsign pm_alu } rv32i[slti] = { alu rs1 imm12 rd sub slt pm_alu } rv32i[sltiu] = { alu rs1 imm12 rd sub slt unsign pm_alu } rv32i[beq] = { alu rs1 rs2 sub condbr beq } rv32i[bne] = { alu rs1 rs2 sub condbr bne } rv32i[bge] = { alu rs1 rs2 sub condbr bge } rv32i[blt] = { alu rs1 rs2 sub condbr blt } rv32i[bgeu] = { alu rs1 rs2 sub condbr bge unsign } rv32i[bltu] = { alu rs1 rs2 sub condbr blt unsign } rv32i[jal] = { alu imm20 rd pc jal } rv32i[jalr] = { alu rs1 rd imm12 jal } rv32i[lb] = { lsu load rs1 rd by } rv32i[lh] = { lsu load rs1 rd half } rv32i[lw] = { lsu load rs1 rd word } rv32i[lbu] = { lsu load rs1 rd by unsign } rv32i[lhu] = { lsu load rs1 rd half unsign } rv32i[sb] = { lsu store rs1 rs2 by } rv32i[sh] = { lsu store rs1 rs2 half } rv32i[sw] = { lsu store rs1 rs2 word } rv32i[fence] = { alu lor fence presync} # fence.i has fence effect in addtion to flush I$ and redirect rv32i[fence.i] = { alu lor fence fence_i presync postsync} # nops for now rv32i[ebreak] = { alu rs1 imm12 rd lor ebreak postsync} rv32i[ecall] = { alu rs1 imm12 rd lor ecall postsync} rv32i[mret] = { alu rs1 imm12 rd lor mret postsync} rv32i[wfi] = { alu rs1 imm12 rd lor pm_alu } # csr means read # csr_read - put csr on rs2 and rs1 0's rv32i[csrrc_ro] = { alu rd csr_read lor } # put csr on rs2 and make rs1 0's into alu. Save rs1 for csr_clr later rv32i[csrrc_rw{0-4}] = { alu rd csr_read rs1 csr_clr lor presync postsync } rv32i[csrrci_ro] = { alu rd csr_read lor } rv32i[csrrci_rw{0-4}] = { alu rd csr_read rs1 csr_clr csr_imm lor presync postsync } rv32i[csrrs_ro] = { alu rd csr_read lor } rv32i[csrrs_rw{0-4}] = { alu rd csr_read rs1 csr_set lor presync postsync } rv32i[csrrsi_ro] = { alu rd csr_read lor } rv32i[csrrsi_rw{0-4}] = { alu rd csr_read rs1 csr_set csr_imm lor presync postsync } rv32i[csrrw{0-4}] = { alu rd csr_read rs1 csr_write lor presync postsync } rv32i[csrrwi{0-4}] = { alu rd csr_read rs1 csr_write csr_imm lor presync postsync } # optimize csr write only - pipelined rv32i[csrw] = { alu rd rs1 csr_write } rv32i[csrwi] = { alu rd csr_write csr_imm } .end