2012-03-25 00:56:59 +01:00
package rocket
import Chisel._
2012-10-02 01:08:41 +02:00
import uncore._
2012-11-18 02:24:08 +01:00
import Util._
2012-03-25 00:56:59 +01:00
2013-08-02 23:54:16 +02:00
case class RocketConfiguration ( tl : TileLinkConfiguration ,
2012-11-16 11:39:33 +01:00
icache : ICacheConfig , dcache : DCacheConfig ,
2013-09-13 07:34:38 +02:00
fpu : Boolean , rocc : Option [ RoCC ] = None ,
2012-11-25 07:01:08 +01:00
fastLoadWord : Boolean = true ,
2013-01-06 12:47:17 +01:00
fastLoadByte : Boolean = false ,
fastMulDiv : Boolean = true )
2012-11-06 08:52:32 +01:00
{
val dcacheReqTagBits = 9 // enforce compliance with require()
2012-11-18 02:24:08 +01:00
val xprlen = 64
val nxpr = 32
val nxprbits = log2Up ( nxpr )
2012-11-25 07:01:08 +01:00
if ( fastLoadByte ) require ( fastLoadWord )
2012-11-06 08:52:32 +01:00
}
2012-11-05 01:59:36 +01:00
2013-08-13 05:51:54 +02:00
class Tile ( resetSignal : Bool = null ) ( confIn : RocketConfiguration ) extends Module ( _reset = resetSignal ) with ClientCoherenceAgent
2012-03-25 00:56:59 +01:00
{
2013-09-13 07:34:38 +02:00
val memPorts = 2
2013-03-20 22:05:12 +01:00
val dcachePortId = 0
val icachePortId = 1
val vicachePortId = 2
2013-08-02 23:54:16 +02:00
implicit val tlConf = confIn . tl
implicit val lnConf = confIn . tl . ln
2013-08-12 19:39:11 +02:00
implicit val icConf = confIn . icache
implicit val dcConf = confIn . dcache . copy ( reqtagbits = confIn . dcacheReqTagBits + log2Up ( memPorts ) , databits = confIn . xprlen )
2012-11-06 08:52:32 +01:00
implicit val conf = confIn . copy ( dcache = dcConf )
2012-03-25 00:56:59 +01:00
val io = new Bundle {
2013-01-07 22:38:59 +01:00
val tilelink = new TileLinkIO
2013-03-01 06:03:37 +01:00
val host = new HTIFIO ( lnConf . nClients )
2012-03-25 00:56:59 +01:00
}
2012-11-06 08:52:32 +01:00
2013-08-12 19:39:11 +02:00
val core = Module ( new Core )
val icache = Module ( new Frontend )
val dcache = Module ( new HellaCache )
2013-09-13 07:34:38 +02:00
val ptw = Module ( new PTW ( 2 ) )
2012-03-25 00:56:59 +01:00
2013-09-13 07:34:38 +02:00
val dcacheArb = Module ( new HellaCacheArbiter ( 2 + ! conf . rocc . isEmpty ) )
dcacheArb . io . requestor ( 0 ) <> ptw . io . mem
dcacheArb . io . requestor ( 1 ) <> core . io . dmem
dcache . io . cpu <> dcacheArb . io . mem
2012-03-25 00:56:59 +01:00
2013-09-13 07:34:38 +02:00
ptw . io . requestor ( 0 ) <> icache . io . cpu . ptw
ptw . io . requestor ( 1 ) <> dcache . io . cpu . ptw
val memArb = Module ( new UncachedTileLinkIOArbiterThatAppendsArbiterId ( memPorts ) )
memArb . io . in ( dcachePortId ) <> dcache . io . mem
memArb . io . in ( icachePortId ) <> icache . io . mem
io . tilelink . acquire <> memArb . io . out . acquire
memArb . io . out . grant <> io . tilelink . grant
io . tilelink . grant_ack <> memArb . io . out . grant_ack
2013-01-22 02:18:23 +01:00
dcache . io . mem . probe <> io . tilelink . probe
2013-05-22 02:21:04 +02:00
io . tilelink . release . data <> dcache . io . mem . release . data
io . tilelink . release . meta . valid : = dcache . io . mem . release . meta . valid
dcache . io . mem . release . meta . ready : = io . tilelink . release . meta . ready
io . tilelink . release . meta . bits : = dcache . io . mem . release . meta . bits
2013-08-12 19:39:11 +02:00
io . tilelink . release . meta . bits . payload . client_xact_id : = Cat ( dcache . io . mem . release . meta . bits . payload . client_xact_id , UInt ( dcachePortId , log2Up ( memPorts ) ) ) // Mimic client id extension done by UncachedTileLinkIOArbiter for Acquires from either client)
2012-03-25 00:56:59 +01:00
2012-11-06 17:13:44 +01:00
core . io . host <> io . host
core . io . imem <> icache . io . cpu
2013-09-13 07:34:38 +02:00
core . io . ptw <> ptw . io . dpath
2012-03-25 00:56:59 +01:00
}