test pass

This commit is contained in:
RuigeLee
2023-09-14 19:16:17 +08:00
parent 6fd836fc9c
commit b098ca963e
6 changed files with 466 additions and 255 deletions

View File

@@ -95,6 +95,11 @@ class BackBoardMstBase extends Module{ //10M
mirrorUp.io.clockw := io.oser_pclk.asBool
mirrorUp.io.clockr := io.oser_pclk.asBool
io.cdrErr := statusCDRErr
io.crcErr := statusCRCErr
io.linkErr := statusLinkErr
}
@@ -144,10 +149,10 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase =>
( activeAddr === 1.U) ->
Cat(
ctrlTransmit,
ctrlCDRErr ,
ctrlCRCErr ,
ctrlLinkErr ,
ctrlSynch ,
0.U(1.W),
0.U(1.W),
0.U(1.W),
ctrlSynch,
ctrlInit
),
( activeAddr === 2.U) -> slvNum,
@@ -162,9 +167,17 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase =>
when( (~fsmcCEnSync & isAccessReg & (~fsmcWEnSync) ) & ( activeAddr === 1.U) ){
ctrlTransmit := fsmcdataInSync.extract(5)
ctrlCDRErr := fsmcdataInSync.extract(4)
ctrlCRCErr := fsmcdataInSync.extract(3)
ctrlLinkErr := fsmcdataInSync.extract(2)
when( fsmcdataInSync.extract(4) ){
statusCDRErr := false.B
}
when( fsmcdataInSync.extract(3) ){
statusCRCErr := false.B
}
when( fsmcdataInSync.extract(2) ){
statusLinkErr := false.B
}
ctrlSynch := fsmcdataInSync.extract(1)
ctrlInit := fsmcdataInSync.extract(0)
}
@@ -202,135 +215,139 @@ trait BackBoardMstLVDSInitialization{ this: BackBoardMstLVDSBase =>
val ( _, isInitTimeout ) = Counter(Range( 0,5200), ctrlInit, isInitCntReset)
val synchCnt = Reg(UInt(3.W))
when( isInitTimeout ){
stateCur := 0.U
when(ctrlInit){
when( isInitTimeout ){
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
stateCur := 0.U
tx_start := false.B
} .elsewhen( stateCur === 0.U ){
stateCur := 1.U
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
frame_info_update_en := true.B
slave_type_num := Cat( "b00".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
tx_start := false.B
} .elsewhen( stateCur === 0.U ){
stateCur := 1.U
tx_start := false.B
} .elsewhen( stateCur === 1.U ){ // tx start
stateCur := 2.U
frame_info_update_en := true.B
slave_type_num := Cat( "b00".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
frame_info_update_en := false.B
tx_start := true.B
tx_start := false.B
} .elsewhen( stateCur === 1.U ){ // tx start
stateCur := 2.U
} .elsewhen( stateCur === 2.U ){
frame_info_update_en := false.B
tx_start := true.B
tx_start := false.B
} .elsewhen( stateCur === 2.U ){
when( lvdsMst.io.slave_link_num_valid ){
slvNum := lvdsMst.io.slave_link_num(5,0)
stateCur := 3.U
}
tx_start := false.B
} .elsewhen( stateCur === 3.U ){
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
tx_start := false.B
stateCur := 4.U
} .elsewhen( stateCur === 4.U ){
stateCur := 5.U
frame_info_update_en := true.B
slave_type_num := Cat( "b00".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
tx_start := false.B
} .elsewhen( stateCur === 5.U ){ // tx start
stateCur := 6.U
frame_info_update_en := false.B
tx_start := true.B
} .elsewhen( stateCur === 6.U ){
tx_start := false.B
when( lvdsMst.io.slave_link_num_valid ){
when( slvNum === lvdsMst.io.slave_link_num(5,0) ){
stateCur := 7.U
} .otherwise{
printf("Initialization failed, waitting for timeout!\n")
when( lvdsMst.io.slave_link_num_valid ){
slvNum := lvdsMst.io.slave_link_num - 1.U
stateCur := 3.U
}
}
} .elsewhen( stateCur === 7.U ){
when( ctrlSynch ){
stateCur := 8.U
synchCnt := 0.U
} .otherwise{
} .elsewhen( stateCur === 3.U ){
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
tx_start := false.B
stateCur := 4.U
} .elsewhen( stateCur === 4.U ){
stateCur := 5.U
frame_info_update_en := true.B
slave_type_num := Cat( "b00".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
tx_start := false.B
} .elsewhen( stateCur === 5.U ){ // tx start
stateCur := 6.U
frame_info_update_en := false.B
tx_start := true.B
} .elsewhen( stateCur === 6.U ){
tx_start := false.B
when( lvdsMst.io.slave_link_num_valid ){
when( slvNum === lvdsMst.io.slave_link_num - 1.U ){
stateCur := 7.U
} .otherwise{
printf("Initialization failed, waitting for timeout!\n")
}
}
} .elsewhen( stateCur === 7.U ){
when( ctrlSynch ){
stateCur := 8.U
synchCnt := 0.U
} .otherwise{
statusInit := true.B
ctrlInit := false.B
}
} .elsewhen( stateCur === 8.U ){ //synch
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
tx_start := false.B
stateCur := 9.U
} .elsewhen( stateCur === 9.U ){
stateCur := 10.U
frame_info_update_en := true.B
slave_type_num := Cat( "b01".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
tx_start := false.B
} .elsewhen( stateCur === 10.U ){ // tx start
stateCur := 11.U
frame_info_update_en := false.B
tx_start := true.B
} .elsewhen( stateCur === 11.U ){
tx_start := false.B
when( RegNext(lvdsMst.io.downstream_busy, false.B) & ~lvdsMst.io.downstream_busy ){
stateCur := 12.U
synchCnt := synchCnt + 1.U
}
} .elsewhen( stateCur === 12.U ){
when( synchCnt === 4.U ){
stateCur := 13.U
} .otherwise{
stateCur := 8.U
}
} .elsewhen( stateCur === 13.U ){
statusSynch := true.B
statusInit := true.B
ctrlSynch := false.B
ctrlInit := false.B
} .elsewhen( stateCur === 15.U ){
}
.otherwise{
} .elsewhen( stateCur === 8.U ){ //synch
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
tx_start := false.B
stateCur := 9.U
} .elsewhen( stateCur === 9.U ){
stateCur := 10.U
frame_info_update_en := true.B
slave_type_num := Cat( "b01".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
tx_start := false.B
} .elsewhen( stateCur === 10.U ){ // tx start
stateCur := 11.U
frame_info_update_en := false.B
tx_start := true.B
} .elsewhen( stateCur === 11.U ){
tx_start := false.B
when( RegNext(lvdsMst.io.downstream_busy, false.B) & ~lvdsMst.io.downstream_busy ){
stateCur := 12.U
synchCnt := synchCnt + 1.U
}
} .elsewhen( stateCur === 12.U ){
when( synchCnt === 4.U ){
stateCur := 13.U
} .otherwise{
stateCur := 8.U
}
} .elsewhen( stateCur === 12.U ){
statusSynch := true.B
statusInit := true.B
ctrlSynch := false.B
ctrlInit := false.B
} .elsewhen( stateCur === 15.U ){
}
.otherwise{
assert(false.B)
}
}
@@ -340,67 +357,68 @@ trait BackBoardMstLVDSTransmit{ this: BackBoardMstLVDSBase =>
val ( _, trigger ) = Counter(Range( 0,1000), ctrlTransmit )
when(ctrlTransmit){
when( trigger ){ //reset
stateCur := 0.U
when( trigger ){ //reset
stateCur := 0.U
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
tx_start := false.B
tx_start := false.B
} .elsewhen( stateCur === 0.U ){ //setting
stateCur := 1.U
} .elsewhen( stateCur === 0.U ){ //setting
stateCur := 1.U
frame_info_update_en := true.B
slave_type_num := Cat( "b10".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
frame_info_update_en := true.B
slave_type_num := Cat( "b10".U(2.W), slvNum )
slave_data_length := ((8/8)*16-1).U
tx_start := false.B
} .elsewhen( stateCur === 1.U ){ // tx start
stateCur := 2.U
tx_start := false.B
} .elsewhen( stateCur === 1.U ){ // tx start
stateCur := 2.U
frame_info_update_en := false.B
tx_start := true.B
frame_info_update_en := false.B
tx_start := true.B
} .elsewhen( stateCur === 2.U ){ //waiting for busy drop
} .elsewhen( stateCur === 2.U ){ //waiting for busy drop
tx_start := false.B
tx_start := false.B
when( RegNext(lvdsMst.io.downstream_busy, false.B) & ~lvdsMst.io.downstream_busy ){
stateCur := 3.U
}
} .elsewhen( stateCur === 3.U ){
} .otherwise{
when( RegNext(lvdsMst.io.downstream_busy, false.B) & ~lvdsMst.io.downstream_busy ){
stateCur := 3.U
}
} .elsewhen( stateCur === 3.U ){
} .otherwise{
assert(false.B)
}
val addrr = RegInit(0.U(10.W))
val addrw = RegInit(0.U(10.W))
when( trigger ){
addrw := 0.U
} .elsewhen( lvdsMst.io.rx_data_valid & ~isSync){
} .elsewhen( lvdsMst.io.rx_data_valid & ctrlTransmit){
assert( (stateCur === 2.U) || (stateCur === 3.U) )
addrw := addrw + 1.U
}
when( trigger ){
addrr := 0.U
} .elsewhen( lvdsMst.io.tx_data_ready & ~isSync){
} .elsewhen( lvdsMst.io.tx_data_ready & ctrlTransmit){
addrr := addrr + 1.U
}
mirrorDown.io.enr := (stateCur === 1.U || stateCur === 2.U) & ~isSync
mirrorDown.io.enr := (stateCur === 1.U || stateCur === 2.U) & ctrlTransmit
lvdsMst.io.tx_data_in := mirrorDown.io.datar
mirrorDown.io.addrr := addrr
mirrorUp.io.enw := lvdsMst.io.rx_data_valid & ~isSync
mirrorUp.io.enw := lvdsMst.io.rx_data_valid & ctrlTransmit
mirrorUp.io.dataw := lvdsMst.io.rx_data_out
mirrorUp.io.addrw := addrw
@@ -409,7 +427,7 @@ trait BackBoardMstLVDSTransmit{ this: BackBoardMstLVDSBase =>
trait BackBoardMstLVDSError{ this: BackBoardMstLVDSBase =>
when( lvdsMst.io.closed_loop_err ){
slvOffLine := lvdsMst.io.link_err_location(5,0)
statuslinkErr := true.B
statusLinkErr := true.B
statusSynch := false.B
statusInit := false.B
}
@@ -419,7 +437,7 @@ trait BackBoardMstLVDSError{ this: BackBoardMstLVDSBase =>
ctrlTransmit := false.B
}
when( lvdsMst.io.upstream_crc_valid & upstream_crc_err ){
when( lvdsMst.io.upstream_crc_valid & lvdsMst.io.upstream_crc_err ){
statusCRCErr := true.B
ctrlTransmit := false.B
}