summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main
diff options
context:
space:
mode:
authorSchuyler Eldridge2020-02-05 11:50:02 -0500
committerGitHub2020-02-05 16:50:02 +0000
commitb171f20d945487c79b18c18a2e8db98254f6e3e9 (patch)
tree4f30ff76966b3091883042106620e7c9946666c1 /chiselFrontend/src/main
parent509895c428f73b1c47e018df33e6cb64834e6e94 (diff)
Add information about widths to RegNext (#1318)
Adds additional Scaldoc to the RegNext object that (1) indicates that the width is not set and (2) shows an example of how to construct a RegNext-like construct with a set width. Signed-off-by: Schuyler Eldridge <schuyler.eldridge@ibm.com>
Diffstat (limited to 'chiselFrontend/src/main')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/Reg.scala35
1 files changed, 27 insertions, 8 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/Reg.scala b/chiselFrontend/src/main/scala/chisel3/Reg.scala
index a3e6b2a0..7129c389 100644
--- a/chiselFrontend/src/main/scala/chisel3/Reg.scala
+++ b/chiselFrontend/src/main/scala/chisel3/Reg.scala
@@ -48,11 +48,33 @@ object Reg {
}
+/** Utility for constructing one-cycle delayed versions of signals
+ *
+ * ''The width of a `RegNext` is not set based on the `next` or `init` connections'' for [[Element]] types. In the
+ * following example, the width of `bar` will not be set and will be inferred by the FIRRTL compiler.
+ * {{{
+ * val foo = Reg(UInt(4.W)) // width is 4
+ * val bar = RegNext(foo) // width is unset
+ * }}}
+ *
+ * If you desire an explicit width, do not use `RegNext` and instead use a register with a specified width:
+ * {{{
+ * val foo = Reg(UInt(4.W)) // width is 4
+ * val bar = Reg(chiselTypeOf(foo)) // width is 4
+ * bar := foo
+ * }}}
+ *
+ * Also note that a `RegNext` of a [[Bundle]] ''will have it's width set'' for [[Aggregate]] types.
+ * {{{
+ * class MyBundle extends Bundle {
+ * val x = UInt(4.W)
+ * }
+ * val foo = Wire(new MyBundle) // the width of foo.x is 4
+ * val bar = RegNext(foo) // the width of bar.x is 4
+ * }}}
+ */
object RegNext {
- /** Returns a register with the specified next and no reset initialization.
- *
- * Essentially a 1-cycle delayed version of the input signal.
- */
+ /** Returns a register ''with an unset width'' connected to the signal `next` and with no reset value. */
def apply[T <: Data](next: T)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): T = {
val model = (next match {
case next: Bits => next.cloneTypeWidth(Width())
@@ -66,10 +88,7 @@ object RegNext {
reg
}
- /** Returns a register with the specified next and reset initialization.
- *
- * Essentially a 1-cycle delayed version of the input signal.
- */
+ /** Returns a register ''with an unset width'' connected to the signal `next` and with the reset value `init`. */
def apply[T <: Data](next: T, init: T)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): T = {
val model = (next match {
case next: Bits => next.cloneTypeWidth(Width())