Skip to content

Commit 6bdd2cf

Browse files
committed
2 parents 0927a86 + bdb912d commit 6bdd2cf

8 files changed

Lines changed: 161 additions & 70 deletions

File tree

chipyard/RadianceConfigs.scala

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,20 @@ class RadianceBringupHostConfig extends Config(
144144
new chipyard.NoCoresConfig)
145145

146146
class RadianceMuonConfig extends Config(
147-
new WithMuonCores(1, difftest = true, location = InCluster(0), l0i = Some(L0iCacheConfig), l0d = Some(L0dCacheConfig)) ++
147+
new WithMuonCores(1, location = InCluster(0), l0i = Some(L0iCacheConfig), l0d = Some(L0dCacheConfig), difftest = true) ++
148148
new WithRadianceCluster(0, smemConfig = TapeoutSmemConfig, l1Config = L1CacheConfig) ++
149149
new WithExtGPUMem() ++
150150
new freechips.rocketchip.rocket.WithCFlushEnabled ++
151+
new WithGPUResetAggregator(defaultReset = false) ++
152+
new RadianceBaseConfig
153+
)
154+
155+
class RadianceCyclotronConfig extends Config(
156+
new WithMuonCores(1, location = InCluster(0), l0i = Some(L0iCacheConfig), l0d = Some(L0dCacheConfig), cyclotron = true) ++
157+
new WithRadianceCluster(0, smemConfig = TapeoutSmemConfig, l1Config = L1CacheConfig) ++
158+
new WithExtGPUMem() ++
159+
new freechips.rocketchip.rocket.WithCFlushEnabled ++
160+
new WithGPUResetAggregator(defaultReset = false) ++
151161
new RadianceBaseConfig
152162
)
153163

cyclotron

docs/isa.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,16 @@ is set for lanes with zero `rs1` values. Nothing is written back to `rd`.
246246
* If no lanes have a non-zero `rs1` value (zero for `vx_pred_n`), set tmask
247247
to the value of `rs2` of the "leader" lane, i.e. the left-most active lane.
248248

249+
#### `vx_wspawn`
250+
251+
```
252+
vx_spawn rs1, rs2
253+
```
254+
255+
Activates warps 1 up to the value of `rs1` in the "leader" lane, if not already active. Has no effect on warp 0.
256+
Sets `PC` of newly active warps to the value of `rs2` in the "leader" lane. Sets tmask of newly active warps to all 1's.
257+
258+
Note: this will eventually be superceded by command processor + neutrino
249259

250260
## New Registers
251261

src/main/resources/csrc/Cyclotron.cc

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,29 @@ void cyclotron_frontend(
171171
);
172172
}
173173

174-
void cyclotron_tile_tick_rs();
174+
void cyclotron_tile_tick_rs(
175+
uint8_t* imem_req_valid_ptr,
176+
uint8_t imem_req_ready,
177+
uint32_t* imem_req_bits_address_ptr,
178+
uint64_t* imem_req_bits_tag_ptr,
179+
uint8_t* imem_resp_ready_ptr,
180+
uint8_t imem_resp_valid,
181+
uint64_t imem_resp_bits_tag,
182+
uint64_t imem_resp_bits_data,
183+
uint8_t* dmem_req_valid_vec,
184+
const uint8_t* dmem_req_ready_vec,
185+
uint8_t* dmem_req_bits_store_vec,
186+
uint32_t* dmem_req_bits_address_vec,
187+
uint8_t* dmem_req_bits_size_vec,
188+
uint32_t* dmem_req_bits_tag_vec,
189+
uint32_t* dmem_req_bits_data_vec,
190+
uint8_t* dmem_req_bits_mask_vec,
191+
uint8_t* dmem_resp_ready_vec,
192+
const uint8_t* dmem_resp_valid_vec,
193+
const uint32_t* dmem_resp_bits_tag_vec,
194+
const uint32_t* dmem_resp_bits_data_vec,
195+
uint8_t* finished_ptr
196+
);
175197

