拆分CDRIn为采样部分和axis部分;调整层次结构,仅将cdrInSample放在顶层;放置3组CDRInSample,使用寄存器选择
This commit is contained in:
@@ -5,34 +5,17 @@ import chisel3.util._
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class CDRInSampleIO extends Bundle{
|
||||||
|
|
||||||
|
|
||||||
//work in 100MHZ
|
|
||||||
class CDRInIO extends Bundle{
|
|
||||||
val axis = Decoupled(new AXIS_Bundle(8))
|
|
||||||
val decode = Flipped(new Decode_Bundle)
|
|
||||||
val serDat = Input(Bool())
|
val serDat = Input(Bool())
|
||||||
val flush = Input(Bool())
|
val syncSerDat = Output(Bool())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CDRInMultiSample extends Module with RequireAsyncReset{
|
||||||
|
val io: CDRInSampleIO = IO(new CDRInSampleIO)
|
||||||
abstract class CDRInBase extends Module with RequireAsyncReset{
|
|
||||||
val io: CDRInIO = IO(new CDRInIO)
|
|
||||||
io.decode.dataIn := 0.U
|
|
||||||
|
|
||||||
val syncSerDat = Wire(Bool())
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
trait CDRInMultiSample{ this: CDRInBase =>
|
|
||||||
|
|
||||||
val clkNum: Int = 16
|
val clkNum: Int = 16
|
||||||
require( clkNum == 16 )
|
require( clkNum == 16 )
|
||||||
|
|
||||||
|
|
||||||
//multiCLK 需要按照滞后相位接线,即0为最先到达,1次先
|
//multiCLK 需要按照滞后相位接线,即0为最先到达,1次先
|
||||||
val multiCLK = IO(Input(Vec(clkNum, Bool())))
|
val multiCLK = IO(Input(Vec(clkNum, Bool())))
|
||||||
|
|
||||||
@@ -196,14 +179,22 @@ trait CDRInMultiSample{ this: CDRInBase =>
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
syncSerDat := asyncSerDat
|
io.syncSerDat := asyncSerDat
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CDRInAxisIO extends Bundle{
|
||||||
|
val axis = Decoupled(new AXIS_Bundle(8))
|
||||||
|
val decode = Flipped(new Decode_Bundle)
|
||||||
|
val syncSerDat = Input(Bool())
|
||||||
|
|
||||||
|
val flush = Input(Bool())
|
||||||
|
}
|
||||||
|
|
||||||
trait CDRInAxis{ this: CDRInBase =>
|
class CDRInAxis extends Module with RequireAsyncReset{
|
||||||
|
val io: CDRInAxisIO = IO(new CDRInAxisIO)
|
||||||
|
|
||||||
|
io.decode.dataIn := 0.U
|
||||||
def HeaderByte: Int = 4
|
def HeaderByte: Int = 4
|
||||||
|
|
||||||
val ETH_PRE = "h68".U(8.W)
|
val ETH_PRE = "h68".U(8.W)
|
||||||
@@ -224,7 +215,7 @@ trait CDRInAxis{ this: CDRInBase =>
|
|||||||
when( io.flush ){
|
when( io.flush ){
|
||||||
checkSFD := 0.U
|
checkSFD := 0.U
|
||||||
} .otherwise{
|
} .otherwise{
|
||||||
checkSFD := Cat( checkSFD(8,0), syncSerDat )
|
checkSFD := Cat( checkSFD(8,0), io.syncSerDat )
|
||||||
}
|
}
|
||||||
|
|
||||||
io.decode.dataIn := checkSFD(9,0)
|
io.decode.dataIn := checkSFD(9,0)
|
||||||
@@ -310,7 +301,5 @@ trait CDRInAxis{ this: CDRInBase =>
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MPCDRIn extends CDRInBase
|
|
||||||
with CDRInAxis
|
|
||||||
with CDRInMultiSample
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,12 +38,8 @@ class TopBase_IO_Bundle extends Bundle{
|
|||||||
|
|
||||||
|
|
||||||
class MstSlvSwitchIO extends TopBase_IO_Bundle{
|
class MstSlvSwitchIO extends TopBase_IO_Bundle{
|
||||||
|
val downCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) )
|
||||||
val downCDROut = Flipped(new CDROutIO)
|
val upCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) )
|
||||||
val upCDROut = Flipped(new CDROutIO)
|
|
||||||
val downCDRIn = Flipped(new CDRInIO)
|
|
||||||
val upCDRIn = Flipped(new CDRInIO)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -55,6 +51,12 @@ abstract class MstSlvSwitchBase extends Module with RequireAsyncReset{
|
|||||||
|
|
||||||
val io: MstSlvSwitchIO = IO(new MstSlvSwitchIO)
|
val io: MstSlvSwitchIO = IO(new MstSlvSwitchIO)
|
||||||
|
|
||||||
|
val downCDROut = Module(new CDROut)
|
||||||
|
val upCDROut = Module(new CDROut)
|
||||||
|
|
||||||
|
val downCDRInAxis = Module(new CDRInAxis)
|
||||||
|
val upCDRInAxis = Module(new CDRInAxis)
|
||||||
|
|
||||||
val slaveParser = Module(new SlaveParser )
|
val slaveParser = Module(new SlaveParser )
|
||||||
val masterParser = Module(new MasterParser)
|
val masterParser = Module(new MasterParser)
|
||||||
|
|
||||||
@@ -68,17 +70,26 @@ abstract class MstSlvSwitchBase extends Module with RequireAsyncReset{
|
|||||||
val b8b10UpEncoder = Module(new b8b10Encode)
|
val b8b10UpEncoder = Module(new b8b10Encode)
|
||||||
val b8b10UpDecoder = Module(new b8b10Decode)
|
val b8b10UpDecoder = Module(new b8b10Decode)
|
||||||
|
|
||||||
|
|
||||||
val interface = Module(new Interface)
|
val interface = Module(new Interface)
|
||||||
|
|
||||||
|
val downInSerDat = Wire(Bool())
|
||||||
|
val downInSyncSerDat = Wire(Bool()); downCDRInAxis.io.syncSerDat := downInSyncSerDat
|
||||||
|
val upInSerDat = Wire(Bool())
|
||||||
|
val upInSyncSerDat = Wire(Bool()); upCDRInAxis.io.syncSerDat := upInSyncSerDat
|
||||||
|
|
||||||
|
dontTouch(downInSerDat)
|
||||||
|
dontTouch(downInSyncSerDat)
|
||||||
|
dontTouch(upInSerDat)
|
||||||
|
dontTouch(upInSyncSerDat)
|
||||||
|
|
||||||
interface.io.latchPin := io.latchPin
|
interface.io.latchPin := io.latchPin
|
||||||
interface.io.uniCode := io.uniCode
|
interface.io.uniCode := io.uniCode
|
||||||
interface.io.hwSerial := io.hwSerial
|
interface.io.hwSerial := io.hwSerial
|
||||||
|
|
||||||
interface.io.intTransEnd(0) := io.downCDRIn.axis.fire & io.downCDRIn.axis.bits.tlast
|
interface.io.intTransEnd(0) := downCDRInAxis.io.axis.fire & downCDRInAxis.io.axis.bits.tlast
|
||||||
interface.io.intTransEnd(1) := io.downCDROut.axis.fire & io.downCDROut.axis.bits.tlast
|
interface.io.intTransEnd(1) := downCDROut.io.axis.fire & downCDROut.io.axis.bits.tlast
|
||||||
interface.io.intTransEnd(2) := io.upCDRIn.axis.fire & io.upCDRIn.axis.bits.tlast
|
interface.io.intTransEnd(2) := upCDRInAxis.io.axis.fire & upCDRInAxis.io.axis.bits.tlast
|
||||||
interface.io.intTransEnd(3) := io.upCDROut.axis.fire & io.upCDROut.axis.bits.tlast
|
interface.io.intTransEnd(3) := upCDROut.io.axis.fire & upCDROut.io.axis.bits.tlast
|
||||||
|
|
||||||
io.isSoftReset := interface.io.isSoftReset
|
io.isSoftReset := interface.io.isSoftReset
|
||||||
io.interrupt := interface.io.interrupt
|
io.interrupt := interface.io.interrupt
|
||||||
@@ -239,24 +250,24 @@ abstract class MstSlvSwitchBase extends Module with RequireAsyncReset{
|
|||||||
slaveParser.io.sram_r(3).datar := 0.U
|
slaveParser.io.sram_r(3).datar := 0.U
|
||||||
masterParser.io.sram_r.datar := 0.U
|
masterParser.io.sram_r.datar := 0.U
|
||||||
|
|
||||||
io.downCDRIn.axis.ready := false.B
|
downCDRInAxis.io.axis.ready := false.B
|
||||||
slaveParser.io.downIn.valid := false.B
|
slaveParser.io.downIn.valid := false.B
|
||||||
slaveParser.io.downIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
slaveParser.io.downIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
||||||
|
|
||||||
slaveParser.io.downOut.ready := false.B
|
slaveParser.io.downOut.ready := false.B
|
||||||
masterParser.io.downOut.ready := false.B
|
masterParser.io.downOut.ready := false.B
|
||||||
io.downCDROut.axis.valid := false.B
|
downCDROut.io.axis.valid := false.B
|
||||||
io.downCDROut.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
downCDROut.io.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
||||||
|
|
||||||
io.upCDRIn.axis.ready := false.B
|
upCDRInAxis.io.axis.ready := false.B
|
||||||
slaveParser.io.upIn.valid := false.B
|
slaveParser.io.upIn.valid := false.B
|
||||||
slaveParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
slaveParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
||||||
masterParser.io.upIn.valid := false.B
|
masterParser.io.upIn.valid := false.B
|
||||||
masterParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
masterParser.io.upIn.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
||||||
|
|
||||||
slaveParser.io.upOut.ready := false.B
|
slaveParser.io.upOut.ready := false.B
|
||||||
io.upCDROut.axis.valid := false.B
|
upCDROut.io.axis.valid := false.B
|
||||||
io.upCDROut.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
upCDROut.io.axis.bits := 0.U.asTypeOf(new AXIS_Bundle(8))
|
||||||
|
|
||||||
interface.io.mstDeltaTime := 0.U
|
interface.io.mstDeltaTime := 0.U
|
||||||
|
|
||||||
@@ -287,8 +298,8 @@ abstract class MstSlvSwitchBase extends Module with RequireAsyncReset{
|
|||||||
trait MstSlvSwitchMaster{ this: MstSlvSwitchBase =>
|
trait MstSlvSwitchMaster{ this: MstSlvSwitchBase =>
|
||||||
|
|
||||||
when( interface.io.cReg.modeSel === true.B ){
|
when( interface.io.cReg.modeSel === true.B ){
|
||||||
masterParser.io.downOut <> io.downCDROut.axis
|
masterParser.io.downOut <> downCDROut.io.axis
|
||||||
masterParser.io.upIn <> io.upCDRIn.axis
|
masterParser.io.upIn <> upCDRInAxis.io.axis
|
||||||
}
|
}
|
||||||
|
|
||||||
when( interface.io.cReg.modeSel === true.B ){
|
when( interface.io.cReg.modeSel === true.B ){
|
||||||
@@ -355,10 +366,10 @@ trait MstSlvSwitchMaster{ this: MstSlvSwitchBase =>
|
|||||||
trait MstSlvSwitchSlave{ this: MstSlvSwitchBase =>
|
trait MstSlvSwitchSlave{ this: MstSlvSwitchBase =>
|
||||||
|
|
||||||
when( interface.io.cReg.modeSel === false.B ){
|
when( interface.io.cReg.modeSel === false.B ){
|
||||||
slaveParser.io.downIn <> io.downCDRIn.axis
|
slaveParser.io.downIn <> downCDRInAxis.io.axis
|
||||||
io.downCDROut.axis <> slaveParser.io.downOut
|
downCDROut.io.axis <> slaveParser.io.downOut
|
||||||
slaveParser.io.upIn <> io.upCDRIn.axis
|
slaveParser.io.upIn <> upCDRInAxis.io.axis
|
||||||
io.upCDROut.axis <> slaveParser.io.upOut
|
upCDROut.io.axis <> slaveParser.io.upOut
|
||||||
}
|
}
|
||||||
|
|
||||||
slaveParser.io.cReg := interface.io.cReg
|
slaveParser.io.cReg := interface.io.cReg
|
||||||
@@ -419,10 +430,10 @@ trait MstSlvSwitchSlave{ this: MstSlvSwitchBase =>
|
|||||||
|
|
||||||
slaveParser.io.intHWClr(0) := interface.io.intHWTrig(0) & interface.io.intHWClr(0)
|
slaveParser.io.intHWClr(0) := interface.io.intHWTrig(0) & interface.io.intHWClr(0)
|
||||||
slaveParser.io.intHWClr(1) := interface.io.intHWTrig(1) & interface.io.intHWClr(1)
|
slaveParser.io.intHWClr(1) := interface.io.intHWTrig(1) & interface.io.intHWClr(1)
|
||||||
io.downCDRIn.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B )
|
downCDRInAxis.io.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B )
|
||||||
io.upCDRIn.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B )
|
upCDRInAxis.io.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B )
|
||||||
io.downCDROut.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B )
|
downCDROut.io.flush := RegNext( interface.io.intHWTrig(0) & interface.io.intHWClr(0), false.B )
|
||||||
io.upCDROut.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B )
|
upCDROut.io.flush := RegNext( interface.io.intHWTrig(1) & interface.io.intHWClr(1), false.B )
|
||||||
|
|
||||||
interface.io.lvds <> slaveParser.io.lvds
|
interface.io.lvds <> slaveParser.io.lvds
|
||||||
|
|
||||||
@@ -475,11 +486,11 @@ trait MstSlvSwitchWatchDog{ this: MstSlvSwitchBase =>
|
|||||||
val wdtRec2RtnCnt = RegInit(0.U(32.W))
|
val wdtRec2RtnCnt = RegInit(0.U(32.W))
|
||||||
|
|
||||||
when(
|
when(
|
||||||
(io.upCDRIn.axis.fire & io.upCDRIn.axis.bits.tlast) |
|
(upCDRInAxis.io.axis.fire & upCDRInAxis.io.axis.bits.tlast) |
|
||||||
~interface.io.cReg.wdtEnable.extract(0)
|
~interface.io.cReg.wdtEnable.extract(0)
|
||||||
){
|
){
|
||||||
isWdtRec2RtnEnable := false.B
|
isWdtRec2RtnEnable := false.B
|
||||||
} .elsewhen( ~isWdtRec2RtnEnable & io.downCDROut.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){
|
} .elsewhen( ~isWdtRec2RtnEnable & downCDROut.io.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){
|
||||||
isWdtRec2RtnEnable := true.B
|
isWdtRec2RtnEnable := true.B
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -500,7 +511,7 @@ trait MstSlvSwitchWatchDog{ this: MstSlvSwitchBase =>
|
|||||||
wdtRec2RecCnt := wdtRec2RecCnt + 1.U
|
wdtRec2RecCnt := wdtRec2RecCnt + 1.U
|
||||||
} .elsewhen(
|
} .elsewhen(
|
||||||
~interface.io.cReg.wdtEnable.extract(17) ||
|
~interface.io.cReg.wdtEnable.extract(17) ||
|
||||||
io.downCDRIn.axis.fire ||
|
downCDRInAxis.io.axis.fire ||
|
||||||
(wdtRec2RecCnt >= interface.io.cReg.wdtTarCnt(17))
|
(wdtRec2RecCnt >= interface.io.cReg.wdtTarCnt(17))
|
||||||
){
|
){
|
||||||
wdtRec2RecCnt := 0.U
|
wdtRec2RecCnt := 0.U
|
||||||
@@ -516,8 +527,8 @@ trait MstSlvSwitchDataPath{ this: MstSlvSwitchBase =>
|
|||||||
when( ~isDwUpEx ){ //未交叉
|
when( ~isDwUpEx ){ //未交叉
|
||||||
when( interface.io.cReg.modeSel === false.B ){ //slave
|
when( interface.io.cReg.modeSel === false.B ){ //slave
|
||||||
when( (slaveParser.io.intHWTrig(0) | slaveParser.io.intHWTrig(1)) | interface.io.isPoReset ){ //硬件错误
|
when( (slaveParser.io.intHWTrig(0) | slaveParser.io.intHWTrig(1)) | interface.io.isPoReset ){ //硬件错误
|
||||||
io.downCDRIn.serDat := false.B
|
downInSerDat := false.B
|
||||||
io.upCDRIn.serDat := false.B
|
upInSerDat := false.B
|
||||||
when( slaveParser.io.isLoop ){ //回环
|
when( slaveParser.io.isLoop ){ //回环
|
||||||
io.dDatOut := false.B
|
io.dDatOut := false.B
|
||||||
io.uDatOut := io.dDatIn
|
io.uDatOut := io.dDatIn
|
||||||
@@ -527,21 +538,21 @@ trait MstSlvSwitchDataPath{ this: MstSlvSwitchBase =>
|
|||||||
}
|
}
|
||||||
} .otherwise{ //无硬件错误
|
} .otherwise{ //无硬件错误
|
||||||
when( slaveParser.io.isLoop ){ //回环
|
when( slaveParser.io.isLoop ){ //回环
|
||||||
io.downCDRIn.serDat := io.dDatIn
|
downInSerDat := io.dDatIn
|
||||||
io.upCDRIn.serDat := io.downCDROut.serDat
|
upInSerDat := downCDROut.io.serDat
|
||||||
io.dDatOut := false.B
|
io.dDatOut := false.B
|
||||||
io.uDatOut := io.upCDROut.serDat
|
io.uDatOut := upCDROut.io.serDat
|
||||||
} .otherwise{ //非回环
|
} .otherwise{ //非回环
|
||||||
io.downCDRIn.serDat := io.dDatIn
|
downInSerDat := io.dDatIn
|
||||||
io.upCDRIn.serDat := io.uDatIn
|
upInSerDat := io.uDatIn
|
||||||
io.dDatOut := io.downCDROut.serDat
|
io.dDatOut := downCDROut.io.serDat
|
||||||
io.uDatOut := io.upCDROut.serDat
|
io.uDatOut := upCDROut.io.serDat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} .otherwise{ //master
|
} .otherwise{ //master
|
||||||
io.downCDRIn.serDat := false.B
|
downInSerDat := false.B
|
||||||
io.upCDRIn.serDat := io.uDatIn
|
upInSerDat := io.uDatIn
|
||||||
io.dDatOut := io.downCDROut.serDat
|
io.dDatOut := downCDROut.io.serDat
|
||||||
io.uDatOut := false.B
|
io.uDatOut := false.B
|
||||||
}
|
}
|
||||||
} .otherwise{ //交叉
|
} .otherwise{ //交叉
|
||||||
@@ -551,31 +562,31 @@ trait MstSlvSwitchDataPath{ this: MstSlvSwitchBase =>
|
|||||||
when( slaveParser.io.isLoop ){ //回环
|
when( slaveParser.io.isLoop ){ //回环
|
||||||
io.dDatOut := io.uDatIn
|
io.dDatOut := io.uDatIn
|
||||||
io.uDatOut := false.B
|
io.uDatOut := false.B
|
||||||
io.downCDRIn.serDat := false.B
|
downInSerDat := false.B
|
||||||
io.upCDRIn.serDat := false.B
|
upInSerDat := false.B
|
||||||
} .otherwise{ //非回环
|
} .otherwise{ //非回环
|
||||||
io.dDatOut := io.dDatIn
|
io.dDatOut := io.dDatIn
|
||||||
io.uDatOut := io.uDatIn
|
io.uDatOut := io.uDatIn
|
||||||
io.downCDRIn.serDat := false.B
|
downInSerDat := false.B
|
||||||
io.upCDRIn.serDat := false.B
|
upInSerDat := false.B
|
||||||
}
|
}
|
||||||
} .otherwise{ //无硬件错误
|
} .otherwise{ //无硬件错误
|
||||||
when( slaveParser.io.isLoop ){ //回环
|
when( slaveParser.io.isLoop ){ //回环
|
||||||
io.downCDRIn.serDat := io.uDatIn
|
downInSerDat := io.uDatIn
|
||||||
io.upCDRIn.serDat := io.downCDROut.serDat
|
upInSerDat := downCDROut.io.serDat
|
||||||
io.uDatOut := false.B
|
io.uDatOut := false.B
|
||||||
io.dDatOut := io.upCDROut.serDat
|
io.dDatOut := upCDROut.io.serDat
|
||||||
} .otherwise{ //非回环
|
} .otherwise{ //非回环
|
||||||
io.downCDRIn.serDat := io.uDatIn
|
downInSerDat := io.uDatIn
|
||||||
io.upCDRIn.serDat := io.dDatIn
|
upInSerDat := io.dDatIn
|
||||||
io.dDatOut := io.upCDROut.serDat
|
io.dDatOut := upCDROut.io.serDat
|
||||||
io.uDatOut := io.downCDROut.serDat
|
io.uDatOut := downCDROut.io.serDat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} .otherwise{ //master
|
} .otherwise{ //master
|
||||||
io.downCDRIn.serDat := false.B
|
downInSerDat := false.B
|
||||||
io.upCDRIn.serDat := io.dDatIn
|
upInSerDat := io.dDatIn
|
||||||
io.uDatOut := io.downCDROut.serDat
|
io.uDatOut := downCDROut.io.serDat
|
||||||
io.dDatOut := false.B
|
io.dDatOut := false.B
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -585,10 +596,10 @@ trait MstSlvSwitchB8B4{ this: MstSlvSwitchBase =>
|
|||||||
val isUsing8b10b = interface.io.cReg.b8b4Sel.extract(0)
|
val isUsing8b10b = interface.io.cReg.b8b4Sel.extract(0)
|
||||||
|
|
||||||
when( isUsing8b10b ){
|
when( isUsing8b10b ){
|
||||||
b8b10DownEncoder.io <> io.downCDROut.encode
|
b8b10DownEncoder.io <> downCDROut.io.encode
|
||||||
b8b10DownDecoder.io <> io.downCDRIn.decode
|
b8b10DownDecoder.io <> downCDRInAxis.io.decode
|
||||||
b8b10UpEncoder.io <> io.upCDROut.encode
|
b8b10UpEncoder.io <> upCDROut.io.encode
|
||||||
b8b10UpDecoder.io <> io.upCDRIn.decode
|
b8b10UpDecoder.io <> upCDRInAxis.io.decode
|
||||||
|
|
||||||
b4b5DownEncoder.io.isEnable := false.B
|
b4b5DownEncoder.io.isEnable := false.B
|
||||||
b4b5DownEncoder.io.dataIn := 0.U
|
b4b5DownEncoder.io.dataIn := 0.U
|
||||||
@@ -597,10 +608,10 @@ trait MstSlvSwitchB8B4{ this: MstSlvSwitchBase =>
|
|||||||
b4b5UpEncoder.io.dataIn := 0.U
|
b4b5UpEncoder.io.dataIn := 0.U
|
||||||
b4b5UpDecoder.io.dataIn := 0.U
|
b4b5UpDecoder.io.dataIn := 0.U
|
||||||
} .otherwise{
|
} .otherwise{
|
||||||
b4b5DownEncoder.io <> io.downCDROut.encode
|
b4b5DownEncoder.io <> downCDROut.io.encode
|
||||||
b4b5DownDecoder.io <> io.downCDRIn.decode
|
b4b5DownDecoder.io <> downCDRInAxis.io.decode
|
||||||
b4b5UpEncoder.io <> io.upCDROut.encode
|
b4b5UpEncoder.io <> upCDROut.io.encode
|
||||||
b4b5UpDecoder.io <> io.upCDRIn.decode
|
b4b5UpDecoder.io <> upCDRInAxis.io.decode
|
||||||
|
|
||||||
b8b10DownEncoder.io.isEnable := false.B
|
b8b10DownEncoder.io.isEnable := false.B
|
||||||
b8b10DownEncoder.io.dataIn := 0.U
|
b8b10DownEncoder.io.dataIn := 0.U
|
||||||
@@ -615,6 +626,47 @@ trait MstSlvSwitchCDRIn{ this: MstSlvSwitchBase =>
|
|||||||
val cdrSelB = interface.io.cReg.cdrParam === 1.U
|
val cdrSelB = interface.io.cReg.cdrParam === 1.U
|
||||||
val cdrSelC = interface.io.cReg.cdrParam === 2.U
|
val cdrSelC = interface.io.cReg.cdrParam === 2.U
|
||||||
val cdrSelA = ~cdrSelB & ~cdrSelC
|
val cdrSelA = ~cdrSelB & ~cdrSelC
|
||||||
|
|
||||||
|
// val downCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) )
|
||||||
|
// val upCDRSampleIn = Vec(3, Flipped(new CDRInSampleIO) )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
when(cdrSelB){
|
||||||
|
io.downCDRSampleIn(1).serDat := downInSerDat
|
||||||
|
io.upCDRSampleIn(1).serDat := downInSerDat
|
||||||
|
downInSyncSerDat := io.downCDRSampleIn(1).syncSerDat
|
||||||
|
upInSyncSerDat := io.upCDRSampleIn(1).syncSerDat
|
||||||
|
|
||||||
|
io.downCDRSampleIn(0).serDat := false.B
|
||||||
|
io.upCDRSampleIn(0).serDat := false.B
|
||||||
|
io.downCDRSampleIn(2).serDat := false.B
|
||||||
|
io.upCDRSampleIn(2).serDat := false.B
|
||||||
|
} .elsewhen(cdrSelC){
|
||||||
|
io.downCDRSampleIn(2).serDat := downInSerDat
|
||||||
|
io.upCDRSampleIn(2).serDat := downInSerDat
|
||||||
|
downInSyncSerDat := io.downCDRSampleIn(2).syncSerDat
|
||||||
|
upInSyncSerDat := io.upCDRSampleIn(2).syncSerDat
|
||||||
|
|
||||||
|
io.downCDRSampleIn(0).serDat := false.B
|
||||||
|
io.upCDRSampleIn(0).serDat := false.B
|
||||||
|
io.downCDRSampleIn(1).serDat := false.B
|
||||||
|
io.upCDRSampleIn(1).serDat := false.B
|
||||||
|
} .otherwise{
|
||||||
|
io.downCDRSampleIn(0).serDat := downInSerDat
|
||||||
|
io.upCDRSampleIn(0).serDat := downInSerDat
|
||||||
|
downInSyncSerDat := io.downCDRSampleIn(0).syncSerDat
|
||||||
|
upInSyncSerDat := io.upCDRSampleIn(0).syncSerDat
|
||||||
|
|
||||||
|
io.downCDRSampleIn(1).serDat := false.B
|
||||||
|
io.upCDRSampleIn(1).serDat := false.B
|
||||||
|
io.downCDRSampleIn(2).serDat := false.B
|
||||||
|
io.upCDRSampleIn(2).serDat := false.B
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MstSlvSwitch extends MstSlvSwitchBase
|
class MstSlvSwitch extends MstSlvSwitchBase
|
||||||
|
|||||||
@@ -14,22 +14,42 @@ class ShinTop extends Module with RequireAsyncReset{
|
|||||||
val io: ShinTopIO = IO(new ShinTopIO)
|
val io: ShinTopIO = IO(new ShinTopIO)
|
||||||
|
|
||||||
val mstSlvSwitch = Module(new MstSlvSwitch)
|
val mstSlvSwitch = Module(new MstSlvSwitch)
|
||||||
val downCDROut = Module(new CDROut)
|
|
||||||
val upCDROut = Module(new CDROut)
|
|
||||||
|
|
||||||
val downCDRIn = Module(new MPCDRIn)
|
|
||||||
val upCDRIn = Module(new MPCDRIn)
|
|
||||||
|
|
||||||
|
|
||||||
downCDRIn.multiCLK := io.multiCLK
|
|
||||||
upCDRIn.multiCLK := io.multiCLK
|
|
||||||
|
|
||||||
|
{
|
||||||
|
val downCDRInSampleA = Module(new CDRInMultiSample)
|
||||||
|
val upCDRInSampleA = Module(new CDRInMultiSample)
|
||||||
|
|
||||||
downCDROut.io <> mstSlvSwitch.io.downCDROut
|
downCDRInSampleA.multiCLK := io.multiCLK
|
||||||
upCDROut.io <> mstSlvSwitch.io.upCDROut
|
upCDRInSampleA.multiCLK := io.multiCLK
|
||||||
|
|
||||||
|
downCDRInSampleA.io <> mstSlvSwitch.io.downCDRSampleIn(0)
|
||||||
|
upCDRInSampleA.io <> mstSlvSwitch.io.upCDRSampleIn(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val downCDRInSampleB = Module(new CDRInMultiSample)
|
||||||
|
val upCDRInSampleB = Module(new CDRInMultiSample)
|
||||||
|
|
||||||
|
downCDRInSampleB.multiCLK := io.multiCLK
|
||||||
|
upCDRInSampleB.multiCLK := io.multiCLK
|
||||||
|
|
||||||
|
downCDRInSampleB.io <> mstSlvSwitch.io.downCDRSampleIn(1)
|
||||||
|
upCDRInSampleB.io <> mstSlvSwitch.io.upCDRSampleIn(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
val downCDRInSampleC = Module(new CDRInMultiSample)
|
||||||
|
val upCDRInSampleC = Module(new CDRInMultiSample)
|
||||||
|
|
||||||
|
downCDRInSampleC.multiCLK := io.multiCLK
|
||||||
|
upCDRInSampleC.multiCLK := io.multiCLK
|
||||||
|
|
||||||
|
downCDRInSampleC.io <> mstSlvSwitch.io.downCDRSampleIn(2)
|
||||||
|
upCDRInSampleC.io <> mstSlvSwitch.io.upCDRSampleIn(2)
|
||||||
|
}
|
||||||
|
|
||||||
downCDRIn.io <> mstSlvSwitch.io.downCDRIn
|
|
||||||
upCDRIn.io <> mstSlvSwitch.io.upCDRIn
|
|
||||||
|
|
||||||
|
|
||||||
io.viewAsSupertype(new TopBase_IO_Bundle) <> mstSlvSwitch.io.viewAsSupertype(new TopBase_IO_Bundle)
|
io.viewAsSupertype(new TopBase_IO_Bundle) <> mstSlvSwitch.io.viewAsSupertype(new TopBase_IO_Bundle)
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ class SimCDR extends Module with RequireAsyncReset{
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
val cdrIn = Module(new MPCDRIn)
|
val cdrInAxis = Module(new CDRInAxis)
|
||||||
|
val cdrInSample = Module(new CDRInMultiSample)
|
||||||
|
|
||||||
val cdrOut = Module(new CDROut)
|
val cdrOut = Module(new CDROut)
|
||||||
val record = Module( new Queue(UInt(8.W), 256) )
|
val record = Module( new Queue(UInt(8.W), 256) )
|
||||||
|
|
||||||
@@ -52,11 +54,14 @@ class SimCDR extends Module with RequireAsyncReset{
|
|||||||
|
|
||||||
cdrOut.io.flush := io.flush
|
cdrOut.io.flush := io.flush
|
||||||
|
|
||||||
cdrIn.clock := io.multiCLK(0).asClock
|
cdrInAxis.clock := io.multiCLK(0).asClock
|
||||||
cdrIn.io.flush := io.flush
|
cdrInSample.clock := io.multiCLK(0).asClock
|
||||||
cdrIn.multiCLK := io.multiCLK
|
cdrInAxis.io.flush := io.flush
|
||||||
|
cdrInSample.multiCLK := io.multiCLK
|
||||||
|
cdrInAxis.io.syncSerDat := cdrInSample.io.syncSerDat
|
||||||
|
|
||||||
cdrIn.io.serDat := cdrOut.io.serDat
|
|
||||||
|
cdrInSample.io.serDat := cdrOut.io.serDat
|
||||||
|
|
||||||
assert( ~(record.io.enq.valid & ~record.io.enq.ready), "Assert Failed, Warning, fifo overflow!\n" )
|
assert( ~(record.io.enq.valid & ~record.io.enq.ready), "Assert Failed, Warning, fifo overflow!\n" )
|
||||||
assert( ~(~record.io.deq.valid & record.io.deq.ready), "Assert Failed, Warning, fifo underflow!\n" )
|
assert( ~(~record.io.deq.valid & record.io.deq.ready), "Assert Failed, Warning, fifo underflow!\n" )
|
||||||
@@ -73,11 +78,11 @@ class SimCDR extends Module with RequireAsyncReset{
|
|||||||
record.io.enq.valid := cdrOut.io.axis.fire
|
record.io.enq.valid := cdrOut.io.axis.fire
|
||||||
record.io.enq.bits := io.data
|
record.io.enq.bits := io.data
|
||||||
|
|
||||||
record.io.deq.ready := cdrIn.io.axis.fire
|
record.io.deq.ready := cdrInAxis.io.axis.fire
|
||||||
cdrIn.io.axis.ready := true.B
|
cdrInAxis.io.axis.ready := true.B
|
||||||
|
|
||||||
io.isFailed := cdrIn.io.axis.fire & (record.io.deq.bits =/= cdrIn.io.axis.bits.tdata)
|
io.isFailed := cdrInAxis.io.axis.fire & (record.io.deq.bits =/= cdrInAxis.io.axis.bits.tdata)
|
||||||
io.isSuccess := cdrIn.io.axis.fire & cdrIn.io.axis.bits.tlast
|
io.isSuccess := cdrInAxis.io.axis.fire & cdrInAxis.io.axis.bits.tlast
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -87,14 +92,14 @@ class SimCDR extends Module with RequireAsyncReset{
|
|||||||
|
|
||||||
when( isUsing8b10b ){
|
when( isUsing8b10b ){
|
||||||
b8b10Encoder.io <> cdrOut.io.encode
|
b8b10Encoder.io <> cdrOut.io.encode
|
||||||
b8b10Decoder.io <> cdrIn.io.decode
|
b8b10Decoder.io <> cdrInAxis.io.decode
|
||||||
|
|
||||||
b4b5Encoder.io.isEnable := false.B
|
b4b5Encoder.io.isEnable := false.B
|
||||||
b4b5Encoder.io.dataIn := 0.U
|
b4b5Encoder.io.dataIn := 0.U
|
||||||
b4b5Decoder.io.dataIn := 0.U
|
b4b5Decoder.io.dataIn := 0.U
|
||||||
} .otherwise{
|
} .otherwise{
|
||||||
b4b5Encoder.io <> cdrOut.io.encode
|
b4b5Encoder.io <> cdrOut.io.encode
|
||||||
b4b5Decoder.io <> cdrIn.io.decode
|
b4b5Decoder.io <> cdrInAxis.io.decode
|
||||||
|
|
||||||
b8b10Encoder.io.isEnable := false.B
|
b8b10Encoder.io.isEnable := false.B
|
||||||
b8b10Encoder.io.dataIn := 0.U
|
b8b10Encoder.io.dataIn := 0.U
|
||||||
|
|||||||
Reference in New Issue
Block a user