from soc.fu.logical.main_stage import LogicalMainStage
from soc.fu.logical.output_stage import LogicalOutputStage
-class LogicalStages(PipeModBaseChain):
+
+class LogicalStages1(PipeModBaseChain):
def get_chain(self):
inp = LogicalInputStage(self.pspec)
main = LogicalMainStage(self.pspec)
+ return [inp, main]
+
+
+class LogicalStages2(PipeModBaseChain):
+ def get_chain(self):
out = LogicalOutputStage(self.pspec)
- return [inp, main, out]
+ return [out]
class LogicalBasePipe(ControlBase):
def __init__(self, pspec):
ControlBase.__init__(self)
self.pspec = pspec
- self.pipe1 = LogicalStages(pspec)
- self._eqs = self.connect([self.pipe1])
+ self.pipe1 = LogicalStages1(pspec)
+ self.pipe2 = LogicalStages2(pspec)
+ self._eqs = self.connect([self.pipe1, self.pipe2])
def elaborate(self, platform):
m = ControlBase.elaborate(self, platform)
- m.submodules.pipe = self.pipe1
+ m.submodules.logical_pipe1 = self.pipe1
+ m.submodules.logical_pipe2 = self.pipe2
m.d.comb += self._eqs
return m
m.submodules.alu = alu = LogicalBasePipe(pspec)
comb += alu.p.data_i.ctx.op.eq_from_execute1(pdecode2.e)
- comb += alu.p.valid_i.eq(1)
comb += alu.n.ready_i.eq(1)
comb += pdecode2.dec.raw_opcode_in.eq(instruction)
sim = Simulator(m)
fn_unit = yield pdecode2.e.do.fn_unit
self.assertEqual(fn_unit, Function.LOGICAL.value, code)
yield from set_alu_inputs(alu, pdecode2, simulator)
+
+ # set valid for one cycle, propagate through pipeline...
+ yield alu.p.valid_i.eq(1)
yield
+ yield alu.p.valid_i.eq(0)
+
opname = code.split(' ')[0]
yield from simulator.call(opname)
index = simulator.pc.CIA.value//4
yield from self.check_alu_outputs(alu, pdecode2,
simulator, code)
+ yield Settle()
+
sim.add_sync_process(process)
with sim.write_vcd("logical_simulator.vcd", "logical_simulator.gtkw",