perilus

git clone https://git.bradleygannon.com/perilus.git
Log | Files | Refs | Submodules | README

commit 1c499b6de3e473aa0b0019e1969778911a50f56d
parent 96a96ed223967caaf5d896b312a457807a84aeee
Author: Bradley Gannon <bradley@bradleygannon.com>
Date:   Tue, 27 Jan 2026 21:04:17 -0500

Fix and uncomment existing instruction tests

Diffstat:
Massets/mem-lw-64x32.hex | 2+-
Massets/reg-lw-x32.hex | 2+-
Massets/reg-sw-x32.hex | 2+-
Msrc/test/scala/perilus/main.scala | 174++++++++++++++++++++++++++++++++++++++++---------------------------------------
4 files changed, 92 insertions(+), 88 deletions(-)

diff --git a/assets/mem-lw-64x32.hex b/assets/mem-lw-64x32.hex @@ -1,4 +1,4 @@ -02a5aa83 +0a85aa83 b88829b6 5ee7809a 947924f4 diff --git a/assets/reg-lw-x32.hex b/assets/reg-lw-x32.hex @@ -9,7 +9,7 @@ 00000000 00000000 00000000 -0000000c +00000030 00000000 00000000 00000000 diff --git a/assets/reg-sw-x32.hex b/assets/reg-sw-x32.hex @@ -7,7 +7,7 @@ 01830169 00000000 00000000 -0000003a +00000038 00000000 00000000 00000000 diff --git a/src/test/scala/perilus/main.scala b/src/test/scala/perilus/main.scala @@ -7,87 +7,91 @@ import com.rinthyAi.perilus.main._ class PerilusTests extends AnyFunSpec with ChiselSim { describe("Perilus") { - // it("executes lw") { - // simulate( - // new Perilus( - // initRegs = System.getProperty("user.dir") + "/assets/reg-lw-x32.hex", - // initMem = System.getProperty("user.dir") + "/assets/mem-lw-64x32.hex", - // withDebug = true - // ) - // ) { perilus => - // { - // val perilusDebug = perilus.io.debug.get - - // // lw x21, 0x2a(x11) - // val rd = 21 - // val rs1 = 11 - // val base = 0xc - // val imm = 0x2a - // val memAddr = (base + imm).U - // val memData = 0x0f3f9400 - - // // rs1 contains the base pointer - // perilusDebug.reg.poke(rs1) - // perilusDebug.regData.expect(base) - - // // rd is empty - // perilusDebug.reg.poke(rd) - // perilusDebug.regData.expect(0.U) - - // // memAddr contains memData - // perilusDebug.memAddr.poke(memAddr) - // perilusDebug.memData.expect(memData) - - // // execute the instruction - // perilus.clock.step(6) - - // // rd contains memData - // perilusDebug.reg.poke(rd) - // perilusDebug.regData.expect(memData) - - // // contents of memAddr have not changed - // perilusDebug.memAddr.poke(memAddr) - // perilusDebug.memData.expect(memData) - // } - // } - // } - // it("executes sw") { - // simulate( - // new Perilus( - // initRegs = System.getProperty("user.dir") + "/assets/reg-sw-x32.hex", - // initMem = System.getProperty("user.dir") + "/assets/mem-sw-64x32.hex", - // withDebug = true - // ) - // ) { perilus => - // { - // val perilusDebug = perilus.io.debug.get - - // // sw x6, -4(x9) - // // sw rs2, imm(rs1) - // val rs2 = 6 - // val rs1 = 9 - // val base = 0x3a - // val imm = -4 - // val memAddr = (base + imm).U - // val memData = 0x01830169 - - // // rs1 contains the base pointer - // perilusDebug.reg.poke(rs1) - // perilusDebug.regData.expect(base) - - // // rs2 contains data to be stored - // perilusDebug.reg.poke(rs2) - // perilusDebug.regData.expect(memData) - - // // execute the instruction - // perilus.clock.step(5) - - // // contents of memAddr have not changed - // perilusDebug.memAddr.poke(memAddr) - // perilusDebug.memData.expect(memData) - // } - // } - // } + it("executes lw") { + simulate( + new Perilus( + initRegs = System.getProperty("user.dir") + "/assets/reg-lw-x32.hex", + initMem = System.getProperty("user.dir") + "/assets/mem-lw-64x32.hex", + withDebug = true + ) + ) { perilus => + { + val perilusDebug = perilus.io.debug.get + + // lw x21, 0xa8(x11) + val rd = 21 + val rs1 = 11 + val base = 0x30 + val imm = 0xa8 + val memAddr = (base + imm).U + val memData = 0x0f3f9400 + + // rs1 contains the base pointer + perilusDebug.reg.poke(rs1) + perilusDebug.regData.expect(base) + + // rd is empty + perilusDebug.reg.poke(rd) + perilusDebug.regData.expect(0.U) + + // memAddr contains memData + perilusDebug.memAddr.poke(memAddr) + perilusDebug.memData.expect(memData) + + // execute the instruction + perilus.clock.step(5) + + // rd contains memData + perilusDebug.reg.poke(rd) + perilusDebug.regData.expect(memData) + + // contents of memAddr have not changed + perilusDebug.memAddr.poke(memAddr) + perilusDebug.memData.expect(memData) + } + } + } + it("executes sw") { + simulate( + new Perilus( + initRegs = System.getProperty("user.dir") + "/assets/reg-sw-x32.hex", + initMem = System.getProperty("user.dir") + "/assets/mem-sw-64x32.hex", + withDebug = true + ) + ) { perilus => + { + val perilusDebug = perilus.io.debug.get + + // sw x6, -4(x9) + // sw rs2, imm(rs1) + val rs2 = 6 + val rs1 = 9 + val base = 0x38 + val imm = -4 + val memAddr = (base + imm).U + val memData = 0x01830169 + + // rs1 contains the base pointer + perilusDebug.reg.poke(rs1) + perilusDebug.regData.expect(base) + + // rs2 contains data to be stored + perilusDebug.reg.poke(rs2) + perilusDebug.regData.expect(memData) + + // memAddr doesn't have memData yet + perilusDebug.memAddr.poke(memAddr) + assert(perilusDebug.memData.peek().litValue != memData) + + // execute the instruction + perilus.clock.step(4) + + // contents of memAddr have not changed + perilusDebug.memAddr.poke(memAddr) + perilusDebug.memData.expect(memData) + } + } + } it("executes beq") { simulate( new Perilus( @@ -117,20 +121,20 @@ class PerilusTests extends AnyFunSpec with ChiselSim { var pc_t = perilus.io.pc.peek() // execute the first beq instruction:fe64ae23 // beq x3, x6, 0x4 - perilus.clock.step(4) + perilus.clock.step(3) // pc should be at address 1 because x3 != x6 val expected_1 = pc_t.litValue + 4 - // perilus.io.pc.expect(expected_1.U) + perilus.io.pc.expect(expected_1.U) pc_t = perilus.io.pc.peek() // execute the second beq instruction: // beq x6, x9, 0x4 - perilus.clock.step(4) + perilus.clock.step(3) // pc should be at address 5 because x6 == x9 val expected_2 = pc_t.litValue + offset.litValue - // perilus.io.pc.expect(expected_2.U) + perilus.io.pc.expect(expected_2.U) } } }