Skip to content

Commit 359b71d

Browse files
committed
feat: rewrite all the components
1 parent 600bc6c commit 359b71d

37 files changed

+1546
-19
lines changed
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
package sim
2+
3+
import chisel3._
4+
import chisel3.util._
5+
import treecorel2._
6+
import treecorel2.common.AXI4Config
7+
8+
class AXI4Bridge extends Module with AXI4Config {
9+
val io = IO(new Bundle {
10+
val socEn = Input(Bool())
11+
val runEn = Output(Bool())
12+
val dxchg = Flipped(new DXCHGIO)
13+
val axi = if (SoCEna) new SOCAXI4IO else new AXI4IO
14+
})
15+
16+
protected val runEn = RegInit(false.B)
17+
io.runEn := Mux(reset.asBool(), false.B, runEn)
18+
19+
// handshake
20+
protected val awHdShk = io.axi.aw.valid && io.axi.aw.ready
21+
protected val wHdShk = io.axi.w.valid && io.axi.w.ready
22+
protected val bHdShk = io.axi.b.valid && io.axi.b.ready
23+
protected val arHdShk = io.axi.ar.valid && io.axi.ar.ready
24+
protected val rHdShk = io.axi.r.valid && io.axi.r.ready
25+
protected val arbiter = new Arbiter
26+
27+
// FSM for read/write
28+
protected val eumIDLE :: eumStandby :: eumIDLE2 :: eumAW :: eumW :: eumB :: eumAR :: eumR :: Nil = Enum(8)
29+
30+
protected val stateReg = RegInit(eumIDLE)
31+
32+
switch(stateReg) {
33+
is(eumIDLE) {
34+
arbiter.finished := false.B
35+
arbiter.ren := io.dxchg.ren
36+
arbiter.raddr := io.dxchg.raddr
37+
arbiter.rdata := io.dxchg.rdata
38+
arbiter.rsize := io.dxchg.rsize
39+
arbiter.wen := io.dxchg.wen
40+
arbiter.waddr := io.dxchg.waddr
41+
arbiter.wdata := io.dxchg.wdata
42+
arbiter.wmask := io.dxchg.wmask
43+
stateReg := eumStandby
44+
}
45+
is(eumStandby) {
46+
when(arbiter.finished) {
47+
runEn := true.B
48+
stateReg := eumIDLE2
49+
}.elsewhen(arbiter.wen) {
50+
stateReg := eumAW
51+
}.elsewhen(arbiter.ren) {
52+
stateReg := eumAR
53+
}.otherwise {
54+
arbiter.finished := true.B
55+
stateReg := eumStandby
56+
}
57+
}
58+
is(eumIDLE2) {
59+
runEn := false.B
60+
stateReg := eumIDLE
61+
}
62+
is(eumAR) {
63+
when(io.axi.ar.ready) {
64+
stateReg := eumR
65+
}
66+
}
67+
is(eumR) {
68+
when(rHdShk) {
69+
arbiter.rdata := io.axi.r.bits.data
70+
arbiter.finished := true.B
71+
stateReg := eumStandby
72+
}
73+
}
74+
is(eumAW) {
75+
when(awHdShk) {
76+
stateReg := eumW
77+
}
78+
}
79+
is(eumW) {
80+
when(wHdShk) {
81+
stateReg := eumB
82+
}
83+
}
84+
is(eumB) {
85+
when(bHdShk) {
86+
arbiter.finished := true.B
87+
stateReg := eumStandby
88+
}
89+
}
90+
}
91+
92+
protected val wMask = arbiter.wmask
93+
protected val bitCnt = wMask(7) + wMask(6) + wMask(5) + wMask(4) + wMask(3) + wMask(2) + wMask(1) + wMask(0)
94+
95+
protected val socARSize = arbiter.rsize
96+
protected val socAWSize = MuxLookup(
97+
bitCnt,
98+
0.U,
99+
Array(
100+
8.U -> 3.U,
101+
4.U -> 2.U,
102+
2.U -> 1.U,
103+
1.U -> 0.U
104+
)
105+
)
106+
107+
protected val arSize = Mux(io.socEn, socARSize, 3.U)
108+
protected val awSize = Mux(io.socEn, socAWSize, 3.U)
109+
protected val addrMask = Mux(io.socEn, "hffffffffffffffff".U(64.W), "hfffffffffffffff8".U(64.W))
110+
when(stateReg === eumAR) {
111+
io.axi.ar.valid := true.B
112+
io.axi.ar.bits.size := arSize
113+
io.axi.ar.bits.addr := arbiter.raddr & addrMask
114+
io.axi.r.ready := false.B
115+
io.axi.aw.valid := false.B
116+
io.axi.aw.bits.size := 0.U
117+
io.axi.aw.bits.addr := 0.U
118+
io.axi.w.valid := false.B
119+
io.axi.w.bits.strb := 0.U
120+
io.axi.w.bits.data := 0.U
121+
io.axi.b.ready := false.B
122+
123+
}.elsewhen(stateReg === eumR) {
124+
io.axi.ar.valid := false.B
125+
io.axi.ar.bits.size := arSize
126+
io.axi.ar.bits.addr := arbiter.raddr & addrMask
127+
io.axi.r.ready := true.B
128+
io.axi.aw.valid := false.B
129+
io.axi.aw.bits.size := 0.U
130+
io.axi.aw.bits.addr := 0.U
131+
io.axi.w.valid := false.B
132+
io.axi.w.bits.strb := 0.U
133+
io.axi.w.bits.data := 0.U
134+
io.axi.b.ready := false.B
135+
136+
}.elsewhen(stateReg === eumAW) {
137+
io.axi.ar.valid := false.B
138+
io.axi.ar.bits.size := 0.U
139+
io.axi.ar.bits.addr := 0.U
140+
io.axi.r.ready := false.B
141+
io.axi.aw.valid := true.B
142+
io.axi.aw.bits.size := awSize
143+
io.axi.aw.bits.addr := arbiter.waddr & addrMask
144+
io.axi.w.valid := false.B
145+
io.axi.w.bits.strb := 0.U
146+
io.axi.w.bits.data := 0.U
147+
io.axi.b.ready := false.B
148+
149+
}.elsewhen(stateReg === eumW) {
150+
io.axi.ar.valid := false.B
151+
io.axi.ar.bits.size := 0.U
152+
io.axi.ar.bits.addr := 0.U
153+
io.axi.r.ready := false.B
154+
io.axi.aw.valid := false.B
155+
io.axi.aw.bits.size := awSize
156+
io.axi.aw.bits.addr := arbiter.waddr & addrMask
157+
io.axi.w.valid := true.B
158+
io.axi.w.bits.strb := wMask
159+
io.axi.w.bits.data := arbiter.wdata
160+
io.axi.b.ready := false.B
161+
162+
}.elsewhen(stateReg === eumB) {
163+
io.axi.ar.valid := false.B
164+
io.axi.ar.bits.size := 0.U
165+
io.axi.ar.bits.addr := 0.U
166+
io.axi.r.ready := false.B
167+
io.axi.aw.valid := false.B
168+
io.axi.aw.bits.size := 0.U
169+
io.axi.aw.bits.addr := 0.U
170+
io.axi.w.valid := false.B
171+
io.axi.w.bits.strb := 0.U
172+
io.axi.w.bits.data := 0.U
173+
io.axi.b.ready := true.B
174+
175+
}.otherwise {
176+
io.axi.ar.valid := false.B
177+
io.axi.ar.bits.size := 0.U
178+
io.axi.ar.bits.addr := 0.U
179+
io.axi.r.ready := false.B
180+
io.axi.aw.valid := false.B
181+
io.axi.aw.bits.size := 0.U
182+
io.axi.aw.bits.addr := 0.U
183+
io.axi.w.valid := false.B
184+
io.axi.w.bits.strb := 0.U
185+
io.axi.w.bits.data := 0.U
186+
io.axi.b.ready := false.B
187+
188+
}
189+
190+
if (!SoCEna) {
191+
val sim = io.axi.asInstanceOf[AXI4IO]
192+
sim.ar.bits.prot := 0.U
193+
sim.ar.bits.id := 0.U
194+
sim.ar.bits.len := 0.U
195+
sim.ar.bits.burst := 1.U
196+
sim.ar.bits.lock := 0.U
197+
sim.ar.bits.cache := 0.U
198+
sim.ar.bits.qos := 0.U
199+
sim.ar.bits.user := DontCare
200+
sim.aw.bits.prot := 0.U
201+
sim.aw.bits.id := 0.U
202+
sim.aw.bits.len := 0.U
203+
sim.aw.bits.burst := 1.U
204+
sim.aw.bits.lock := false.B
205+
sim.aw.bits.cache := 0.U
206+
sim.aw.bits.qos := 0.U
207+
sim.aw.bits.user := DontCare
208+
sim.w.bits.last := 1.U
209+
210+
} else {
211+
io.axi.ar.bits.id := 0.U
212+
io.axi.ar.bits.len := 0.U
213+
io.axi.ar.bits.burst := 1.U
214+
io.axi.aw.bits.id := 0.U
215+
io.axi.aw.bits.len := 0.U
216+
io.axi.aw.bits.burst := 1.U
217+
io.axi.w.bits.last := 1.U
218+
219+
}
220+
221+
io.dxchg.rdata := arbiter.rdata
222+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package sim
2+
3+
import chisel3._
4+
import chisel3.util._
5+
6+
class Arbiter {
7+
val finished = RegInit(false.B)
8+
val ren = RegInit(false.B)
9+
val raddr = RegInit(0.U(64.W))
10+
val rdata = RegInit(0.U(64.W))
11+
val rsize = RegInit(0.U(3.W))
12+
val wen = RegInit(false.B)
13+
val waddr = RegInit(0.U(64.W))
14+
val wdata = RegInit(0.U(64.W))
15+
val wmask = RegInit(0.U(8.W))
16+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package treecorel2
2+
3+
import chisel3._
4+
import chisel3.util._
5+
6+
class Crossbar extends Module {
7+
val io = IO(new Bundle {
8+
val socEn = Input(Bool())
9+
val runEn = Input(Bool())
10+
val dxchg = new DXCHGIO
11+
val core = new COREIO
12+
})
13+
14+
protected val globalEn = RegInit(false.B)
15+
protected val inst = RegInit(0.U(32.W))
16+
protected val rdInst = Mux(io.core.fetch.addr(2).asBool(), io.dxchg.rdata(63, 32), io.dxchg.rdata(31, 0))
17+
18+
io.core.globalEn := Mux(io.runEn, globalEn, false.B)
19+
io.core.fetch.data := inst
20+
io.core.ld.data := io.dxchg.rdata
21+
22+
// FSM for inst or mem data xform
23+
protected val eumInst :: eumMem :: Nil = Enum(2)
24+
protected val stateReg = RegInit(eumInst)
25+
26+
switch(stateReg) {
27+
is(eumInst) {
28+
when(io.runEn) {
29+
stateReg := eumMem
30+
globalEn := true.B
31+
inst := rdInst
32+
}
33+
}
34+
is(eumMem) {
35+
when(io.runEn) {
36+
stateReg := eumInst
37+
globalEn := false.B
38+
inst := 0x13.U
39+
}
40+
}
41+
}
42+
43+
protected val instSize = Mux(io.socEn, 2.U, 3.U)
44+
// because the difftest's logic addr is 0x000000
45+
protected val addrOffset = Mux(io.socEn, "h0000000000000000".U(64.W), "h0000000080000000".U(64.W))
46+
47+
protected val instAddr = io.core.fetch.addr - addrOffset
48+
protected val loadAddr = io.core.ld.addr - addrOffset
49+
protected val storeAddr = io.core.sd.addr - addrOffset
50+
protected val maEn = io.core.ld.en || io.core.sd.en
51+
52+
io.dxchg.clk := clock
53+
io.dxchg.ren := ((stateReg === eumInst) || (stateReg === eumMem && maEn))
54+
io.dxchg.raddr := Mux(stateReg === eumInst, instAddr, loadAddr)
55+
io.dxchg.rsize := Mux(stateReg === eumMem && io.core.ld.en, io.core.ld.size, instSize)
56+
io.dxchg.waddr := storeAddr
57+
io.dxchg.wdata := io.core.sd.data
58+
io.dxchg.wmask := io.core.sd.mask
59+
io.dxchg.wen := stateReg === eumMem && io.core.sd.en
60+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package treecorel2.common
2+
3+
import chisel3._
4+
import chisel3.util._
5+
6+
trait AXI4Config extends InstConfig {}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package treecorel2.common
2+
3+
import chisel3._
4+
5+
object ConstVal {
6+
val CSRAddrLen = 12
7+
val CLINTAddrLen = 64
8+
// csr addr
9+
val mhartidAddr = 0xf14.U(CSRAddrLen.W)
10+
val mstatusAddr = 0x300.U(CSRAddrLen.W)
11+
val mieAddr = 0x304.U(CSRAddrLen.W)
12+
val mtvecAddr = 0x305.U(CSRAddrLen.W)
13+
val mscratchAddr = 0x340.U(CSRAddrLen.W)
14+
val mepcAddr = 0x341.U(CSRAddrLen.W)
15+
val mcauseAddr = 0x342.U(CSRAddrLen.W)
16+
val mipAddr = 0x344.U(CSRAddrLen.W)
17+
val mcycleAddr = 0xb00.U(CSRAddrLen.W)
18+
val medelegAddr = 0x302.U(CSRAddrLen.W)
19+
20+
val ClintBaseAddr = 0x02000000.U(CLINTAddrLen.W)
21+
val ClintBoundAddr = 0x0200bfff.U(CLINTAddrLen.W)
22+
val MSipOffset = 0x0.U(CLINTAddrLen.W)
23+
val MTimeOffset = 0xbff8.U(CLINTAddrLen.W)
24+
val MTimeCmpOffset = 0x4000.U(CLINTAddrLen.W)
25+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package treecorel2.common
2+
3+
import chisel3._
4+
import chisel3.util._
5+
6+
trait InstConfig {
7+
val SoCEna = false
8+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package treecorel2
2+
3+
import chisel3._
4+
import chisel3.util._
5+
6+
// be careful to call this func, need to set the right msb val!!!
7+
// to minify the wire unused pin and bits in verilator
8+
object SignExt {
9+
def apply(a: UInt, len: Int) = {
10+
val aLen = a.getWidth
11+
val signBit = a(aLen - 1)
12+
if (aLen >= len) a(len - 1, 0) else Cat(Fill(len - aLen, signBit), a)
13+
}
14+
}
15+
16+
object ZeroExt {
17+
def apply(a: UInt, len: Int) = {
18+
val aLen = a.getWidth
19+
if (aLen >= len) a(len - 1, 0) else Cat(0.U((len - aLen).W), a)
20+
}
21+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package treecorel2
2+
3+
import chisel3._
4+
import chisel3.util._
5+
6+
// generate low speed clock
7+
class Timer(div: Int = 5) extends Module {
8+
val io = IO(new Bundle {
9+
val tick = Output(Bool())
10+
})
11+
12+
require(div > 0)
13+
require(div < 15)
14+
protected val clockCnt = RegInit(1.U(4.W))
15+
protected val tickTrigger = clockCnt === div.U
16+
17+
when(tickTrigger) {
18+
clockCnt := 1.U
19+
}.otherwise {
20+
clockCnt := clockCnt + 1.U
21+
}
22+
23+
io.tick := tickTrigger
24+
}

0 commit comments

Comments
 (0)