拆分CDRIn为采样部分和axis部分;调整层次结构,仅将cdrInSample放在顶层;放置3组CDRInSample,使用寄存器选择

This commit is contained in:
RuigeLee
2025-09-06 11:07:41 +08:00
parent ac118289b2
commit ff7aba38ad
4 changed files with 179 additions and 113 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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