blob: 5fc778fbbf7f2216ee7435f5c479fe4fa30c3a40 (
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
|
// See LICENSE for license details.
/** LFSRs in all shapes and sizes.
*/
package chisel3.util
import chisel3._
import chisel3.internal.naming.chiselName // can't use chisel3_ version because of compile order
import chisel3.util.random.FibonacciLFSR
/** LFSR16 generates a 16-bit linear feedback shift register, returning the register contents.
* This is useful for generating a pseudo-random sequence.
*
* The example below, taken from the unit tests, creates two 4-sided dice using `LFSR16` primitives:
* @example {{{
* val bins = Reg(Vec(8, UInt(32.W)))
*
* // Create two 4 sided dice and roll them each cycle.
* // Use tap points on each LFSR so values are more independent
* val die0 = Cat(Seq.tabulate(2) { i => LFSR16()(i) })
* val die1 = Cat(Seq.tabulate(2) { i => LFSR16()(i + 2) })
*
* val rollValue = die0 +& die1 // Note +& is critical because sum will need an extra bit.
*
* bins(rollValue) := bins(rollValue) + 1.U
*
* }}}
*/
// scalastyle:off magic.number
@deprecated("LFSR16 is deprecated in favor of the parameterized chisel3.util.random.LFSR", "3.2")
object LFSR16 {
/** Generates a 16-bit linear feedback shift register, returning the register contents.
* @param increment optional control to gate when the LFSR updates.
*/
@deprecated("Use chisel3.util.random.LFSR(16) for a 16-bit LFSR", "3.2")
@chiselName
def apply(increment: Bool = true.B): UInt =
VecInit( FibonacciLFSR
.maxPeriod(16, increment, seed = Some(BigInt(1) << 15))
.asBools
.reverse )
.asUInt
}
// scalastyle:on magic.number
|