Simple RV32I validation assembly code

This commit is contained in:
Douglas Santos 2021-06-24 11:58:37 +02:00
parent 2d54e7cbc2
commit bc5edd7d16
2 changed files with 201 additions and 7 deletions

171
src/rv32i.asm Normal file
View file

@ -0,0 +1,171 @@
.data
var0: 100
res_auipc: 0x00020008
res_lui: 0x00020000
res_li: 0x00000194
res_add: 350
res_slt: 1
res_xor: 158
res_sll: 800
res_srl: 12
res_or: 254
res_and: 96
res_jal: 0x000000CA
# assembly code to validate entire rv32i
.text
j start
error:
j error
start:
# add upper immediate to PC
auipc t0, 0x20
lw t1, res_auipc
bne t0, t1, error
# load upper immediate
lui t0, 0x20
lw t1, res_lui
bne t0, t1, error
# TODO: asserts to ensure that the first instructions work
# load and store words
la a0, var0
lw t0, 0(a0)
sw t0, 0(a0)
lw t1, 0(a0)
bne t0, t1, error
# TODO: load and store half-words and bytes
# add immediate
addi t0, x0, 0xCA
addi t0, t0, 0xCA
lw t1, res_li
bne t0, t1, error
# initalize variables for next operations
li a0, 100
li a1, 250
li a2, 3
# add
add t0, a0, a1
lw t1, res_add
bne t0, t1, error
# set on less than
slt t0, a0, a1
lw t1, res_slt
bne t0, t1, error
# TODO: sltu
# exclusive-or
xor t0, a0, a1
lw t1, res_xor
bne t0, t1, error
# shift left logical
sll t0, a0, a2
lw t1, res_sll
bne t0, t1, error
# shift right logical
srl t0, a0, a2
lw t1, res_srl
bne t0, t1, error
# shift right arithmetic
sra t0, a0, a2
lw t1, res_srl
bne t0, t1, error
# or
or t0, a0, a1
lw t1, res_or
bne t0, t1, error
# and
and t0, a0, a1
lw t1, res_and
bne t0, t1, error
# jump and link
jal ra, jal_test
lw t1, res_jal
bne t0, t1, error
j jal_continue
jal_test:
addi t0, x0, 0xCA
jalr x0, ra, 0
jal_continue:
# branch on equal
# test: take branch
li t0, 0x100
li t1, 0x100
beq t0, t1, equal0
j error
equal0:
# test: dont take branch
li t0, 0x100
li t1, 0x101
beq t0, t1, equal1
j beq_continue
equal1:
j error
beq_continue:
# branch on not equal
# test: take branch
li t0, 0x100
li t1, 0x101
bne t0, t1, not_equal0
j error
not_equal0:
# test: dont take branch
li t0, 0x100
li t1, 0x100
bne t0, t1, not_equal1
j bne_continue
not_equal1:
j error
bne_continue:
# branch on less than
# test: take branch
li t0, -0x10
li t1, 0x10
blt t0, t1, less0
j error
less0:
# test: dont take branch
li t0, 0x10
li t1, 0x10
blt t0, t1, less1
j blt_continue
less1:
j error
blt_continue:
# branch on greater or equal
# test: take branch
li t0, 0x10
li t1, 0x10
bge t0, t1, greater0
j error
greater0:
# test: dont take branch
li t0, -0x10
li t1, 0x10
bge t0, t1, greater1
j bge_continue
greater1:
j error
bge_continue:
# TODO: bltu, bgeu
success:
j success

View file

@ -12,15 +12,15 @@
</db_ref>
</db_ref_list>
<zoom_setting>
<ZoomStartTime time="0fs"></ZoomStartTime>
<ZoomEndTime time="4890001fs"></ZoomEndTime>
<Cursor1Time time="2070000fs"></Cursor1Time>
<ZoomStartTime time="42035834fs"></ZoomStartTime>
<ZoomEndTime time="44520835fs"></ZoomEndTime>
<Cursor1Time time="43030834fs"></Cursor1Time>
</zoom_setting>
<column_width_setting>
<NameColumnWidth column_width="204"></NameColumnWidth>
<NameColumnWidth column_width="196"></NameColumnWidth>
<ValueColumnWidth column_width="66"></ValueColumnWidth>
</column_width_setting>
<WVObjectSize size="28" />
<WVObjectSize size="34" />
<wvobject type="array" fp_name="/sim_from_dump/INST_DUMP_FILE_PATH">
<obj_property name="ElementShortName">INST_DUMP_FILE_PATH[1:33]</obj_property>
<obj_property name="ObjectShortName">INST_DUMP_FILE_PATH[1:33]</obj_property>
@ -90,7 +90,7 @@
<obj_property name="ElementShortName">[5][31:0]</obj_property>
<obj_property name="ObjectShortName">[5][31:0]</obj_property>
<obj_property name="label">reg_t0</obj_property>
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject type="array" fp_name="/sim_from_dump/harv_i/regfile_i/g_normal/regfile_w">
<obj_property name="ElementShortName">regfile_w[31:0][31:0]</obj_property>
@ -112,6 +112,30 @@
<obj_property name="ElementShortName">wren_i</obj_property>
<obj_property name="ObjectShortName">wren_i</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/sim_from_dump/harv_i/instr_fetch_i/jump_i">
<obj_property name="ElementShortName">jump_i</obj_property>
<obj_property name="ObjectShortName">jump_i</obj_property>
</wvobject>
<wvobject type="array" fp_name="/sim_from_dump/harv_i/instr_fetch_i/jump_imm_i">
<obj_property name="ElementShortName">jump_imm_i[31:0]</obj_property>
<obj_property name="ObjectShortName">jump_imm_i[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/sim_from_dump/harv_i/imm_i_w">
<obj_property name="ElementShortName">imm_i_w[11:0]</obj_property>
<obj_property name="ObjectShortName">imm_i_w[11:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/sim_from_dump/harv_i/imm_w">
<obj_property name="ElementShortName">imm_w[31:0]</obj_property>
<obj_property name="ObjectShortName">imm_w[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/sim_from_dump/harv_i/ctl_aluop_w">
<obj_property name="ElementShortName">ctl_aluop_w[3:0]</obj_property>
<obj_property name="ObjectShortName">ctl_aluop_w[3:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/sim_from_dump/harv_i/alu_data_w">
<obj_property name="ElementShortName">alu_data_w[31:0]</obj_property>
<obj_property name="ObjectShortName">alu_data_w[31:0]</obj_property>
</wvobject>
<wvobject fp_name="divider12648" type="divider">
<obj_property name="label">MEMORIES</obj_property>
<obj_property name="DisplayName">label</obj_property>
@ -143,7 +167,6 @@
<wvobject type="group" fp_name="group4275">
<obj_property name="label">dmem</obj_property>
<obj_property name="DisplayName">label</obj_property>
<obj_property name="isExpanded"></obj_property>
<wvobject type="array" fp_name="/sim_from_dump/dmem_data_i">
<obj_property name="ElementShortName">dmem_data_i[31:0]</obj_property>
<obj_property name="ObjectShortName">dmem_data_i[31:0]</obj_property>