From 8cf06db45c123b0a3ce4afeb69f91be1a9010f31 Mon Sep 17 00:00:00 2001 From: Paul Rigge Date: Thu, 24 Jan 2019 17:13:40 -0800 Subject: [PATCH] Add an AXI4 flavor of PWM peripheral. Also closes #41. --- src/main/scala/example/Configs.scala | 9 +++++- src/main/scala/example/PWM.scala | 43 ++++++++++++++++++++++------ src/main/scala/example/Top.scala | 18 ++++++++---- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/main/scala/example/Configs.scala b/src/main/scala/example/Configs.scala index 4c7498c1..3076c862 100644 --- a/src/main/scala/example/Configs.scala +++ b/src/main/scala/example/Configs.scala @@ -26,7 +26,12 @@ class WithExampleTop extends Config((site, here, up) => { class WithPWM extends Config((site, here, up) => { case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => - Module(LazyModule(new ExampleTopWithPWM()(p)).module) + Module(LazyModule(new ExampleTopWithPWMTL()(p)).module) +}) + +class WithPWMAXI4 extends Config((site, here, up) => { + case BuildTop => (clock: Clock, reset: Bool, p: Parameters) => + Module(LazyModule(new ExampleTopWithPWMAXI4()(p)).module) }) class WithBlockDeviceModel extends Config((site, here, up) => { @@ -57,6 +62,8 @@ class RoccExampleConfig extends Config( class PWMConfig extends Config(new WithPWM ++ new BaseExampleConfig) +class PWMAXI4Config extends Config(new WithPWMAXI4 ++ new BaseExampleConfig) + class SimBlockDeviceConfig extends Config( new WithBlockDevice ++ new WithSimBlockDevice ++ new BaseExampleConfig) diff --git a/src/main/scala/example/PWM.scala b/src/main/scala/example/PWM.scala index c2621d3f..04ed4203 100644 --- a/src/main/scala/example/PWM.scala +++ b/src/main/scala/example/PWM.scala @@ -2,6 +2,7 @@ package example import chisel3._ import chisel3.util._ +import freechips.rocketchip.amba.axi4._ import freechips.rocketchip.subsystem.BaseSubsystem import freechips.rocketchip.config.{Parameters, Field} import freechips.rocketchip.diplomacy._ @@ -33,12 +34,12 @@ class PWMBase(w: Int) extends Module { io.pwmout := io.enable && (counter < io.duty) } -trait PWMTLBundle extends Bundle { +trait PWMBundle extends Bundle { val pwmout = Output(Bool()) } -trait PWMTLModule extends HasRegMap { - val io: PWMTLBundle +trait PWMModule extends HasRegMap { + val io: PWMBundle implicit val p: Parameters def params: PWMParams @@ -68,10 +69,15 @@ class PWMTL(c: PWMParams)(implicit p: Parameters) extends TLRegisterRouter( c.address, "pwm", Seq("ucbbar,pwm"), beatBytes = c.beatBytes)( - new TLRegBundle(c, _) with PWMTLBundle)( - new TLRegModule(c, _, _) with PWMTLModule) + new TLRegBundle(c, _) with PWMBundle)( + new TLRegModule(c, _, _) with PWMModule) -trait HasPeripheryPWM { this: BaseSubsystem => +class PWMAXI4(c: PWMParams)(implicit p: Parameters) + extends AXI4RegisterRouter(c.address, beatBytes = c.beatBytes)( + new AXI4RegBundle(c, _) with PWMBundle)( + new AXI4RegModule(c, _, _) with PWMModule) + +trait HasPeripheryPWMTL { this: BaseSubsystem => implicit val p: Parameters private val address = 0x2000 @@ -83,9 +89,30 @@ trait HasPeripheryPWM { this: BaseSubsystem => pbus.toVariableWidthSlave(Some(portName)) { pwm.node } } -trait HasPeripheryPWMModuleImp extends LazyModuleImp { +trait HasPeripheryPWMTLModuleImp extends LazyModuleImp { implicit val p: Parameters - val outer: HasPeripheryPWM + val outer: HasPeripheryPWMTL + + val pwmout = IO(Output(Bool())) + + pwmout := outer.pwm.module.io.pwmout +} + +trait HasPeripheryPWMAXI4 { this: BaseSubsystem => + implicit val p: Parameters + + private val address = 0x2000 + private val portName = "pwm" + + val pwm = LazyModule(new PWMAXI4( + PWMParams(address, 8 * pbus.beatBytes))(p)) + + pbus.toFixedWidthSlave(Some(portName)) { pwm.node := TLToAXI4() } +} + +trait HasPeripheryPWMAXI4ModuleImp extends LazyModuleImp { + implicit val p: Parameters + val outer: HasPeripheryPWMAXI4 val pwmout = IO(Output(Bool())) diff --git a/src/main/scala/example/Top.scala b/src/main/scala/example/Top.scala index 4d74ce48..98f8107e 100644 --- a/src/main/scala/example/Top.scala +++ b/src/main/scala/example/Top.scala @@ -26,13 +26,21 @@ class ExampleTopModule[+L <: ExampleTop](l: L) extends RocketSubsystemModuleImp( with HasPeripherySerialModuleImp with DontTouch -class ExampleTopWithPWM(implicit p: Parameters) extends ExampleTop - with HasPeripheryPWM { - override lazy val module = new ExampleTopWithPWMModule(this) +class ExampleTopWithPWMTL(implicit p: Parameters) extends ExampleTop + with HasPeripheryPWMTL { + override lazy val module = new ExampleTopWithPWMTLModule(this) } -class ExampleTopWithPWMModule(l: ExampleTopWithPWM) - extends ExampleTopModule(l) with HasPeripheryPWMModuleImp +class ExampleTopWithPWMTLModule(l: ExampleTopWithPWMTL) + extends ExampleTopModule(l) with HasPeripheryPWMTLModuleImp + +class ExampleTopWithPWMAXI4(implicit p: Parameters) extends ExampleTop + with HasPeripheryPWMAXI4 { + override lazy val module = new ExampleTopWithPWMAXI4Module(this) +} + +class ExampleTopWithPWMAXI4Module(l: ExampleTopWithPWMAXI4) + extends ExampleTopModule(l) with HasPeripheryPWMAXI4ModuleImp class ExampleTopWithBlockDevice(implicit p: Parameters) extends ExampleTop with HasPeripheryBlockDevice {