test pass
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user