176198
void cyclotron_tile_tick(
177199
uint8_t* imem_req_valid_ptr,
@@ -196,28 +218,29 @@ void cyclotron_tile_tick(
196218
const uint32_t* dmem_resp_bits_data_vec,
197219
uint8_t* finished_ptr
198220
) {
199-
(void)imem_req_valid_ptr;
200-
(void)imem_req_ready;
201-
(void)imem_req_bits_address_ptr;
202-
(void)imem_req_bits_tag_ptr;
203-
(void)imem_resp_ready_ptr;
204-
(void)imem_resp_valid;
205-
(void)imem_resp_bits_tag;
206-
(void)imem_resp_bits_data;
207-
(void)dmem_req_valid_vec;
208-
(void)dmem_req_ready_vec;
209-
(void)dmem_req_bits_store_vec;
210-
(void)dmem_req_bits_address_vec;
211-
(void)dmem_req_bits_size_vec;
212-
(void)dmem_req_bits_tag_vec;
213-
(void)dmem_req_bits_data_vec;
214-
(void)dmem_req_bits_mask_vec;
215-
(void)dmem_resp_ready_vec;
216-
(void)dmem_resp_valid_vec;
217-
(void)dmem_resp_bits_tag_vec;
218-
(void)dmem_resp_bits_data_vec;
219-
(void)finished_ptr;
220-
cyclotron_tile_tick_rs();
221+
cyclotron_tile_tick_rs(
222+
imem_req_valid_ptr,
223+
imem_req_ready,
224+
imem_req_bits_address_ptr,
225+
imem_req_bits_tag_ptr,
226+
imem_resp_ready_ptr,
227+
imem_resp_valid,
228+
imem_resp_bits_tag,
229+
imem_resp_bits_data,
230+
dmem_req_valid_vec,
231+
dmem_req_ready_vec,
232+
dmem_req_bits_store_vec,
233+
dmem_req_bits_address_vec,
234+
dmem_req_bits_size_vec,
235+
dmem_req_bits_tag_vec,
236+
dmem_req_bits_data_vec,
237+
dmem_req_bits_mask_vec,
238+
dmem_resp_ready_vec,
239+
dmem_resp_valid_vec,
240+
dmem_resp_bits_tag_vec,
241+
dmem_resp_bits_data_vec,
242+
finished_ptr
243+
);
221244
}
222245

223246
void cyclotron_backend_rs(

src/main/resources/vsrc/CyclotronTile.v

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
1-
module CyclotronTile #(
1+
module CyclotronTileBlackBox #(
22
parameter ARCH_LEN = 32,
33
parameter INST_BITS = 64,
44
parameter IMEM_TAG_BITS = 32,
55
parameter DMEM_DATA_BITS = 32,
66
parameter DMEM_TAG_BITS = 32,
7-
parameter NUM_WARPS = 8,
87
parameter NUM_LANES = 16,
9-
parameter OP_BITS = 9,
10-
parameter REG_BITS = 8,
11-
parameter IMM_BITS = 32,
12-
parameter CSR_IMM_BITS = 8,
13-
parameter PRED_BITS = 4,
148
localparam DMEM_SIZE_BITS = $clog2($clog2(DMEM_DATA_BITS / 8) + 1),
15-
localparam DMEM_MASK_BITS = (DMEM_DATA_BITS / 8),
16-
localparam OPNOEXT_BITS = 7,
17-
localparam OPEXT_BITS = 2,
18-
localparam WARP_ID_BITS = $clog2(NUM_WARPS),
19-
localparam WARP_COUNT_BITS = $clog2(NUM_WARPS+1)
9+
localparam DMEM_MASK_BITS = (DMEM_DATA_BITS / 8)
2010
) (
2111
input clock,
2212
input reset,
@@ -42,6 +32,7 @@ module CyclotronTile #(
4232
input logic [NUM_LANES-1:0] dmem_resp_valid,
4333
input logic [(NUM_LANES*DMEM_TAG_BITS)-1:0] dmem_resp_bits_tag,
4434
input logic [(NUM_LANES*DMEM_DATA_BITS)-1:0] dmem_resp_bits_data,
35+
4536
output logic finished
4637
);
4738
`include "Cyclotron.vh"

src/main/scala/radiance/muon/MuonTile.scala

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.chipsalliance.diplomacy.lazymodule.LazyModule
1515
import radiance.cluster.{CacheFlushNode, SoftResetFinishNode}
1616
import radiance.memory._
1717
import radiance.subsystem._
18-
import radiance.unittest.{CyclotronDiffTest, Profiler}
18+
import radiance.unittest.{CyclotronTile, CyclotronDiffTest, Profiler}
1919

2020
case class MuonTileParams(
2121
core: MuonCoreParams = MuonCoreParams(),
@@ -26,6 +26,7 @@ case class MuonTileParams(
2626
icacheUsingD: Option[DCacheParams] = None,
2727
dcache: Option[DCacheParams] = None,
2828
peripheralAddr: BigInt = 0,
29+
cyclotron: Boolean = false,
2930
disabled: Boolean = false,
3031
btb: Option[BTBParams] = None,
3132
beuAddr: Option[BigInt] = None,
@@ -327,8 +328,11 @@ class MuonTile(
327328
Resource(cpuDevice, "reg").bind(ResourceAddress(tileId))
328329
}
329330

330-
// val muon = Module(new Muon()(newP))
331-
override lazy val module = new MuonTileModuleImp(this)
331+
override lazy val module = if (muonParams.cyclotron) {
332+
new CyclotronTileModuleImp(this)
333+
} else {
334+
new MuonTileModuleImp(this)
335+
}
332336

333337
override def makeMasterBoundaryBuffers(
334338
crossing: ClockCrossingType
@@ -357,13 +361,14 @@ class MuonTileModuleImp(outer: MuonTile) extends BaseTileModuleImp(outer) {
357361
muon.io.coreId := outer.muonParams.coreId.U
358362
muon.io.clusterId := outer.muonParams.clusterId.U
359363

360-
muon.io.softReset := outer.softResetFinishSlave.in.head._1.softReset
364+
val softReset = outer.softResetFinishSlave.in.head._1.softReset
365+
muon.io.softReset := softReset
361366
outer.softResetFinishSlave.in.head._1.finished := muon.io.finished
362367

363368
outer.reportCease(None)
364369
outer.reportWFI(None)
365370

366-
when (outer.muonParams.disabled.B || muon.io.softReset) {
371+
when (outer.muonParams.disabled.B || softReset) {
367372
muon.io.imem.req.ready := false.B
368373
muon.io.imem.resp.valid := false.B // responses will be dropped
369374
outer.icacheWordNode.out.foreach(_._1.a.valid := false.B)
@@ -386,3 +391,42 @@ class MuonTileModuleImp(outer: MuonTile) extends BaseTileModuleImp(outer) {
386391
cdiff.io.trace <> muon.io.trace.get
387392
}
388393
}
394+
395+
class CyclotronTileModuleImp(outer: MuonTile) extends BaseTileModuleImp(outer) {
396+
val cyclotron = Module(new CyclotronTile)
397+
398+
MuonMemTL.connectTL(cyclotron.io.imem.req, cyclotron.io.imem.resp, outer.icacheWordNode)
399+
400+
MuonMemTL.multiConnectTL(cyclotron.io.dmem.req, cyclotron.io.dmem.resp, outer.innerLsuNodes)
401+
// TODO: smem
402+
// MuonMemTL.multiConnectTL(cyclotron.io.smem.req, cyclotron.io.smem.resp, outer.innerSmemNodes)
403+
404+
// TODO: barrier
405+
// val (barrier, _) = outer.barrierMaster.out.head
406+
// barrier.req <> cyclotron.io.barrier.req
407+
// barrier.resp <> cyclotron.io.barrier.resp
408+
409+
// TODO: flush
410+
// outer.iFlushMaster.out.head._1 <> cyclotron.io.flush.i
411+
// outer.dFlushMaster.out.head._1 <> cyclotron.io.flush.d
412+
413+
// TODO: core/clusterId
414+
// cyclotron.io.coreId := outer.cyclotronParams.coreId.U
415+
// cyclotron.io.clusterId := outer.cyclotronParams.clusterId.U
416+
417+
// TODO: softReset
418+
val softReset = outer.softResetFinishSlave.in.head._1.softReset
419+
// cyclotron.io.softReset := softReset
420+
outer.softResetFinishSlave.in.head._1.finished := cyclotron.io.finished
421+
422+
outer.reportCease(None)
423+
outer.reportWFI(None)
424+
425+
when (outer.muonParams.disabled.B /* TODO: || softReset */) {
426+
cyclotron.io.imem.req.ready := false.B
427+
cyclotron.io.imem.resp.valid := false.B // responses will be dropped
428+
outer.icacheWordNode.out.foreach(_._1.a.valid := false.B)
429+
}
430+
431+
// TODO: perf
432+
}

src/main/scala/radiance/subsystem/Configs.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class WithMuonCores(
6565
crossing: RocketCrossingParams,
6666
standalone: Boolean,
6767
noILP: Boolean,
68+
cyclotron: Boolean,
6869
difftest: Boolean,
6970
disabled: Boolean,
7071
l0i: Option[DCacheParams],
@@ -109,6 +110,7 @@ class WithMuonCores(
109110
dcache = l0d,
110111
l1CacheLineBytes = clusterParams.l1Config.blockBytes,
111112
peripheralAddr = clusterParams.baseAddr + clusterParams.peripheralAddrOffset,
113+
cyclotron = cyclotron,
112114
disabled = disabled,
113115
)
114116
List.tabulate(n)(i => MuonTileAttachParams(
@@ -127,7 +129,7 @@ class WithMuonCores(
127129
// constructor override that omits `crossing`
128130
def this(n: Int, location: HierarchicalLocation = InSubsystem,
129131
standalone: Boolean = false, noILP: Boolean = false,
130-
difftest: Boolean = false, disabled: Boolean = false,
132+
cyclotron: Boolean = false, difftest: Boolean = false, disabled: Boolean = false,
131133
l0i: Option[DCacheParams] = None, l0d: Option[DCacheParams] = None)
132134
= this(n, location, RocketCrossingParams(
133135
master = HierarchicalElementMasterPortParams.locationDefault(location),
@@ -136,7 +138,7 @@ class WithMuonCores(
136138
case InSubsystem => CBUS
137139
case InCluster(clusterId) => CCBUS(clusterId)
138140
},
139-
), standalone, noILP, difftest, disabled, l0i, l0d)
141+
), standalone, noILP, cyclotron, difftest, disabled, l0i, l0d)
140142
}
141143

142144
class WithCyclotronCores(

src/main/scala/radiance/unittest/Muon.scala

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,7 @@ object Cyclotron {
926926
}
927927

928928
def unflatten(destWord: UInt, flattened: UInt, index: Int): Unit = {
929-
assert(destWord.widthKnown)
929+
assert(destWord.widthKnown, "cannot unflatten to sink with unknown width")
930930
destWord := splitUInt(flattened, destWord.getWidth)(index)
931931
}
932932
}
@@ -1049,51 +1049,62 @@ class CyclotronTile(implicit p: Parameters) extends CoreModule {
10491049
val finished = Output(Bool())
10501050
})
10511051

1052-
val bbox = Module(new CyclotronTileBlackBox)
1052+
val bbox = Module(new CyclotronTileBlackBox(this))
10531053
bbox.io.clock := clock
10541054
bbox.io.reset := reset.asBool
10551055

10561056
import Cyclotron._
10571057

10581058
// imem
1059-
io.imem.req.ready := bbox.io.imem_req_ready
1060-
bbox.io.imem_req_valid := io.imem.req.valid
1061-
bbox.io.imem_req_bits_address := io.imem.req.bits.address
1062-
bbox.io.imem_req_bits_tag := io.imem.req.bits.tag
1063-
bbox.io.imem_resp_ready := io.imem.resp.ready
1064-
io.imem.resp.valid := bbox.io.imem_resp_valid
1065-
io.imem.resp.bits.tag := bbox.io.imem_resp_bits_tag
1066-
io.imem.resp.bits.data := bbox.io.imem_resp_bits_data
1067-
io.imem.resp.bits.metadata := DontCare
1059+
bbox.io.imem_req_ready := io.imem.req.ready
1060+
io.imem.req.valid := bbox.io.imem_req_valid
1061+
io.imem.req.bits.address := bbox.io.imem_req_bits_address
1062+
io.imem.req.bits.tag := bbox.io.imem_req_bits_tag
1063+
io.imem.req.bits.size := log2Ceil(muonParams.instBits / 8).U
1064+
io.imem.req.bits.store := false.B
1065+
io.imem.req.bits.data := 0.U
1066+
io.imem.req.bits.mask := ((1 << muonParams.instBytes) - 1).U
1067+
io.imem.resp.ready := bbox.io.imem_resp_ready
1068+
bbox.io.imem_resp_valid := io.imem.resp.valid
1069+
bbox.io.imem_resp_bits_tag := io.imem.resp.bits.tag
1070+
bbox.io.imem_resp_bits_data := io.imem.resp.bits.data
10681071

10691072
// dmem
1070-
// TODO: dedup with CyclotronDataMem?
1071-
bbox.io.dmem_req_valid := VecInit(io.dmem.req.map(_.valid)).asUInt
1072-
bbox.io.dmem_req_bits_store := VecInit(io.dmem.req.map(_.bits.store)).asUInt
1073-
bbox.io.dmem_req_bits_tag := VecInit(io.dmem.req.map(_.bits.tag)).asUInt
1074-
bbox.io.dmem_req_bits_address := VecInit(io.dmem.req.map(_.bits.address)).asUInt
1075-
bbox.io.dmem_req_bits_size := VecInit(io.dmem.req.map(_.bits.size)).asUInt
1076-
bbox.io.dmem_req_bits_data := VecInit(io.dmem.req.map(_.bits.data)).asUInt
1077-
bbox.io.dmem_req_bits_mask := VecInit(io.dmem.req.map(_.bits.mask)).asUInt
1078-
bbox.io.dmem_resp_ready := VecInit(io.dmem.resp.map(_.ready)).asUInt
10791073
io.dmem.req.zipWithIndex.foreach { case (req, i) =>
1080-
req.ready := bbox.io.dmem_req_ready(i)
1074+
req.valid := bbox.io.dmem_req_valid(i)
1075+
req.bits.store := bbox.io.dmem_req_bits_store(i)
1076+
unflatten(req.bits.tag, bbox.io.dmem_req_bits_tag, i)
1077+
unflatten(req.bits.address, bbox.io.dmem_req_bits_address, i)
1078+
unflatten(req.bits.size, bbox.io.dmem_req_bits_size, i)
1079+
unflatten(req.bits.data, bbox.io.dmem_req_bits_data, i)
1080+
unflatten(req.bits.mask, bbox.io.dmem_req_bits_mask, i)
10811081
}
1082+
bbox.io.dmem_req_ready := VecInit(io.dmem.req.map(_.ready)).asUInt
1083+
1084+
bbox.io.dmem_resp_valid := VecInit(io.dmem.resp.map(_.valid)).asUInt
1085+
bbox.io.dmem_resp_bits_tag := VecInit(io.dmem.resp.map(_.bits.tag)).asUInt
1086+
bbox.io.dmem_resp_bits_data := VecInit(io.dmem.resp.map(_.bits.data)).asUInt
10821087
io.dmem.resp.zipWithIndex.foreach { case (resp, i) =>
1083-
resp.valid := bbox.io.dmem_resp_valid(i)
1084-
unflatten(resp.bits.tag, bbox.io.dmem_resp_bits_tag, i)
1085-
unflatten(resp.bits.data, bbox.io.dmem_resp_bits_data, i)
1088+
resp.ready := bbox.io.dmem_resp_ready(i)
10861089
resp.bits.metadata := DontCare
10871090
}
10881091

10891092
io.finished := bbox.io.finished
10901093
}
10911094

1092-
class CyclotronTileBlackBox(implicit p: Parameters) extends CyclotronBlackBox
1093-
with HasBlackBoxResource with HasCoreParameters {
1095+
class CyclotronTileBlackBox(outer: CyclotronTile)(implicit val p: Parameters)
1096+
extends BlackBox(Map(
1097+
"ARCH_LEN" -> outer.archLen,
1098+
"INST_BITS" -> outer.muonParams.instBits,
1099+
"IMEM_TAG_BITS" -> outer.imemTagBits,
1100+
"DMEM_DATA_BITS" -> outer.archLen,
1101+
"DMEM_TAG_BITS" -> outer.dmemTagBits,
1102+
"NUM_LANES" -> outer.numLanes,
1103+
)) with HasBlackBoxResource with HasCoreParameters {
10941104
val io = IO(new Bundle {
10951105
val clock = Input(Clock())
10961106
val reset = Input(Bool())
1107+
10971108
val imem_req_valid = Output(Bool())
10981109
val imem_req_ready = Input(Bool())
10991110
val imem_req_bits_address = Output(UInt(addressBits.W))

0 commit comments

Comments
 (0)