-
Notifications
You must be signed in to change notification settings - Fork 218
/
TwoAdders.scala
57 lines (46 loc) · 1.29 KB
/
TwoAdders.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//See LICENSE for license details.
package firesim.midasexamples
import chisel3._
import org.chipsalliance.cde.config.Parameters
import chisel3.experimental.annotate
import midas.targetutils._
class AdderIO extends Bundle {
val x = Input(UInt(16.W))
val y = Input(UInt(16.W))
val z = Output(UInt(16.W))
}
class PipeAdder extends Module {
val io = IO(new AdderIO)
val mem = Mem(2, UInt(16.W))
mem.write(1.U, io.x + io.y)
val memout = mem.read(1.U)
io.z := memout
}
class DoublePipeAdder extends Module {
val io = IO(new AdderIO)
val logic = Module(new PipeAdder)
logic.io.x := io.x
logic.io.y := io.y
io.z := RegNext(logic.io.z)
}
class TwoAddersDUT extends Module {
val io = IO(new Bundle {
val i0 = Input(UInt(16.W))
val i1 = Input(UInt(16.W))
val i2 = Input(UInt(16.W))
val i3 = Input(UInt(16.W))
val o0 = Output(UInt(16.W))
val o1 = Output(UInt(16.W))
})
val a0 = Module(new DoublePipeAdder)
annotate(EnableModelMultiThreadingAnnotation(a0))
a0.io.x := io.i0
a0.io.y := io.i1
io.o0 := a0.io.z
val a1 = Module(new DoublePipeAdder)
annotate(EnableModelMultiThreadingAnnotation(a1))
a1.io.x := io.i2
a1.io.y := io.i3
io.o1 := a1.io.z
}
class TwoAdders(implicit p: Parameters) extends PeekPokeMidasExampleHarness(() => new TwoAddersDUT)