Periphery: make bus width and arithmetic atomics configurable (#337)
This commit is contained in:
		
				
					committed by
					
						 Yunsup Lee
						Yunsup Lee
					
				
			
			
				
	
			
			
			
						parent
						
							47843d8ec1
						
					
				
				
					commit
					d175bb314d
				
			| @@ -49,7 +49,12 @@ abstract class BaseTop(q: Parameters) extends LazyModule { | ||||
|  | ||||
|   val legacy = LazyModule(new TLLegacy()(p.alterPartial({ case TLId => "L2toMMIO" }))) | ||||
|  | ||||
|   peripheryBus.node := TLWidthWidget(legacy.tlDataBytes)(TLBuffer()(TLAtomicAutomata()(TLHintHandler()(legacy.node)))) | ||||
|   peripheryBus.node := | ||||
|     TLWidthWidget(legacy.tlDataBytes)( | ||||
|     TLBuffer()( | ||||
|     TLAtomicAutomata(arithmetic = p(PeripheryBusKey).arithAMO)( | ||||
|     TLHintHandler()( | ||||
|     legacy.node)))) | ||||
| } | ||||
|  | ||||
| abstract class BaseTopBundle(val p: Parameters) extends Bundle { | ||||
|   | ||||
| @@ -42,6 +42,7 @@ class BasePlatformConfig extends Config( | ||||
|         case BuildCoreplex => | ||||
|           (c: CoreplexConfig, p: Parameters) => uncore.tilelink2.LazyModule(new DefaultCoreplex(c)(p)).module | ||||
|         case NExtTopInterrupts => 2 | ||||
|         case PeripheryBusKey => PeripheryBusConfig(arithAMO = true, beatBytes = 4) | ||||
|         // Note that PLIC asserts that this is > 0. | ||||
|         case AsyncDebugBus => false | ||||
|         case IncludeJtagDTM => false | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import uncore.tilelink._ | ||||
| import uncore.tilelink2._ | ||||
| import uncore.converters._ | ||||
| import uncore.devices._ | ||||
| import uncore.agents._ | ||||
| import uncore.util._ | ||||
| import rocket.Util._ | ||||
| import rocket.XLen | ||||
| @@ -46,6 +47,9 @@ case object ExtMemSize extends Field[Long] | ||||
| case object NExtTopInterrupts extends Field[Int] | ||||
| /** Source of RTC. First bundle is TopIO.extra, Second bundle is periphery.io.extra  **/ | ||||
| case object RTCPeriod extends Field[Int] | ||||
| /* Specifies the periphery bus configuration */ | ||||
| case class PeripheryBusConfig(arithAMO: Boolean, beatBytes: Int = 4) | ||||
| case object PeripheryBusKey extends Field[PeripheryBusConfig] | ||||
|  | ||||
| object PeripheryUtils { | ||||
|   def addQueueAXI(source: NastiIO)(implicit p: Parameters) = { | ||||
| @@ -81,6 +85,8 @@ trait HasPeripheryParameters { | ||||
|   lazy val innerMMIOParams = p.alterPartial({ case TLId => "L2toMMIO" }) | ||||
|   lazy val outermostParams = p.alterPartial({ case TLId => "Outermost" }) | ||||
|   lazy val outermostMMIOParams = p.alterPartial({ case TLId => "MMIO_Outermost" }) | ||||
|   lazy val peripheryBusConfig = p(PeripheryBusKey) | ||||
|   lazy val cacheBlockBytes = p(CacheBlockBytes) | ||||
| } | ||||
|  | ||||
| ///// | ||||
| @@ -284,11 +290,11 @@ trait PeripheryCoreplexLocalInterrupter extends LazyModule with HasPeripheryPara | ||||
|   val peripheryBus: TLXbar | ||||
|  | ||||
|   // CoreplexLocalInterrupter must be at least 64b if XLen >= 64 | ||||
|   val beatBytes = (innerMMIOParams(XLen) min 64) / 8 | ||||
|   val beatBytes = max((innerMMIOParams(XLen) min 64) / 8, peripheryBusConfig.beatBytes) | ||||
|   val clintConfig = CoreplexLocalInterrupterConfig(beatBytes) | ||||
|   val clint = LazyModule(new CoreplexLocalInterrupter(clintConfig)(innerMMIOParams)) | ||||
|   // The periphery bus is 32-bit, so we may need to adapt its width to XLen | ||||
|   clint.node := TLFragmenter(beatBytes, 256)(TLWidthWidget(4)(peripheryBus.node)) | ||||
|   clint.node := TLFragmenter(beatBytes, cacheBlockBytes)(TLWidthWidget(peripheryBusConfig.beatBytes)(peripheryBus.node)) | ||||
| } | ||||
|  | ||||
| trait PeripheryCoreplexLocalInterrupterBundle { | ||||
| @@ -307,14 +313,15 @@ trait PeripheryCoreplexLocalInterrupterModule extends HasPeripheryParameters { | ||||
|  | ||||
| ///// | ||||
|  | ||||
| trait PeripheryBootROM extends LazyModule { | ||||
| trait PeripheryBootROM extends LazyModule with HasPeripheryParameters { | ||||
|   implicit val p: Parameters | ||||
|   val peripheryBus: TLXbar | ||||
|  | ||||
|   val address = 0x1000 | ||||
|   val size = 0x1000 | ||||
|   val rom = LazyModule(new TLROM(address, size, GenerateBootROM(p, address)) { override def name = "bootrom" }) | ||||
|   rom.node := TLFragmenter(4, 256)(peripheryBus.node) | ||||
|   val rom = LazyModule(new TLROM(address, size, GenerateBootROM(p, address), true, peripheryBusConfig.beatBytes) | ||||
|                        { override def name = "bootrom" }) | ||||
|   rom.node := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node) | ||||
| } | ||||
|  | ||||
| trait PeripheryBootROMBundle { | ||||
| @@ -329,15 +336,16 @@ trait PeripheryBootROMModule extends HasPeripheryParameters { | ||||
|  | ||||
| ///// | ||||
|  | ||||
| trait PeripheryTestRAM extends LazyModule { | ||||
| trait PeripheryTestRAM extends LazyModule with HasPeripheryParameters { | ||||
|   implicit val p: Parameters | ||||
|   val peripheryBus: TLXbar | ||||
|  | ||||
|   val ramBase = 0x52000000 | ||||
|   val ramSize = 0x1000 | ||||
|  | ||||
|   val sram = LazyModule(new TLRAM(AddressSet(ramBase, ramSize-1)) { override def name = "testram" }) | ||||
|   sram.node := TLFragmenter(4, 256)(peripheryBus.node) | ||||
|   val sram = LazyModule(new TLRAM(AddressSet(ramBase, ramSize-1), true, peripheryBusConfig.beatBytes) | ||||
|                         { override def name = "testram" }) | ||||
|   sram.node := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node) | ||||
| } | ||||
|  | ||||
| trait PeripheryTestRAMBundle { | ||||
|   | ||||
| @@ -48,7 +48,7 @@ trait CoreplexLocalInterrupterModule extends Module with HasRegMap with MixCorep | ||||
|   val timeWidth = 64 | ||||
|   val regWidth = 32 | ||||
|   // demand atomic accesses for RV64 | ||||
|   require(c.beatBytes == (p(rocket.XLen) min timeWidth)/8) | ||||
|   require(c.beatBytes >= (p(rocket.XLen) min timeWidth)/8) | ||||
|  | ||||
|   val time = Seq.fill(timeWidth/regWidth)(Reg(init=UInt(0, width = regWidth))) | ||||
|   when (io.rtcTick) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user