diff options
| author | Stevo | 2017-01-30 12:17:33 -0800 |
|---|---|---|
| committer | Richard Lin | 2017-01-30 12:17:33 -0800 |
| commit | 770c5671744502ba7865a41472972388b2fade2c (patch) | |
| tree | 6a184aaf98e3285d8d0582170217c25ef57bd67a /src | |
| parent | ba568946dd8ac28d5d3caf217647c2597564574d (diff) | |
Add shift register with reset (#439)
* [stevo]: add reset initialization to shift register
* [stevo]: better comment
* [stevo]: add tests, fix bug
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/chisel3/util/Reg.scala | 16 | ||||
| -rw-r--r-- | src/test/scala/chiselTests/Reg.scala | 32 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/main/scala/chisel3/util/Reg.scala b/src/main/scala/chisel3/util/Reg.scala index 00005e3a..27785dfb 100644 --- a/src/main/scala/chisel3/util/Reg.scala +++ b/src/main/scala/chisel3/util/Reg.scala @@ -61,4 +61,20 @@ object ShiftRegister in } } + + /** Returns the n-cycle delayed version of the input signal with reset initialization. + * + * @param in input to delay + * @param n number of cycles to delay + * @param resetData reset value for each register in the shift + * @param en enable the shift + */ + def apply[T <: Data](in: T, n: Int, resetData: T, en: Bool): T = { + // The order of tests reflects the expected use cases. + if (n != 0) { + RegEnable(apply(in, n-1, resetData, en), resetData, en) + } else { + in + } + } } diff --git a/src/test/scala/chiselTests/Reg.scala b/src/test/scala/chiselTests/Reg.scala index 43e64fe7..ef66c30a 100644 --- a/src/test/scala/chiselTests/Reg.scala +++ b/src/test/scala/chiselTests/Reg.scala @@ -4,7 +4,9 @@ package chiselTests import firrtl.ir.Input import org.scalatest._ +import org.scalatest.prop._ import chisel3._ +import chisel3.util._ import chisel3.core.DataMirror import chisel3.testers.BasicTester @@ -46,3 +48,33 @@ class RegSpec extends ChiselFlatSpec { elaborate{ new RegForcedWidthTester } } } + +class ShiftTester(n: Int) extends BasicTester { + val (cntVal, done) = Counter(true.B, n) + val start = 23.U + val sr = ShiftRegister(cntVal + start, n) + when(done) { + assert(sr === start) + stop() + } +} + +class ShiftResetTester(n: Int) extends BasicTester { + val (cntVal, done) = Counter(true.B, n-1) + val start = 23.U + val sr = ShiftRegister(cntVal + 23.U, n, 1.U, true.B) + when(done) { + assert(sr === 1.U) + stop() + } +} + +class ShiftRegisterSpec extends ChiselPropSpec { + property("ShiftRegister should shift") { + forAll(smallPosInts) { (shift: Int) => assertTesterPasses{ new ShiftTester(shift) } } + } + + property("ShiftRegister should reset all values inside") { + forAll(smallPosInts) { (shift: Int) => assertTesterPasses{ new ShiftResetTester(shift) } } + } +} |
