// with polynomial x^16 + x^14 + x^13 + x^11 + 1
라는 문제요구사항을 잘 모르겠어서, 해답을 참조했다.
+가 아니라 왠 XOR이(보통 XOR는 동그라미에 +로 표현하긴 하는데, 한계상 그렇게했나보긴한데..),
그리고 index 또한 0 2 3 5로, 16 14 13 11 0과 동떨어진 것이 나왔지만,
코드스타일 자체는 참고할 만 하다.
// See LICENSE.txt for license details.
package problems
import chisel3._
import chisel3.util.Cat
// Problem:
//
// Implement a 16-bit Fibonacci Linear-feedback shift register
// with polynomial x^16 + x^14 + x^13 + x^11 + 1
// State change is allowed only when 'inc' is asserted
//
class LFSR16 extends Module {
val io = IO(new Bundle {
val inc = Input(Bool())
val out = Output(UInt(16.W))
})
// Implement below ----------
val regs = RegInit(1.U(16.W))
when(io.inc){
val nxt_regs = Cat(regs(0)^regs(2)^regs(3)^regs(5), regs(15,1))
// registers(0):=registers(16)+registers(14)+registers(13)+registers(11)+1
regs := nxt_regs
}
io.out := regs
// Implement above ----------
}
// See LICENSE.txt for license details.
package problems
import chisel3.iotesters.PeekPokeTester
class LFSR16Tests(c: LFSR16) extends PeekPokeTester(c) {
var res = 1
for (t <- 0 until 16) {
val inc = rnd.nextInt(2)
poke(c.io.inc, inc)
step(1)
if (inc == 1) {
val bit = ((res >> 0) ^ (res >> 2) ^ (res >> 3) ^ (res >> 5) ) & 1
res = (res >> 1) | (bit << 15)
}
expect(c.io.out, res)
// printf(peek(c.io.out).toString(2))
}
}
printf(peek(c.io.out).toString(2))
c.io.out이 cycle마다 어떻게 변화하는지 추적하기 위해,