324 lines
8.9 KiB
Plaintext
324 lines
8.9 KiB
Plaintext
|
|
.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 }
|
|
rv32i[divu] = { div rs1 rs2 rd unsign }
|
|
rv32i[rem] = { div rs1 rs2 rd rem}
|
|
rv32i[remu] = { div rs1 rs2 rd unsign 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 }
|
|
|
|
# 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 presync postsync }
|
|
|
|
rv32i[csrrci_ro] = { alu rd csr_read }
|
|
|
|
rv32i[csrrci_rw{0-4}] = { alu rd csr_read rs1 csr_clr csr_imm presync postsync }
|
|
|
|
rv32i[csrrs_ro] = { alu rd csr_read }
|
|
|
|
rv32i[csrrs_rw{0-4}] = { alu rd csr_read rs1 csr_set presync postsync }
|
|
|
|
rv32i[csrrsi_ro] = { alu rd csr_read }
|
|
|
|
rv32i[csrrsi_rw{0-4}] = { alu rd csr_read rs1 csr_set csr_imm presync postsync }
|
|
|
|
rv32i[csrrw{0-4}] = { alu rd csr_read rs1 csr_write presync postsync }
|
|
|
|
|
|
rv32i[csrrwi{0-4}] = { alu rd csr_read rs1 csr_write csr_imm presync postsync }
|
|
|
|
# optimize csr write only - pipelined
|
|
rv32i[csrw] = { alu rd rs1 csr_write }
|
|
|
|
rv32i[csrwi] = { alu rd csr_write csr_imm }
|
|
|
|
|
|
.end
|