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-01-07 22:38:59 +01:00
case class RocketConfiguration ( lnConf : LogicalNetworkConfiguration , co : CoherencePolicyWithUncached ,
2012-11-16 11:39:33 +01:00
icache : ICacheConfig , dcache : DCacheConfig ,
2012-11-18 02:24:08 +01:00
fpu : Boolean , vec : Boolean ,
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 )
val rvc = false
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
2012-12-13 20:45:42 +01:00
class Tile ( resetSignal : Bool = null ) ( confIn : RocketConfiguration ) extends Component ( resetSignal ) with ClientCoherenceAgent
2012-03-25 00:56:59 +01:00
{
2012-11-18 02:24:08 +01:00
val memPorts = 2 + confIn . vec
2013-03-20 22:05:12 +01:00
val dcachePortId = 0
val icachePortId = 1
val vicachePortId = 2
2012-11-18 02:24:08 +01:00
implicit val dcConf = confIn . dcache . copy ( reqtagbits = confIn . dcacheReqTagBits + log2Up ( memPorts ) , databits = confIn . xprlen )
2013-01-07 22:38:59 +01:00
implicit val lnConf = confIn . lnConf
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
2012-11-06 17:13:44 +01:00
val core = new Core
2013-01-16 00:50:37 +01:00
val icache = new Frontend ( ) ( confIn . icache , lnConf )
2012-10-08 07:37:29 +02:00
val dcache = new HellaCache
2012-03-25 00:56:59 +01:00
2013-07-10 00:31:39 +02:00
val arbiter = new UncachedTileLinkIOArbiterThatAppendsArbiterId ( memPorts , confIn . dcache . co )
2013-03-20 22:05:12 +01:00
arbiter . io . in ( dcachePortId ) <> dcache . io . mem
arbiter . io . in ( icachePortId ) <> icache . io . mem
2012-03-25 00:56:59 +01:00
2013-03-20 22:05:12 +01:00
io . tilelink . acquire <> arbiter . io . out . acquire
arbiter . io . out . grant <> io . tilelink . grant
io . tilelink . grant_ack <> arbiter . 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
io . tilelink . release . meta . bits . payload . client_xact_id : = Cat ( dcache . io . mem . release . meta . bits . payload . client_xact_id , UFix ( dcachePortId , log2Up ( memPorts ) ) ) // Mimic client id extension done by UncachedTileLinkIOArbiter for Acquires from either client)
2012-03-25 00:56:59 +01:00
2013-03-26 03:09:08 +01:00
/* val ioSubBundles = io.tilelink.getClass.getMethods.filter( x =>
2013-01-27 20:27:09 +01:00
classOf [ ClientSourcedIO [ Data ] ] . isAssignableFrom ( x . getReturnType ) ) . map { m =>
m . invoke ( io . tilelink ) . asInstanceOf [ ClientSourcedIO [ LogicalNetworkIO [ Data ] ] ] }
2013-01-27 19:59:41 +01:00
ioSubBundles . foreach { m =>
m . bits . header . dst : = UFix ( 0 )
m . bits . header . src : = UFix ( 0 )
2013-03-26 03:09:08 +01:00
} */
2013-01-27 19:59:41 +01:00
2012-11-18 02:24:08 +01:00
if ( conf . vec ) {
2013-01-16 00:50:37 +01:00
val vicache = new Frontend ( ) ( ICacheConfig ( 128 , 1 , conf . co ) , lnConf ) // 128 sets x 1 ways (8KB)
2013-03-20 22:05:12 +01:00
arbiter . io . in ( vicachePortId ) <> vicache . io . mem
2012-11-06 17:13:44 +01:00
core . io . vimem <> vicache . io . cpu
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
core . io . dmem <> dcache . io . cpu
2012-03-25 00:56:59 +01:00
}