[chisel-tutorial] MaxN: reduceLeft 사용 및 Testcase 생성

YumeIroVillain·2023년 8월 7일
0

Chisel 독학

목록 보기
19/44

Max2와 마찬가지로, Testcase를 제작하는 문제이다.

reduceLeft라는 생소한 함수를 처음 알게 되었다.
iterative 가능한 Vec 같은 자료구조에서, 쭉 동일한 op를 해나가기 위한 함수로 이해하였다.출처

모듈 코드

// See LICENSE.txt for license details.
package problems

import chisel3._

// Problem:
//
// Implement test for this module. Please edit:
// .../chisel-tutorial/src/test/scala/problems/MaxNTests.scala
//
class MaxN(val n: Int, val w: Int) extends Module {

  private def Max2(x: UInt, y: UInt) = Mux(x > y, x, y)

  val io = IO(new Bundle {
    val ins = Input(Vec(n, UInt(w.W)))
    val out = Output(UInt(w.W))
  })
  io.out := io.ins.reduceLeft(Max2)
  // https://stackoverflow.com/questions/75702209/reduceleft-or-foldleft-vs-reduceright-or-foldright-in-scala
  // list(x1, x2, ..., xn).reduceLeft(op)
  // == x1.op(x2)....op(xn)
  // 즉, ins(1).Max2(ins(2)).Max2(ins(3))....Max2(insn)
}

테스트 코드

// See LICENSE.txt for license details.
package problems

import chisel3.iotesters.PeekPokeTester

// Problem:
//
// Implement test for MaxN using PeekPokeTester
//
class MaxNTests(c: MaxN) extends PeekPokeTester(c) {
  for (t <- 0 until 10) {
    printf("%dth TEST\n", t)
    var mx = 0
    for (i <- 0 until c.n) {
      // Implement below ----------
      val testcase = rnd.nextInt(2^c.w - 1)
      printf("%dth input: %d\n", i, testcase)
      poke(c.io.ins(i), testcase)
      if(mx < testcase) mx = testcase
      // Implement above ----------
    }
    step(1)
    // Implement below ----------
    val out = peek(c.io.out).toInt
    printf("biggest: %d\n", mx)
    printf("output: %d\n", out)
    expect(c.io.out, mx)
    // Implement above ----------
  }
}

What I learned

  • Input(Vec(n, UInt(w.W))) 를 통해
    w의 너비를 가지는 n개의 input port을 즉시 생성할 수 있다.
    변수 Naming은 알아서 해준다.


처럼 elaborate된다.

  • reduceLeft 메서드를 Vec 자료구조에 대해 사용함으로써, Vec 자료구조의 각 element에 대한 일관적 연산(모듈을 통과)를 수행할 수 있다.
  • peek한 뒤, toInt를 써서 대소비교나 최댓값 저장 등, testbench 내에서 여러 연산을 수행할 수 있다.
profile
HW SW 둘다 공부하는 혼종의 넋두리 블로그 / SKKU SSE 17 / SWM 11th

0개의 댓글