11package treecorel2
22
33import chisel3 ._
4- import chisel3 .util ._
5-
6- object CacheConfig {
7- val ICacheSize = (256 * 1024 )
8- val DCacheSize = (256 * 1024 )
9- val LineSize = 256
10- val NWay = 4
11- val NBAN = 4
12- val IdLen = 1
13- }
14-
15- class CACHEREQIO extends Bundle {
16- val addr = UInt (64 .W )
17- val data = UInt (64 .W )
18- val mask = UInt ((64 / 8 ).W )
19- val op = UInt (1 .W ) // 0: rd 1: wr
20- }
21-
22- class CACHERESPIO extends Bundle {
23- val data = UInt (64 .W )
24- val cmd = UInt (4 .W )
25- }
26-
27- class MEMREQIO extends Bundle {
28- val addr = UInt (64 .W )
29- val data = UInt (64 .W )
30- val cmd = UInt (4 .W )
31- val len = UInt (2 .W ) // 0: 1(64bits) 1: 2 2: 4 3: 8
32- val id = UInt (CacheConfig .IdLen .W )
33- }
34-
35- class MEMRESPIO extends Bundle {
36- val data = UInt (64 .W )
37- val cmd = UInt (4 .W )
38- val id = UInt (CacheConfig .IdLen .W )
39- }
40-
41- class WAYINIO (val tagWidth : Int , val idxWidth : Int , val offsetWidth : Int ) extends Bundle {
42- val wt = Valid (new Bundle {
43- val tag = UInt (tagWidth.W )
44- val idx = UInt (idxWidth.W )
45- val offset = UInt (offsetWidth.W )
46- val v = UInt (1 .W )
47- val d = UInt (1 .W )
48- val mask = UInt (((CacheConfig .LineSize / CacheConfig .NBank ) / 8 ).W )
49- val data = UInt (64 .W )
50- val op = UInt (1 .W ) // must 1
51- })
52- val rd = Valid (new Bundle {
53- val idx = UInt (idxWidth.W )
54- val op = UInt (1 .W ) // must 0
55- })
56- }
57-
58- class WAYOUTIO (val tagWidth : Int ) extends Bundle {
59- val tag = UInt (tagWidth.W )
60- val v = UInt (1 .W )
61- val d = UInt (1 .W )
62- val data = Vec (CacheConfig .NBank , UInt ((CacheConfig .LineSize / CacheConfig .NBank ).W ))
63- }
64-
65- class Way (val tagWidth : Int , val idxWidth : Int , val offsetWidth : Int ) extends Module {
66- val io = IO (new Bundle {
67- val fence_invalid = Input (Bool ())
68- val in = Flipped (new WAYINIO (tagWidth, idxWidth, offsetWidth))
69- val out = Valid (new WAYOUTIO (tagWidth))
70- })
71-
72- val tag = UInt (tagWidth.W ) // tag
73- val v = UInt (1 .W ) // valid
74- val dirty = UInt (1 .W )
75- val depth = math.pow(2 , idxWidth).toInt
76-
77- val tagTable = SyncReadMem (depth, tag)
78- val vTable = RegInit (VecInit (Seq .fill(depth)(0 .U (1 .W ))))
79- val dirtyTable = RegInit (VecInit (Seq .fill(depth)(0 .U (1 .W ))))
80- // nBank * (n * 8bit)
81- val bankn = List .fill(CacheConfig .NBank )(SyncReadMem (depth, Vec ((CacheConfig .LineSize / CacheConfig .NBank ) / 8 , UInt (8 .W ))))
82-
83- val result = WireInit (0 .U .asTypeOf(new WAYOUTIO (tagWidth)))
84-
85- // read logic
86- // TODO: check data order in simulator
87- // tag,v, d, data
88- result := Cat (
89- List (tagTable.read(io.in.rd.bits.idx, io.in.rd.valid).asUInt()) ++ Seq (RegNext (vTable(io.in.rd.bits.idx), 0 .U (1 .W )), RegNext (dirtyTable(io.in.rd.bits.idx), 0 .U (1 .W ))) ++
90- bankn.map(_.read(io.in.rd.bits.idx, io.in.rd.valid).asUInt())
91- ).asTypeOf(new WAYOUTIO (tagWidth))
92-
93- io.out.bits := result
94- io.out.valid := RegNext (io.in.rd.valid, 0 .U )
95- dontTouch(io.out.valid)
96-
97- // write logic
98- // write bank data
99- val bank_sel = WireInit (io.in.wt.bits.offset(log2Ceil(64 / 8 ) + log2Ceil(CacheConfig .NBank ) - 1 , log2Ceil(64 / 8 )))
100- val wdata = io.in.wt.bits.data.asTypeOf(Vec (CacheConfig .LineSize / CacheConfig .NBank / 8 , UInt (8 .W )))
101- when(io.in.wt.fire()) {
102- when(io.in.wt.bits.op === 1 .U ) {
103- // write tag,v
104- tagTable.write(io.in.wt.bits.idx, io.in.wt.bits.tag)
105- vTable(io.in.wt.bits.idx) := io.in.wt.bits.v
106- // write d
107- dirtyTable(io.in.wt.bits.idx) := io.in.wt.bits.d
108- // write data
109- bankn.zipWithIndex.foreach((a) => {
110- val (bank, i) = a
111- when(bank_sel === i.U ) {
112- bank.write(io.in.wt.bits.idx, wdata, io.in.wt.bits.mask.asBools())
113- }
114- })
115- }
116- }.elsewhen(io.fence_invalid) {
117- vTable := VecInit (Seq .fill(depth)(0 .U (1 .W )))
118- }
119- }
120-
121- class CACHE2CPUIO extends Bundle {
122- val req = Flipped (Decoupled (new CACHEREQIO ))
123- val resp = Valid (new CACHERESPIO )
124- }
125-
126- class CACHE2MEMIO extends Bundle {
127- val req = Decoupled (new MEMREQIO )
128- val resp = Flipped (Decoupled (new MEMRESPIO ))
129- }
130-
131- class Cache extends Module {}
4+ import chisel3 .util ._
0 commit comments