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
68
69
70
71
72
73
|
// SPDX-License-Identifier: Apache-2.0
package firrtl.annotations
import firrtl.{
MemoryArrayInit,
MemoryEmissionOption,
MemoryFileInlineInit,
MemoryInitValue,
MemoryRandomInit,
MemoryScalarInit,
Utils
}
/**
* Represents the initial value of the annotated memory.
* While not supported on normal ASIC flows, it can be useful for simulation and FPGA flows.
* This annotation is consumed by the verilog emitter.
*/
sealed trait MemoryInitAnnotation extends SingleTargetAnnotation[ReferenceTarget] with MemoryEmissionOption {
def isRandomInit: Boolean
}
/** Randomly initialize the `target` memory. This is the same as the default behavior. */
case class MemoryRandomInitAnnotation(target: ReferenceTarget) extends MemoryInitAnnotation {
override def duplicate(n: ReferenceTarget): Annotation = copy(n)
override def initValue: MemoryInitValue = MemoryRandomInit
override def isRandomInit: Boolean = true
override private[firrtl] def dedup: Option[(Any, Annotation, ReferenceTarget)] = Some(
((target.pathlessTarget, Nil), copy(target = target.pathlessTarget), target)
)
}
/** Initialize all entries of the `target` memory with the scalar `value`. */
case class MemoryScalarInitAnnotation(target: ReferenceTarget, value: BigInt) extends MemoryInitAnnotation {
override def duplicate(n: ReferenceTarget): Annotation = copy(n)
override def initValue: MemoryInitValue = MemoryScalarInit(value)
override def isRandomInit: Boolean = false
override private[firrtl] def dedup: Option[(Any, Annotation, ReferenceTarget)] = Some(
((target.pathlessTarget, value), copy(target = target.pathlessTarget), target)
)
}
/** Initialize the `target` memory with the array of `values` which must be the same size as the memory depth. */
case class MemoryArrayInitAnnotation(target: ReferenceTarget, values: Seq[BigInt]) extends MemoryInitAnnotation {
override def duplicate(n: ReferenceTarget): Annotation = copy(n)
override def initValue: MemoryInitValue = MemoryArrayInit(values)
override def isRandomInit: Boolean = false
override private[firrtl] def dedup: Option[(Any, Annotation, ReferenceTarget)] = Some(
((target.pathlessTarget, values), copy(target = target.pathlessTarget), target)
)
}
/** Initialize the `target` memory with inline readmem[hb] statement. */
case class MemoryFileInlineAnnotation(
target: ReferenceTarget,
filename: String,
hexOrBinary: MemoryLoadFileType.FileType = MemoryLoadFileType.Hex)
extends MemoryInitAnnotation {
require(filename.trim.nonEmpty, "empty filename not allowed in MemoryFileInlineAnnotation")
override def duplicate(n: ReferenceTarget): Annotation = copy(n)
override def initValue: MemoryInitValue = MemoryFileInlineInit(filename, hexOrBinary)
override def isRandomInit: Boolean = false
override private[firrtl] def dedup: Option[(Any, Annotation, ReferenceTarget)] = Some(
((target.pathlessTarget, filename), copy(target = target.pathlessTarget), target)
)
}
/** Initializes the memory inside the `ifndef SYNTHESIS` block (default) */
case object MemoryNoSynthInit extends NoTargetAnnotation
/** Initializes the memory outside the `ifndef SYNTHESIS` block */
case object MemorySynthInit extends NoTargetAnnotation
|