From 1dc8af894ed9e1e5b8a292af9a90054ce648a51c Mon Sep 17 00:00:00 2001 From: Howard Mao Date: Wed, 24 Feb 2016 21:33:51 -0800 Subject: [PATCH] fix serializer/deserializer and add Atos serdes/desser --- junctions/src/main/scala/atos.scala | 40 +++++++++++++++++++++++++-- junctions/src/main/scala/stream.scala | 23 +++++++++------ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/junctions/src/main/scala/atos.scala b/junctions/src/main/scala/atos.scala index f11c7877..d526a773 100644 --- a/junctions/src/main/scala/atos.scala +++ b/junctions/src/main/scala/atos.scala @@ -96,7 +96,7 @@ class AtosRequest(implicit p: Parameters) def is_last(dummy: Int = 0) = typ === AtosRequest.arType || (typ === AtosRequest.wType && last()) - def nbytes: Int = atosRequestBytes + def nbits: Int = atosRequestBits def resp_len(dummy: Int = 0) = MuxLookup(typ, UInt(0), Seq( @@ -138,7 +138,7 @@ class AtosResponse(implicit p: Parameters) def is_last(dummy: Int = 0) = !has_data() || last - def nbytes: Int = atosResponseBytes + def nbits: Int = atosResponseBits } class AtosIO(implicit p: Parameters) extends AtosBundle()(p) { @@ -289,3 +289,39 @@ class AtosManagerConverter(implicit p: Parameters) extends AtosModule()(p) { resp_enc.io.b <> io.nasti.b resp_enc.io.r <> io.nasti.r } + +class AtosSerializedIO(w: Int)(implicit p: Parameters) extends ParameterizedBundle()(p) { + val req = Decoupled(Bits(width = w)) + val resp = Decoupled(Bits(width = w)).flip + override def cloneType = new AtosSerializedIO(w)(p).asInstanceOf[this.type] +} + +class AtosSerdes(w: Int)(implicit p: Parameters) extends AtosModule()(p) { + val io = new Bundle { + val wide = (new AtosIO).flip + val narrow = new AtosSerializedIO(w) + } + + val ser = Module(new Serializer(w, new AtosRequest)) + ser.io.in <> io.wide.req + io.narrow.req <> ser.io.out + + val des = Module(new Deserializer(w, new AtosResponse)) + des.io.in <> io.narrow.resp + io.wide.resp <> des.io.out +} + +class AtosDesser(w: Int)(implicit p: Parameters) extends AtosModule()(p) { + val io = new Bundle { + val narrow = new AtosSerializedIO(w).flip + val wide = new AtosIO + } + + val des = Module(new Deserializer(w, new AtosRequest)) + des.io.in <> io.narrow.req + io.wide.req <> des.io.out + + val ser = Module(new Serializer(w, new AtosResponse)) + ser.io.in <> io.wide.resp + io.narrow.resp <> ser.io.out +} diff --git a/junctions/src/main/scala/stream.scala b/junctions/src/main/scala/stream.scala index 2b577272..5ee14c5e 100644 --- a/junctions/src/main/scala/stream.scala +++ b/junctions/src/main/scala/stream.scala @@ -151,31 +151,36 @@ object StreamUtils { } trait Serializable { - def nbytes: Int + def nbits: Int } -class Serializer[T <: Data with Serializable](typ: T) extends Module { +class Serializer[T <: Data with Serializable](w: Int, typ: T) extends Module { val io = new Bundle { val in = Decoupled(typ).flip - val out = Decoupled(new StreamChannel(8)) + val out = Decoupled(Bits(width = w)) } - val narrower = Module(new StreamNarrower(typ.nbytes * 8, 8)) + val narrower = Module(new StreamNarrower(typ.nbits, w)) narrower.io.in.bits.data := io.in.bits.toBits narrower.io.in.bits.last := Bool(true) narrower.io.in.valid := io.in.valid io.in.ready := narrower.io.in.ready - io.out <> narrower.io.out + io.out.valid := narrower.io.out.valid + io.out.bits := narrower.io.out.bits.data + narrower.io.out.ready := io.out.ready } -class Deserializer[T <: Data with Serializable](typ: T) extends Module { +class Deserializer[T <: Data with Serializable](w: Int, typ: T) extends Module { val io = new Bundle { - val in = Decoupled(new StreamChannel(8)).flip + val in = Decoupled(Bits(width = w)).flip val out = Decoupled(typ) } - val expander = Module(new StreamExpander(8, 8 * typ.nbytes)) - expander.io.in <> io.in + val expander = Module(new StreamExpander(w, typ.nbits)) + expander.io.in.valid := io.in.valid + expander.io.in.bits.data := io.in.bits + expander.io.in.bits.last := Bool(true) + io.in.ready := expander.io.in.ready io.out.valid := expander.io.out.valid io.out.bits := typ.cloneType.fromBits(expander.io.out.bits.data) expander.io.out.ready := io.out.ready