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 ----------
}
}
처럼 elaborate된다.