[chisel-tutorial] LFSR16.scala

YumeIroVillain·2023년 8월 7일
0

Chisel 독학

목록 보기
17/44
post-custom-banner

// 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 ----------
}

LFSR16Tests.scala

// 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))
  }
}

What I learned

  • printf(peek(c.io.out).toString(2))
    c.io.out이 cycle마다 어떻게 변화하는지 추적하기 위해,
    를 수행하면

    peek(c.io.out)가 BigInt 자료형이라서, 16비트만 나오는게 아니라, 무지막지하게 긴 수가 출력되는 문제가 있다.
    이렇게 되면, 어디서부터 어디까지가 맞는 값인지 도무지 알 수 없다.
    어떻게 printf 디버깅을 할 수 있을까?
  • Cat(high bit, low bit) 함수를 사용하여, concatenate를 사용할 수 있다.
    참조
profile
HW SW 둘다 공부하는 혼종의 넋두리 블로그 / SKKU SSE 17 / SWM 11th
post-custom-banner

0개의 댓글