@@ -51,30 +51,15 @@ object OneToLanes {
51
51
}
52
52
}
53
53
54
- class Lanes (
55
- afeParams : AfeParams ,
56
- queueParams : AsyncQueueParams ,
57
- ) extends Module {
58
- val io = IO (new Bundle () {
59
- val scramble = Input (Bool ())
60
- val mainbandLaneIO = new MainbandLaneIO (afeParams)
61
- val mainbandIO = new MainbandIO (afeParams)
62
- })
54
+ class LaneIO (afeParams : AfeParams ) extends Bundle {
55
+ val scramble = Input (Bool ())
56
+ val mainbandLaneIO = new MainbandLaneIO (afeParams)
57
+ val mainbandIO = new MainbandIO (afeParams)
58
+ }
59
+
60
+ abstract class LanesModule (afeParams : AfeParams ) extends Module {
61
+ val io = IO (new LaneIO (afeParams))
63
62
64
- val txMBFifo =
65
- Module (
66
- new AsyncQueue (
67
- Vec (afeParams.mbLanes, Bits (afeParams.mbSerializerRatio.W )),
68
- queueParams,
69
- ),
70
- )
71
- val rxMBFifo =
72
- Module (
73
- new AsyncQueue (
74
- Vec (afeParams.mbLanes, Bits (afeParams.mbSerializerRatio.W )),
75
- queueParams,
76
- ),
77
- )
78
63
val rxScrambler =
79
64
Module (
80
65
new UCIeScrambler (afeParams = afeParams, numLanes = afeParams.mbLanes),
@@ -85,91 +70,109 @@ class Lanes(
85
70
new UCIeScrambler (afeParams = afeParams, numLanes = afeParams.mbLanes),
86
71
)
87
72
88
- rxMBFifo.io.enq <> io.mainbandLaneIO.rxData
89
- rxMBFifo.io.deq_clock := clock
90
- rxMBFifo.io.deq_reset := reset
91
- rxMBFifo.io.enq_clock := io.mainbandLaneIO.fifoParams.clk
92
- rxMBFifo.io.enq_reset := io.mainbandLaneIO.fifoParams.reset
93
- txMBFifo.io.deq <> io.mainbandLaneIO.txData
94
- txMBFifo.io.enq_clock := clock
95
- txMBFifo.io.enq_reset := reset
96
- txMBFifo.io.deq_clock := io.mainbandLaneIO.fifoParams.clk
97
- txMBFifo.io.deq_reset := io.mainbandLaneIO.fifoParams.reset
98
-
99
- assert(
100
- afeParams.mbSerializerRatio > 8 && afeParams.mbSerializerRatio % 8 == 0 ,
101
- )
73
+ val rxScramblerInput = Wire (chiselTypeOf(io.mainbandLaneIO.rxData))
74
+ val txScramblerOutput = Wire (chiselTypeOf(io.mainbandLaneIO.txData))
102
75
103
- val ratioBytes = afeParams.mbSerializerRatio / 8
76
+ val scrambledTx = Wire (chiselTypeOf(io.mainbandLaneIO.txData.bits))
77
+ val descrambledRx = Wire (chiselTypeOf(io.mainbandLaneIO.rxData.bits))
78
+ val rxDataInput = Wire (chiselTypeOf(io.mainbandLaneIO.rxData.bits))
104
79
105
- val scrambledTx = Wire (chiselTypeOf(txMBFifo.io.enq.bits))
106
- val descrambledRx = Wire (chiselTypeOf(rxMBFifo.io.deq.bits))
80
+ rxScrambler.io.data_in := rxScramblerInput.bits
81
+ rxScrambler.io.valid := rxScramblerInput.fire
82
+ descrambledRx := rxScrambler.io.data_out
107
83
108
- val rxDataInput = Wire (chiselTypeOf(rxMBFifo.io.deq.bits))
109
- rxDataInput := Mux (io.scramble, descrambledRx, rxMBFifo.io.deq.bits)
84
+ rxDataInput := Mux (
85
+ io.scramble,
86
+ rxScrambler.io.data_out,
87
+ rxScramblerInput.bits,
88
+ )
110
89
111
- /** Data Scrambling / De-scrambling */
90
+ io.mainbandIO.rxData.bits := LanesToOne (
91
+ rxDataInput,
92
+ afeParams.mbLanes,
93
+ afeParams.mbSerializerRatio,
94
+ )
95
+ io.mainbandIO.rxData.valid := rxScramblerInput.valid
96
+ rxScramblerInput.ready := true .B
112
97
113
- rxScrambler.io.data_in := rxMBFifo.io.deq.bits
114
- rxScrambler.io.valid := rxMBFifo.io.deq.fire
115
- descrambledRx := rxScrambler.io.data_out
98
+ scrambledTx := txScrambler.io.data_out
116
99
txScrambler.io.data_in := OneToLanes (
117
100
io.mainbandIO.txData.bits,
118
101
afeParams.mbLanes,
119
102
afeParams.mbSerializerRatio,
120
103
)
121
104
txScrambler.io.valid := io.mainbandIO.txData.fire
122
- scrambledTx := txScrambler.io.data_out
123
105
124
- /** Queue data into FIFOs */
125
-
126
- txMBFifo.io.enq.valid := io.mainbandIO.txData.valid
127
- io.mainbandIO.txData.ready := txMBFifo.io.enq.ready
128
- txMBFifo.io.enq.bits := Mux (
106
+ txScramblerOutput.valid := io.mainbandIO.txData.valid
107
+ io.mainbandIO.txData.ready := txScramblerOutput.ready
108
+ txScramblerOutput.bits := Mux (
129
109
io.scramble,
130
110
scrambledTx,
131
111
txScrambler.io.data_in,
132
112
)
133
113
134
- io.mainbandIO.rxData.valid := rxMBFifo.io.deq.valid
135
- io.mainbandIO.rxData.bits := LanesToOne (
136
- rxDataInput,
137
- afeParams.mbLanes,
138
- afeParams.mbSerializerRatio,
139
- )
140
- rxMBFifo.io.deq.ready := true .B
141
114
}
142
115
143
- class MainbandSimIO ( afeParams : AfeParams ) extends Bundle {
144
- val txData = Decoupled (
145
- Vec (afeParams.mbLanes, Bits (afeParams.mbSerializerRatio. W )),
146
- )
147
- val rxData = Flipped (
148
- Decoupled ( Vec ( afeParams.mbLanes, Bits ( afeParams.mbSerializerRatio. W ))) ,
116
+ class LanesNoFifo (
117
+ afeParams : AfeParams ,
118
+ ) extends LanesModule (afeParams) {
119
+
120
+ assert (
121
+ afeParams.mbSerializerRatio > 8 && afeParams.mbSerializerRatio % 8 == 0 ,
149
122
)
123
+
124
+ rxScramblerInput <> io.mainbandLaneIO.rxData
125
+ io.mainbandLaneIO.txData <> txScramblerOutput
126
+
150
127
}
151
128
152
- class SimLanes (
129
+ class Lanes (
153
130
afeParams : AfeParams ,
154
131
queueParams : AsyncQueueParams ,
155
- ) extends Module {
132
+ ) extends LanesModule (afeParams) {
156
133
157
- val io = IO (new Bundle () {
158
- val scramble = Input (Bool ())
159
- val mainbandIo = new MainbandSimIO (afeParams)
160
- val mainbandLaneIO = new MainbandIO (afeParams)
161
- })
134
+ val asyncQueueIO = IO (Input (new FifoParams ))
162
135
163
- val rxScrambler =
136
+ val txMBFifo =
164
137
Module (
165
- new UCIeScrambler (afeParams = afeParams, numLanes = afeParams.mbLanes),
138
+ new AsyncQueue (
139
+ Vec (afeParams.mbLanes, Bits (afeParams.mbSerializerRatio.W )),
140
+ queueParams,
141
+ ),
166
142
)
167
-
168
- val txScrambler =
143
+ val rxMBFifo =
169
144
Module (
170
- new UCIeScrambler (afeParams = afeParams, numLanes = afeParams.mbLanes),
145
+ new AsyncQueue (
146
+ Vec (afeParams.mbLanes, Bits (afeParams.mbSerializerRatio.W )),
147
+ queueParams,
148
+ ),
171
149
)
172
150
151
+ rxMBFifo.io.enq <> io.mainbandLaneIO.rxData
152
+ rxMBFifo.io.deq_clock := clock
153
+ rxMBFifo.io.deq_reset := reset
154
+ rxMBFifo.io.enq_clock := asyncQueueIO.clk
155
+ rxMBFifo.io.enq_reset := asyncQueueIO.reset
156
+ txMBFifo.io.deq <> io.mainbandLaneIO.txData
157
+ txMBFifo.io.enq_clock := clock
158
+ txMBFifo.io.enq_reset := reset
159
+ txMBFifo.io.deq_clock := asyncQueueIO.clk
160
+ txMBFifo.io.deq_reset := asyncQueueIO.reset
161
+
162
+ assert(
163
+ afeParams.mbSerializerRatio > 8 && afeParams.mbSerializerRatio % 8 == 0 ,
164
+ )
165
+
166
+ rxScramblerInput <> rxMBFifo.io.deq
167
+ txMBFifo.io.enq <> txScramblerOutput
168
+
169
+ }
170
+
171
+ class SimLanes (
172
+ afeParams : AfeParams ,
173
+ queueParams : AsyncQueueParams ,
174
+ ) extends LanesModule (afeParams) {
175
+
173
176
val txMBFifo =
174
177
Module (
175
178
new Queue (
@@ -185,70 +188,13 @@ class SimLanes(
185
188
),
186
189
)
187
190
188
- rxMBFifo.io.enq <> io.mainbandIo .rxData
189
- txMBFifo.io.deq <> io.mainbandIo .txData
191
+ rxMBFifo.io.enq <> io.mainbandLaneIO .rxData
192
+ txMBFifo.io.deq <> io.mainbandLaneIO .txData
190
193
191
- txMBFifo.io.enq.valid := io.mainbandLaneIO.txData.valid
192
- io.mainbandLaneIO.rxData.valid := rxMBFifo.io.deq.valid
193
194
assert(
194
195
afeParams.mbSerializerRatio > 8 && afeParams.mbSerializerRatio % 8 == 0 ,
195
196
)
196
197
197
- val ratioBytes = afeParams.mbSerializerRatio / 8
198
- val txDataVec = Wire (
199
- Vec (afeParams.mbLanes, Vec (ratioBytes, UInt (8 .W ))),
200
- )
201
- val rxDataVec = Wire (
202
- Vec (ratioBytes, Vec (afeParams.mbLanes, UInt (8 .W ))),
203
- )
204
- val txDataBytes = Wire (
205
- Vec (afeParams.mbLanes * ratioBytes, UInt (8 .W )),
206
- )
207
- txDataBytes := io.mainbandLaneIO.txData.asTypeOf(txDataBytes)
208
-
209
- for (i <- 0 until afeParams.mbLanes) {
210
- for (j <- 0 until ratioBytes) {
211
- txDataVec(i)(j) := txDataBytes(afeParams.mbLanes * j + i)
212
- }
213
- }
214
-
215
- val scrambledTx = Wire (chiselTypeOf(txMBFifo.io.enq.bits))
216
- val descrambledRx = Wire (chiselTypeOf(rxMBFifo.io.deq.bits))
217
-
218
- val rxDataInput = Wire (chiselTypeOf(rxMBFifo.io.deq.bits))
219
- rxDataInput := Mux (io.scramble, descrambledRx, rxMBFifo.io.deq.bits)
220
-
221
- for (i <- 0 until afeParams.mbLanes) {
222
- for (j <- 0 until ratioBytes) {
223
- rxDataVec(j)(i) := rxDataInput(i).asTypeOf(
224
- VecInit (Seq .fill(ratioBytes)(0 .U (8 .W ))),
225
- )(j)
226
- }
227
- }
228
-
229
- /** Data Scrambling / De-scrambling */
230
-
231
- rxScrambler.io.data_in := rxMBFifo.io.deq.bits
232
- rxScrambler.io.valid := rxMBFifo.io.deq.fire
233
- descrambledRx := rxScrambler.io.data_out
234
-
235
- for (i <- 0 until afeParams.mbLanes) {
236
- txScrambler.io.data_in(i) := txDataVec(i).asUInt
237
- }
238
- txScrambler.io.valid := io.mainbandLaneIO.txData.fire
239
- scrambledTx := txScrambler.io.data_out
240
-
241
- /** Queue data into FIFOs */
242
-
243
- txMBFifo.io.enq.valid := io.mainbandLaneIO.txData.valid
244
- io.mainbandLaneIO.txData.ready := txMBFifo.io.enq.ready
245
- txMBFifo.io.enq.bits := Mux (
246
- io.scramble,
247
- scrambledTx,
248
- txScrambler.io.data_in,
249
- )
250
-
251
- io.mainbandLaneIO.rxData.valid := rxMBFifo.io.deq.valid
252
- io.mainbandLaneIO.rxData.bits := rxDataVec.asUInt
253
- rxMBFifo.io.deq.ready := true .B
198
+ rxScramblerInput <> rxMBFifo.io.deq
199
+ txMBFifo.io.enq <> txScramblerOutput
254
200
}
0 commit comments