X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fexperiment%2Fscore6600.py;h=ed953e8b71a3b80ff82fde4c93a115d8fcd39303;hb=9160489ce48a008af3e07fdc81d458a0b366f997;hp=2132a358bf6e23a1a42867e37de0b04c99f194de;hpb=1bfd510f5fbd5abf2118ec0fe7516331523df732;p=soc.git diff --git a/src/experiment/score6600.py b/src/experiment/score6600.py index 2132a358..ed953e8b 100644 --- a/src/experiment/score6600.py +++ b/src/experiment/score6600.py @@ -1,6 +1,6 @@ from nmigen.compat.sim import run_simulation from nmigen.cli import verilog, rtlil -from nmigen import Module, Const, Signal, Array, Cat, Elaboratable +from nmigen import Module, Const, Signal, Array, Cat, Elaboratable, Memory from regfile.regfile import RegFileArray, treereduce from scoreboard.fu_fu_matrix import FUFUDepMatrix @@ -10,8 +10,10 @@ from scoreboard.group_picker import GroupPicker from scoreboard.issue_unit import IssueUnitGroup, IssueUnitArray, RegDecode from scoreboard.shadow import ShadowMatrix, BranchSpeculationRecord from scoreboard.instruction_q import Instruction, InstructionQ +from scoreboard.memfu import MemFunctionUnits from compalu import ComputationUnitNoDelay +from compldst import LDSTCompUnit from alu_hier import ALU, BranchALU from nmutil.latch import SRLatch @@ -22,10 +24,10 @@ from copy import deepcopy from math import log -class Memory(Elaboratable): +class TestMemory(Elaboratable): def __init__(self, regwid, addrw): - self.ddepth = regwid/8 - depth = (1< Mem FUs + comb += memfus.addr_we_i.eq(cul.adr_rel_o) # Match enable on adr rel + + comb += memfus.addrs_i[0].eq(cul.units[0].data_o) + comb += memfus.addrs_i[1].eq(cul.units[1].data_o) + + #comb += cu.go_rd_i[0:n_intfus].eq(go_rd_o[0:n_intfus]) + #comb += cu.go_wr_i[0:n_intfus].eq(go_wr_o[0:n_intfus]) + #comb += cu.issue_i[0:n_intfus].eq(fn_issue_o[0:n_intfus]) + #--------- # merge shadow matrices outputs #--------- @@ -543,9 +637,9 @@ class Scoreboard(Elaboratable): with m.If(br1.issue_i): sync += bspec.active_i.eq(1) with m.If(self.branch_succ_i): - comb += bspec.good_i.eq(fn_issue_o & 0x1f) + comb += bspec.good_i.eq(fn_issue_o & 0x1f) # XXX MAGIC CONSTANT with m.If(self.branch_fail_i): - comb += bspec.fail_i.eq(fn_issue_o & 0x1f) + comb += bspec.fail_i.eq(fn_issue_o & 0x1f) # XXX MAGIC CONSTANT # branch is active (TODO: a better signal: this is over-using the # go_write signal - actually the branch should not be "writing") @@ -620,8 +714,10 @@ class IssueToScoreboard(Elaboratable): iq = InstructionQ(self.rwid, self.opw, self.qlen, self.n_in, self.n_out) sc = Scoreboard(self.rwid, self.n_regs) + mem = TestMemory(self.rwid, 8) # not too big, takes too long m.submodules.iq = iq m.submodules.sc = sc + m.submodules.mem = mem # get at the regfile for testing self.intregs = sc.intregs @@ -643,9 +739,13 @@ class IssueToScoreboard(Elaboratable): # in "waiting" state wait_issue_br = Signal() wait_issue_alu = Signal() + wait_issue_ls = Signal() - with m.If(wait_issue_br | wait_issue_alu): + with m.If(wait_issue_br | wait_issue_alu | wait_issue_ls): # set instruction pop length to 1 if the unit accepted + with m.If(wait_issue_ls & (sc.lsissue.fn_issue_o != 0)): + with m.If(iq.qlen_o != 0): + comb += iq.n_sub_i.eq(1) with m.If(wait_issue_br & (sc.brissue.fn_issue_o != 0)): with m.If(iq.qlen_o != 0): comb += iq.n_sub_i.eq(1) @@ -674,14 +774,24 @@ class IssueToScoreboard(Elaboratable): # choose a Function-Unit-Group with m.If((op & (0x3<<2)) != 0): # branch - comb += sc.brissue.insn_i.eq(1) comb += sc.br_oper_i.eq(Cat(op[0:2], opi)) comb += sc.br_imm_i.eq(imm) + comb += sc.brissue.insn_i.eq(1) comb += wait_issue_br.eq(1) - with m.Else(): # alu - comb += sc.aluissue.insn_i.eq(1) + with m.Elif((op & (0x3<<4)) != 0): # ld/st + # see compldst.py + # bit 0: ADD/SUB + # bit 1: immed + # bit 4: LD + # bit 5: ST + comb += sc.ls_oper_i.eq(Cat(op[0], opi[0], op[4:6])) + comb += sc.ls_imm_i.eq(imm) + comb += sc.lsissue.insn_i.eq(1) + comb += wait_issue_ls.eq(1) + with m.Else(): # alu comb += sc.alu_oper_i.eq(Cat(op[0:2], opi)) comb += sc.alu_imm_i.eq(imm) + comb += sc.aluissue.insn_i.eq(1) comb += wait_issue_alu.eq(1) # XXX TODO @@ -712,6 +822,7 @@ IBLT = 5 IBEQ = 6 IBNE = 7 + class RegSim: def __init__(self, rwidth, nregs): self.rwidth = rwidth @@ -740,6 +851,8 @@ class RegSim: val = int(src1 == src2) elif op == IBNE: val = int(src1 != src2) + else: + return 0 # LD/ST TODO val &= maxbits self.setval(dest, val) return val @@ -845,6 +958,7 @@ def wait_for_busy_clear(dut): def disable_issue(dut): yield dut.aluissue.insn_i.eq(0) yield dut.brissue.insn_i.eq(0) + yield dut.lsissue.insn_i.eq(0) def wait_for_issue(dut, dut_issue): @@ -992,6 +1106,9 @@ def scoreboard_sim(dut, alusim): if False: instrs = create_random_ops(dut, 15, True, 4) + if True: # LD test (with immediate) + instrs.append( (1, 2, 2, 0x10, 1, 20, (0, 0)) ) + if False: instrs.append( (1, 2, 2, 1, 1, 20, (0, 0)) ) @@ -1007,7 +1124,7 @@ def scoreboard_sim(dut, alusim): instrs.append((5, 3, 3, 3, 0, 0, (0, 0))) instrs.append((3, 5, 5, 0, 0, 0, (0, 0))) - if True: + if False: instrs.append( (3, 3, 4, 0, 0, 13979, (0, 0))) instrs.append( (6, 4, 1, 2, 0, 40976, (0, 0))) instrs.append( (1, 4, 7, 4, 1, 23652, (0, 0)))