blob: 4b21840ed6b0b3a89bc6f38bbdd8b73f49386670 (
plain)
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
58
59
60
61
|
// SPDX-License-Identifier: Apache-2.0
package chiselTests
import chisel3._
import chisel3.stage.ChiselStage
class HasDeadCodeChild(withDontTouch: Boolean) extends Module {
val io = IO(new Bundle {
val a = Input(UInt(32.W))
val b = Output(UInt(32.W))
val c = Output(Vec(2, UInt(32.W)))
})
io.b := io.a
io.c := DontCare
if (withDontTouch) {
dontTouch(io.c)
}
}
class HasDeadCode(withDontTouch: Boolean) extends Module {
val io = IO(new Bundle {
val a = Input(UInt(32.W))
val b = Output(UInt(32.W))
})
val inst = Module(new HasDeadCodeChild(withDontTouch))
inst.io.a := io.a
io.b := inst.io.b
val dead = WireDefault(io.a + 1.U)
if (withDontTouch) {
dontTouch(dead)
}
}
class DontTouchSpec extends ChiselFlatSpec with Utils {
val deadSignals = List(
"io_c_0",
"io_c_1",
"dead"
)
"Dead code" should "be removed by default" in {
val verilog = compile(new HasDeadCode(false))
for (signal <- deadSignals) {
(verilog should not).include(signal)
}
}
it should "NOT be removed if marked dontTouch" in {
val verilog = compile(new HasDeadCode(true))
for (signal <- deadSignals) {
verilog should include(signal)
}
}
"Dont touch" should "only work on bound hardware" in {
a[chisel3.BindingException] should be thrownBy extractCause[BindingException] {
ChiselStage.elaborate(new Module {
val io = IO(new Bundle {})
dontTouch(new Bundle { val a = UInt(32.W) })
})
}
}
}
|