Skip to content

Commit 2797a6c

Browse files
authored
Modularize connect methods (#69)
* * Separate connect methods of BlockDevice, SerialAdapter, and UARTAdapter into objects for modularity * Fix deprecation warnings * SerialIO should not be an Option * Add suggestName for uart_sim * CR feedback; Move the option logic into SerialAdapter methods
1 parent 3a83cd0 commit 2797a6c

3 files changed

Lines changed: 66 additions & 30 deletions

File tree

src/main/scala/BlockDevice.scala

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -458,15 +458,26 @@ trait CanHavePeripheryBlockDeviceModuleImp extends LazyModuleImp {
458458
io
459459
}
460460

461-
def connectSimBlockDevice(clock: Clock, reset: Bool) {
462-
val sim = Module(new SimBlockDevice)
463-
sim.io.clock := clock
464-
sim.io.reset := reset
465-
sim.io.bdev <> bdev.get
461+
def connectSimBlockDevice(clock: Clock, reset: Bool) = SimBlockDevice.connect(clock, reset, bdev)
462+
def connectBlockDeviceModel() = BlockDeviceModel.connect(bdev)
463+
}
464+
465+
object SimBlockDevice {
466+
def connect(clock: Clock, reset: Bool, bdev: Option[BlockDeviceIO])(implicit p: Parameters) {
467+
bdev.foreach { b =>
468+
val sim = Module(new SimBlockDevice)
469+
sim.io.clock := clock
470+
sim.io.reset := reset
471+
sim.io.bdev <> b
472+
}
466473
}
474+
}
467475

468-
def connectBlockDeviceModel() {
469-
val model = Module(new BlockDeviceModel(16))
470-
model.io <> bdev.get
476+
object BlockDeviceModel {
477+
def connect(bdev: Option[BlockDeviceIO])(implicit p: Parameters) {
478+
bdev.foreach { b =>
479+
val model = Module(new BlockDeviceModel(16))
480+
model.io <> b
481+
}
471482
}
472483
}

src/main/scala/SerialAdapter.scala

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package testchipip
22

33
import chisel3._
4-
import chisel3.core.Reset
54
import chisel3.util._
65
import freechips.rocketchip.config.{Parameters, Field}
76
import freechips.rocketchip.subsystem.{BaseSubsystem}
@@ -12,6 +11,28 @@ import scala.math.min
1211

1312
case object SerialAdapter {
1413
val SERIAL_IF_WIDTH = 32
14+
15+
def connectSimSerial(serial: Option[SerialIO], clock: Clock, reset: Reset): Bool = {
16+
serial.map { s =>
17+
val sim = Module(new SimSerial(SERIAL_IF_WIDTH))
18+
sim.io.clock := clock
19+
sim.io.reset := reset
20+
sim.io.serial <> s
21+
sim.io.exit
22+
}.getOrElse(false.B)
23+
}
24+
25+
def connectSimSerial(serial: SerialIO, clock: Clock, reset: Reset): Bool = connectSimSerial(Some(serial), clock, reset)
26+
27+
def tieoff(serial: Option[SerialIO]) {
28+
serial.foreach { s =>
29+
s.in.valid := false.B
30+
s.in.bits := DontCare
31+
s.out.ready := true.B
32+
}
33+
}
34+
35+
def tieoff(serial: SerialIO) { tieoff(Some(serial)) }
1536
}
1637
import SerialAdapter._
1738

@@ -179,8 +200,8 @@ class SimSerial(w: Int) extends BlackBox with HasBlackBoxResource {
179200
val exit = Output(Bool())
180201
})
181202

182-
setResource("/testchipip/vsrc/SimSerial.v")
183-
setResource("/testchipip/csrc/SimSerial.cc")
203+
addResource("/testchipip/vsrc/SimSerial.v")
204+
addResource("/testchipip/csrc/SimSerial.cc")
184205
}
185206

186207
case object SerialKey extends Field[Boolean](false)
@@ -213,20 +234,9 @@ trait CanHavePeripherySerialModuleImp extends LazyModuleImp {
213234
None
214235
}
215236

216-
def connectSimSerial() = {
217-
val sim = Module(new SimSerial(SERIAL_IF_WIDTH))
218-
sim.io.clock := clock
219-
sim.io.reset := reset
220-
sim.io.serial <> serial.get
221-
sim.io.exit
222-
}
237+
def connectSimSerial() = SerialAdapter.connectSimSerial(serial, clock, reset)
238+
239+
def tieoffSerial() = SerialAdapter.tieoff(serial)
223240

224-
def tieoffSerial() = {
225-
serial.map { s =>
226-
s.in.valid := false.B
227-
s.in.bits := DontCare
228-
s.out.ready := true.B
229-
}
230-
}
231241
}
232242

src/main/scala/UARTAdapter.scala

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,14 @@ import UARTAdapterConsts._
2323
* packets.
2424
*
2525
* @param uartno the uart number
26-
* @param baudrate the uart baudrate to deserialize/serialize data
26+
* @param div the divisor (equal to the clock frequency divided by the baud rate)
2727
*/
28-
class UARTAdapter(uartno: Int, baudrate: BigInt)(implicit p: Parameters) extends Module
28+
class UARTAdapter(uartno: Int, div: Int) extends Module
2929
{
3030
val io = IO(new Bundle {
3131
val uart = Flipped(new UARTPortIO)
3232
})
3333

34-
val frequency = p(PeripheryBusKey).frequency
35-
val div = (p(PeripheryBusKey).frequency / baudrate).toInt
36-
3734
val txfifo = Module(new Queue(UInt(DATA_WIDTH.W), 128))
3835
val rxfifo = Module(new Queue(UInt(DATA_WIDTH.W), 128))
3936

@@ -124,6 +121,24 @@ class UARTAdapter(uartno: Int, baudrate: BigInt)(implicit p: Parameters) extends
124121
sim.io.serial.in.ready := rxfifo.io.enq.ready
125122
}
126123

124+
object UARTAdapter {
125+
def connect(uart: Seq[UARTPortIO], baudrate: BigInt = 115200)(implicit p: Parameters) {
126+
UARTAdapter.connect(uart, baudrate, p(PeripheryBusKey).frequency)
127+
}
128+
def connect(uart: Seq[UARTPortIO], baudrate: BigInt, clockFrequency: BigInt) {
129+
val div = (clockFrequency / baudrate).toInt
130+
UARTAdapter.connect(uart, div)
131+
}
132+
def connect(uart: Seq[UARTPortIO], div: Int) {
133+
uart.zipWithIndex.foreach { case (dut_io, i) =>
134+
val uart_sim = Module(new UARTAdapter(i, div))
135+
uart_sim.suggestName("uart_sim_${i}")
136+
uart_sim.io.uart.txd := dut_io.txd
137+
dut_io.rxd := uart_sim.io.uart.rxd
138+
}
139+
}
140+
}
141+
127142
/**
128143
* Module to connect to a *.v blackbox that uses DPI calls to interact with the DUT UART.
129144
*

0 commit comments

Comments
 (0)