val path = System.getProperty("user.dir") + "/source/load-ivy.sc" interp.load.module(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath(path))) import chisel3._ import chisel3.util._ import chisel3.tester._ import chisel3.tester.RawTester.test import dotvisualizer._ class RegisterFile(register_number: Int, register_width: Int) extends Module { // συμπληρώστε τον κώδικα από το δικό σας module } class Alu(n: Int) extends Module { // συμπληρώστε τον κώδικα από το δικό σας module } class DataPath(register_number: Int, register_width: Int) extends Module { val io = IO(new Bundle { // immediate value input val im = Input(UInt(register_width.W)) // alu op selection inputs val sel = Input(UInt(2.W)) val sub = Input(UInt(1.W)) // immediate (0) or regfileA (1) selection input var alu_a_sel = Input(UInt(1.W)) // regfile read/write register selection inputs val read_sel_a = Input(UInt(log2Ceil(register_number).W)) val read_sel_b = Input(UInt(log2Ceil(register_number).W)) val write_sel = Input(UInt(log2Ceil(register_number).W)) // alu output for debugging val results = Output(UInt(register_width.W)) }) val regfile = Module(new RegisterFile(register_number,register_width)) val alu = Module(new Alu(register_width)) // (α) regfile.io.read_sel_a := io.read_sel_a // ...συμπληρώστε με όμοιο τρόπο για τα read_sel_b και write_sel... // (β) // ...συμπληρώστε με όμοιο τρόπο για τα sel και sub... // (γ) regfile.io.in := alu.io.out // (δ) // ...συμπληρώστε με όμοιο τρόπο τη σύνδεση μεταξύ b της Alu και out_b του RegisterFile... // (ε) when (io.alu_a_sel === 0.U){ alu.io.a := // ...συμπληρώστε... }.otherwise{ alu.io.a := // ...συμπληρώστε... } // debug only io.results := alu.io.out } test(new DataPath(8,16)) { c => // σήματα εισόδου για τις δοκιμαστικές "λειτουργίες" (micro-instructions) val cmdbits = List(Map("READ_SEL_A" -> 0.U, // λειτουργία Α: r1 = 333 or r0 (io.results = 333) "READ_SEL_B" -> 0.U, "ALU_A_SEL" -> 0.U, "IM" -> 333.U, "SEL" -> "b01".U, "SUB" -> 0.U, "WRITE_SEL" -> 1.U, "RESULTS" -> 333.U), Map("READ_SEL_A" -> 0.U, // λειτουργία Β: r0 = r0 or r1 (io.results = 333) "READ_SEL_B" -> 1.U, "ALU_A_SEL" -> 1.U, "IM" -> 0.U, "SEL" -> "b01".U, "SUB" -> 0.U, "WRITE_SEL" -> 0.U, "RESULTS" -> 333.U) ) for (bits <- cmdbits) { c.io.read_sel_a.poke(bits("READ_SEL_A")) c.io.read_sel_b.poke(bits("READ_SEL_B")) c.io.alu_a_sel.poke(bits("ALU_A_SEL")) c.io.im.poke(bits("IM")) c.io.sel.poke(bits("SEL")) c.io.sub.poke(bits("SUB")) c.io.write_sel.poke(bits("WRITE_SEL")) println(c.io.results.peek()) c.io.results.expect(bits("RESULTS")) c.clock.step() } } println("SUCCESS!!") test(new DataPath(8,16)) { c => // προσθέστε τρία Maps για τις ζητούμενες λειτουργίες val cmdbits = List(Map(...συμπληρώστε...), Map(...συμπληρώστε...), Map(...συμπληρώστε...) ) // μην αλλάξετε τον κώδικα από εδώ και κάτω! for (bits <- cmdbits) { c.io.read_sel_a.poke(bits("READ_SEL_A")) c.io.read_sel_b.poke(bits("READ_SEL_B")) c.io.alu_a_sel.poke(bits("ALU_A_SEL")) c.io.im.poke(bits("IM")) c.io.sel.poke(bits("SEL")) c.io.sub.poke(bits("SUB")) c.io.write_sel.poke(bits("WRITE_SEL")) println(c.io.results.peek()) c.io.results.expect(bits("RESULTS")) c.clock.step() } } println("SUCCESS!!")