blob: 5c2412ae036dd873b9eb5f6529e1f7f87341a950 (
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
62
63
64
65
66
67
|
// See LICENSE for license details.
package firrtlTests.transforms
import firrtl._
import firrtlTests.FirrtlFlatSpec
import firrtlTests.FirrtlCheckers._
class LegalizeClocksTransformSpec extends FirrtlFlatSpec {
def compile(input: String): CircuitState =
(new MinimumVerilogCompiler).compileAndEmit(CircuitState(parse(input), ChirrtlForm), Nil)
behavior of "LegalizeClocksTransform"
it should "not emit @(posedge 1'h0) for stop" in {
val input =
"""circuit test :
| module test :
| stop(asClock(UInt(1)), UInt(1), 1)
|""".stripMargin
val result = compile(input)
result should containLine (s"always @(posedge _GEN_0) begin")
result.getEmittedCircuit.value shouldNot include ("always @(posedge 1")
}
it should "not emit @(posedge 1'h0) for printf" in {
val input =
"""circuit test :
| module test :
| printf(asClock(UInt(1)), UInt(1), "hi")
|""".stripMargin
val result = compile(input)
result should containLine (s"always @(posedge _GEN_0) begin")
result.getEmittedCircuit.value shouldNot include ("always @(posedge 1")
}
it should "not emit @(posedge 1'h0) for reg" in {
val input =
"""circuit test :
| module test :
| output out : UInt<8>
| input in : UInt<8>
| reg r : UInt<8>, asClock(UInt(0))
| r <= in
| out <= r
|""".stripMargin
val result = compile(input)
result should containLine (s"always @(posedge _GEN_0) begin")
result.getEmittedCircuit.value shouldNot include ("always @(posedge 1")
}
it should "deduplicate injected nodes for literal clocks" in {
val input =
"""circuit test :
| module test :
| printf(asClock(UInt(1)), UInt(1), "hi")
| stop(asClock(UInt(1)), UInt(1), 1)
|""".stripMargin
val result = compile(input)
result should containLine (s"wire _GEN_0;")
// Check that there's only 1 _GEN_0 instantiation
val verilog = result.getEmittedCircuit.value
val matches = "wire\\s+_GEN_0;".r.findAllIn(verilog)
matches.size should be (1)
}
}
|