def __init__(self, crc_class, layout): self.sink = sink = Sink(layout) self.source = source = Source(layout) self.busy = Signal() # # # dw = flen(sink.data) crc = crc_class(dw) fsm = FSM(reset_state="IDLE") self.submodules += crc, fsm fsm.act("IDLE", crc.reset.eq(1), sink.ack.eq(1), If(sink.stb & sink.sop, sink.ack.eq(0), NextState("COPY"), ) ) fsm.act("COPY", crc.ce.eq(sink.stb & source.ack), crc.data.eq(sink.data), Record.connect(sink, source), source.eop.eq(0), If(sink.stb & sink.eop & source.ack, NextState("INSERT"), ) ) ratio = crc.width//dw if ratio > 1: cnt = Signal(max=ratio, reset=ratio-1) cnt_done = Signal() fsm.act("INSERT", source.stb.eq(1), chooser(crc.value, cnt, source.data, reverse=True), If(cnt_done, source.eop.eq(1), If(source.ack, NextState("IDLE")) ) ) self.comb += cnt_done.eq(cnt == 0) self.sync += \ If(fsm.ongoing("IDLE"), cnt.eq(cnt.reset) ).Elif(fsm.ongoing("INSERT") & ~cnt_done, cnt.eq(cnt - source.ack) ) else: fsm.act("INSERT", source.stb.eq(1), source.eop.eq(1), source.data.eq(crc.value), If(source.ack, NextState("IDLE")) ) self.comb += self.busy.eq(~fsm.ongoing("IDLE"))
def __init__(self, crc_class, layout): self.sink = sink = Sink(layout) self.source = source = Source(layout) self.busy = Signal() # # # dw = flen(sink.data) crc = crc_class(dw) fsm = FSM(reset_state="IDLE") self.submodules += crc, fsm fsm.act("IDLE", crc.reset.eq(1), sink.ack.eq(1), If( sink.stb & sink.sop, sink.ack.eq(0), NextState("COPY"), )) fsm.act("COPY", crc.ce.eq(sink.stb & source.ack), crc.data.eq(sink.data), Record.connect(sink, source), source.eop.eq(0), If( sink.stb & sink.eop & source.ack, NextState("INSERT"), )) ratio = crc.width // dw if ratio > 1: cnt = Signal(max=ratio, reset=ratio - 1) cnt_done = Signal() fsm.act( "INSERT", source.stb.eq(1), chooser(crc.value, cnt, source.data, reverse=True), If(cnt_done, source.eop.eq(1), If(source.ack, NextState("IDLE")))) self.comb += cnt_done.eq(cnt == 0) self.sync += \ If(fsm.ongoing("IDLE"), cnt.eq(cnt.reset) ).Elif(fsm.ongoing("INSERT") & ~cnt_done, cnt.eq(cnt - source.ack) ) else: fsm.act("INSERT", source.stb.eq(1), source.eop.eq(1), source.data.eq(crc.value), If(source.ack, NextState("IDLE"))) self.comb += self.busy.eq(~fsm.ongoing("IDLE"))
def __init__(self, crc_class, layout): self.sink = sink = Sink(layout) self.source = source = Source(layout) self.busy = Signal() # # # dw = flen(sink.data) crc = crc_class(dw) self.submodules += crc ratio = crc.width // dw error = Signal() fifo = InsertReset(SyncFIFO(layout, ratio + 1)) self.submodules += fifo fsm = FSM(reset_state="RESET") self.submodules += fsm fifo_in = Signal() fifo_out = Signal() fifo_full = Signal() self.comb += [ fifo_full.eq(fifo.fifo.level == ratio), fifo_in.eq(sink.stb & (~fifo_full | fifo_out)), fifo_out.eq(source.stb & source.ack), Record.connect(sink, fifo.sink), fifo.sink.stb.eq(fifo_in), self.sink.ack.eq(fifo_in), source.stb.eq(sink.stb & fifo_full), source.sop.eq(fifo.source.sop), source.eop.eq(sink.eop), fifo.source.ack.eq(fifo_out), source.payload.eq(fifo.source.payload), source.error.eq(sink.error | crc.error), ] fsm.act( "RESET", crc.reset.eq(1), fifo.reset.eq(1), NextState("IDLE"), ) fsm.act( "IDLE", crc.data.eq(sink.data), If(sink.stb & sink.sop & sink.ack, crc.ce.eq(1), NextState("COPY"))) fsm.act( "COPY", crc.data.eq(sink.data), If(sink.stb & sink.ack, crc.ce.eq(1), If(sink.eop, NextState("RESET")))) self.comb += self.busy.eq(~fsm.ongoing("IDLE"))
def __init__(self, crc_class, layout): self.sink = sink = Sink(layout, True) self.source = source = Source(layout, True) self.busy = Signal() ### dw = flen(sink.d) self.submodules.crc = crc_class(dw) fsm = FSM(reset_state="RESET_CRC") self.submodules += fsm fsm.act("RESET_CRC", sink.ack.eq(0), self.crc.reset.eq(1), NextState("IDLE") ) fsm.act("IDLE", sink.ack.eq(sink.stb), If(sink.stb & sink.sop, Record.connect(sink, source), self.crc.ce.eq(sink.ack), self.crc.d.eq(sink.d), NextState("COPY") ) ) fsm.act("COPY", Record.connect(sink, source), self.crc.ce.eq(sink.stb & sink.ack), self.crc.d.eq(sink.d), source.error.eq(sink.eop & self.crc.error), If(sink.stb & sink.ack & sink.eop, NextState("RESET_CRC") ) ) self.comb += self.busy.eq(~fsm.ongoing("IDLE"))
def __init__(self, crc_class, layout): self.sink = sink = Sink(layout) self.source = source = Source(layout) self.busy = Signal() # # # dw = flen(sink.data) crc = crc_class(dw) self.submodules += crc ratio = crc.width//dw error = Signal() fifo = InsertReset(SyncFIFO(layout, ratio + 1)) self.submodules += fifo fsm = FSM(reset_state="RESET") self.submodules += fsm fifo_in = Signal() fifo_out = Signal() fifo_full = Signal() self.comb += [ fifo_full.eq(fifo.fifo.level == ratio), fifo_in.eq(sink.stb & (~fifo_full | fifo_out)), fifo_out.eq(source.stb & source.ack), Record.connect(sink, fifo.sink), fifo.sink.stb.eq(fifo_in), self.sink.ack.eq(fifo_in), source.stb.eq(sink.stb & fifo_full), source.sop.eq(fifo.source.sop), source.eop.eq(sink.eop), fifo.source.ack.eq(fifo_out), source.payload.eq(fifo.source.payload), source.error.eq(sink.error | crc.error), ] fsm.act("RESET", crc.reset.eq(1), fifo.reset.eq(1), NextState("IDLE"), ) fsm.act("IDLE", crc.data.eq(sink.data), If(sink.stb & sink.sop & sink.ack, crc.ce.eq(1), NextState("COPY") ) ) fsm.act("COPY", crc.data.eq(sink.data), If(sink.stb & sink.ack, crc.ce.eq(1), If(sink.eop, NextState("RESET") ) ) ) self.comb += self.busy.eq(~fsm.ongoing("IDLE"))
def __init__(self, depth, nslots=2): self.source = source = Source(eth_description(32)) slotbits = max(log2_int(nslots), 1) lengthbits = log2_int(depth*4) # length in bytes self.lengthbits = lengthbits self._start = CSR() self._ready = CSRStatus() self._slot = CSRStorage(slotbits) self._length = CSRStorage(lengthbits) self.submodules.ev = EventManager() self.ev.done = EventSourcePulse() self.ev.finalize() ### # command fifo fifo = SyncFIFO([("slot", slotbits), ("length", lengthbits)], nslots) self.submodules += fifo self.comb += [ fifo.we.eq(self._start.re), fifo.din.slot.eq(self._slot.storage), fifo.din.length.eq(self._length.storage), self._ready.status.eq(fifo.writable) ] # length computation cnt = Signal(lengthbits) clr_cnt = Signal() inc_cnt = Signal() self.sync += \ If(clr_cnt, cnt.eq(0) ).Elif(inc_cnt, cnt.eq(cnt+4) ) # fsm first = Signal() last = Signal() last_d = Signal() fsm = FSM(reset_state="IDLE") self.submodules += fsm fsm.act("IDLE", clr_cnt.eq(1), If(fifo.readable, NextState("CHECK") ) ) fsm.act("CHECK", If(~last_d, NextState("SEND"), ).Else( NextState("END"), ) ) length_lsb = fifo.dout.length[0:2] fsm.act("SEND", source.stb.eq(1), source.sop.eq(first), source.eop.eq(last), If(last, If(length_lsb == 3, source.last_be.eq(0b0010) ).Elif(length_lsb == 2, source.last_be.eq(0b0100) ).Elif(length_lsb == 1, source.last_be.eq(0b1000) ).Else( source.last_be.eq(0b0001) ) ), If(source.ack, inc_cnt.eq(~last), NextState("CHECK") ) ) fsm.act("END", fifo.re.eq(1), self.ev.done.trigger.eq(1), NextState("IDLE") ) # first/last computation self.sync += [ If(fsm.ongoing("IDLE"), first.eq(1) ).Elif(source.stb & source.ack, first.eq(0) ) ] self.comb += last.eq(cnt + 4 >= fifo.dout.length) self.sync += last_d.eq(last) # memory rd_slot = fifo.dout.slot mems = [None]*nslots ports = [None]*nslots for n in range(nslots): mems[n] = Memory(32, depth) ports[n] = mems[n].get_port() self.specials += ports[n] self.mems = mems cases = {} for n, port in enumerate(ports): self.comb += ports[n].adr.eq(cnt[2:]) cases[n] = [source.d.eq(port.dat_r)] self.comb += Case(rd_slot, cases)