锁定后,每16个cycle ,或许有bug

This commit is contained in:
Ruige Lee
2025-08-20 19:08:51 +08:00
parent 0291d445ca
commit 6d8edfd6ce

View File

@@ -67,6 +67,7 @@ trait CDRInOverSample{ this: CDRInBase =>
trait CDRInMultiSample{ this: CDRInBase => trait CDRInMultiSample{ this: CDRInBase =>
val clkNum: Int = 16 val clkNum: Int = 16
require( clkNum == 16 )
//multiCLK 需要按照滞后相位接线即0为最先到达1次先 //multiCLK 需要按照滞后相位接线即0为最先到达1次先
@@ -111,7 +112,8 @@ trait CDRInMultiSample{ this: CDRInBase =>
} }
val clearCnt = Reg(UInt(4.W)) val clearCnt = Reg(UInt(4.W))
val arbLock = Reg(UInt( clkNum.W )) val checkCnt = Reg(UInt(4.W))
val arbLock = Reg(UInt( (log2Ceil(clkNum)+1).W ))
val isLock = RegInit(false.B) val isLock = RegInit(false.B)
when( sampleReg.reduce(_|_) === false.B ){ when( sampleReg.reduce(_|_) === false.B ){
@@ -122,13 +124,36 @@ trait CDRInMultiSample{ this: CDRInBase =>
clearCnt := 0.U clearCnt := 0.U
} }
when( sampleReg.reduce(_|_) === false.B ){
checkCnt := 0.U
} .otherwise{
checkCnt := checkCnt + 1.U
}
//优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的
for( i <- 0 + 4 until clkNum + 4 ){
val j = clkNum + 4 - i -1
val diff = Wire(UInt( (log2Ceil(clkNum)).W ))
diff := arbLock - j.U
when( flitReg(j) ^ flitReg(j+1) ){
when( ~isLock ){
arbLock := j.U
isLock := true.B
} .elsewhen( checkCnt.andR ){ //锁定之后只允许每16cycle移动一相位
when( diff > 8.U ){
arbLock := arbLock + 1.U
} .elsewhen( diff < 8.U ){
arbLock := arbLock - 1.U
}
}
}
}
when( ~isLock ){ when( ~isLock ){
for( i <- 0 until clkNum ){ for( i <- 0 until clkNum ){
val j = clkNum - i -1 val j = clkNum - i -1
when( flitReg(j) ^ flitReg(j+1) ){ when( flitReg(j) ^ flitReg(j+1) ){
arbLock := "b1".U(clkNum.W) << j
isLock := true.B isLock := true.B
} }
} }
@@ -139,8 +164,8 @@ trait CDRInMultiSample{ this: CDRInBase =>
val asyncSerDat = val asyncSerDat =
Mux1H( Mux1H(
(for { i <- 0 until clkNum } yield { (for { i <- 4 until clkNum+4 } yield {
(arbLock === (1.U << i)) -> flitReg(i+(clkNum/2)) (arbLock === i.U) -> flitReg(i+(clkNum/2))
}) })
) )