Skip to content

Commit aea5de3

Browse files
update logphy
1 parent 1a31e02 commit aea5de3

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed

src/main/scala/logphy/LinkTrainingFSM.scala

+27-1
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,32 @@ class LinkTrainingFSM(
118118
rdiBringup.io.rdiIO <> io.rdi.rdiBringupIO
119119
rdiBringup.io.sbTrainIO.msgReq.nodeq()
120120
rdiBringup.io.sbTrainIO.msgReqStatus.noenq()
121+
val plStateStatus = WireInit(rdiBringup.io.rdiIO.plStateStatus)
121122

122123
// TODO: incorporate lpstatereq
123-
currentState := nextState
124+
currentState := PriorityMux(
125+
Seq(
126+
(rdiBringup.io.rdiIO.plStateStatus === PhyState.reset, nextState),
127+
(
128+
rdiBringup.io.rdiIO.plStateStatus === PhyState.active,
129+
LinkTrainingState.active,
130+
),
131+
(
132+
rdiBringup.io.rdiIO.plStateStatus === PhyState.retrain,
133+
LinkTrainingState.retrain,
134+
),
135+
(
136+
rdiBringup.io.rdiIO.plStateStatus === PhyState.linkError,
137+
LinkTrainingState.linkError,
138+
),
139+
),
140+
)
141+
// currentState := Mux(
142+
// plStateStatus === PhyState.reset,
143+
// nextState,
144+
/* Mux(plStateStatus === PhyState.linkError, LinkTrainingState.linkError,
145+
* Mux(plStateStatus === )), */
146+
// )
124147
io.sidebandFSMIO.rxMode := Mux(
125148
currentState === LinkTrainingState.sbInit &&
126149
(sbInitSubState === SBInitSubState.SEND_CLOCK ||
@@ -150,6 +173,9 @@ class LinkTrainingFSM(
150173

151174
rdiBringup.io.internalError := currentState === LinkTrainingState.linkError
152175

176+
/** TODO: need to set accurately */
177+
rdiBringup.io.internalRetrain := false.B
178+
153179
private object ActiveSubState extends ChiselEnum {
154180
val IDLE = Value
155181
}

src/main/scala/logphy/LogPhyTypes.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import sideband.SidebandParams
77
import interfaces._
88

99
object LinkTrainingState extends ChiselEnum {
10-
val reset, sbInit, mbInit, linkInit, active, linkError = Value
10+
val reset, sbInit, mbInit, linkInit, active, linkError, retrain = Value
1111
}
1212

1313
object MsgSource extends ChiselEnum {

src/main/scala/logphy/RdiBringup.scala

+18-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class RdiBringup extends Module {
3232
val sbTrainIO = Flipped(new SBMsgWrapperTrainIO)
3333
val active = Output(Bool())
3434
val internalError = Input(Bool())
35+
val internalRetrain = Input(Bool())
3536
})
3637

3738
io.rdiIO.plClkReq := true.B
@@ -53,8 +54,10 @@ class RdiBringup extends Module {
5354
io.sbTrainIO.msgReq.noenq()
5455
io.sbTrainIO.msgReqStatus.nodeq()
5556
state := nextState
56-
when(io.internalError) {
57-
state := PhyState.linkError
57+
when(io.internalError || io.rdiIO.lpLinkError) {
58+
nextState := PhyState.linkError
59+
}.elsewhen(io.internalRetrain) {
60+
nextState := PhyState.retrain
5861
}
5962

6063
private val resetSubstate = RegInit(ResetSubState.WAIT_LP_STATE_REQ)
@@ -68,12 +71,24 @@ class RdiBringup extends Module {
6871
}
6972

7073
io.rdiIO.plStallReq := stallReqAckState === StallReqAckState.LP_STALLACK_WAIT
74+
private val prevReq = RegInit(PhyStateReq.nop)
75+
prevReq := io.rdiIO.lpStateReq
76+
77+
/** TODO: Implement Table 8-3 from spec */
78+
when(io.rdiIO.lpStateReq =/= PhyStateReq.nop) {
79+
when(state =/= PhyState.reset || prevReq === PhyStateReq.nop) {
80+
nextState := io.rdiIO.lpStateReq.asUInt.asTypeOf(PhyState())
81+
}
82+
}
7183

7284
switch(state) {
7385
is(PhyState.reset) {
7486
switch(resetSubstate) {
7587
is(ResetSubState.WAIT_LP_STATE_REQ) {
76-
when(io.rdiIO.lpStateReq === PhyStateReq.active) {
88+
when(
89+
nextState === PhyState.active,
90+
) {
91+
state := PhyState.reset
7792
resetSubstate := ResetSubState.REQ_ACTIVE_SEND
7893
}
7994
}

0 commit comments

Comments
 (0)