Тестирование файла регистрации в долоте - PullRequest
2 голосов
/ 05 апреля 2020

Я хочу проверить вектор регистров (файл регистра). Ниже приведена функция, которая считывает индексированное значение registerFile: -

class ViewRegFile(regnum: Int, size: Int) extends Module {
  val io = IO(new Bundle {
    val registers =  Input(Reg(Vec(regnum,UInt(size.W))))
    val inputs = Input(UInt(size.W))
    val ok = Input(UInt(1.W))
    val values = Output(UInt(size.W))
  })
  val buffer = RegInit(VecInit(Seq.fill(regnum)(0.U(size.W)))) // so we have a reset to buffer regmap
  when(io.ok === 1.U){
  for(i<-0 until regnum) {
  buffer(i)  := io.registers(i)
  }
  }
  val itr = io.inputs
  io.values := buffer(itr)
}

Приведенный выше код принимает регистр registerFile , который имеет regnum регистры размера размер . Я индексирую registerFile, используя переменную input , и выводю индексированное значение registerFile через переменную values ​​.

Чтобы проверить функциональность, я создал registerFile в тестовом стенде , инициализировал некоторые значения в файле и хотел прочитать выходные данные, используя вышеописанную функцию ViewRegFile . Я застрял сейчас, где я мог ошибиться в реализации. Ниже тестовый стенд, который я пытался сделать: -

import java.io.File
import chisel3._   //needed to declare testbench (tb) registerFile
import chisel3.iotesters
import chisel3.iotesters.{ChiselFlatSpec, Driver, PeekPokeTester}

class RegUnitTester(c: ViewRegFile, val regnum: Int, val size:Int) extends PeekPokeTester(c) {
 private val mod = c
val register = RegInit(VecInit(Seq.fill(regnum)(0.U(size.W)))) // tb registerFile
val val1 = 1434.U(size.W)
val val2 = 9082.U(size.W)
register(1) := val1
register(2) := val2 
poke(mod.io.registers, register) //loaded tb registerFile to function registerFile
for(j<- 0 until regnum) {
  poke(mod.io.inputs, j) //desired values from function registerFile
  poke(mod.io.ok,1)
  step(1)
  poke(mod.io.ok,0)
  peek(mod.io.values) } // indexed output
}

object RegTester extends App {
  println("Testing RegFile Viewer")
  iotesters.Driver.execute(Array("--target-dir", "generated", "--generate-vcd-output", "on"), () => new ViewRegFile(4, 16)) {
    c => new RegUnitTester(c,4,16)
  }
}

и poke не работает с ошибкой:

[error] overloaded method value poke with alternatives: 
[error]   (signal: chisel3.Aggregate,value: IndexedSeq[BigInt])Unit <and>
[error]   (signal: chisel3.Bundle,map: Map[String,BigInt])Unit <and>
[error]   [T <: chisel3.Element](signal: T, value: Long)(implicit evidence$10: chisel3.iotesters.Pokeable[T])Unit <and>
[error]   [T <: chisel3.Element](signal: T, value: Int)(implicit evidence$9: chisel3.iotesters.Pokeable[T])Unit <and>
[error]   [T <: chisel3.Element](signal: T, value: BigInt)(implicit evidence$8: chisel3.iotesters.Pokeable[T])Unit <and>
[error]   (path: String,value: Long)Unit <and>
[error]   (path: String,value: Int)Unit <and>
[error]   (path: String,value: BigInt)Unit
[error] poke(mod.io.registers, register)

1 Ответ

2 голосов
/ 05 апреля 2020

Проблема в том, что вы используете конструкции Chisel в своем тестере. Вызовы API Chisel (включая RegInit, VecInit, .U и .W) предназначены для создания аппаратного обеспечения; в тестерах вы должны использовать чистую Scala для моделирования поведения. Например:

import java.io.File
import chisel3._   //needed to declare testbench (tb) registerFile
import chisel3.iotesters
import chisel3.iotesters.{ChiselFlatSpec, Driver, PeekPokeTester}

class RegUnitTester(c: ViewRegFile, val regnum: Int, val size:Int) extends PeekPokeTester(c) {
  private val mod = c
  val register = Array.fill(regnum)(BigInt(0)) // Using BigInt because Int is 32-bit
  register(1) = 1434 // I didn't wrap in BigInt because Scala will convert from Int automatically
  register(2) = 9082 // If you create values that don't fit in 32-bit *signed* Int, wrap in BigInt(...)
  // You can't poke internal values, there is some support for this, see:
  // https://github.com/freechipsproject/chisel3/wiki/Chisel-Memories#loading-memories-in-simulation
  //poke(mod.io.registers, register) //loaded tb registerFile to function registerFile
  for(j<- 0 until regnum) {
    poke(mod.io.inputs, j) //desired values from function registerFile
    poke(mod.io.ok,1)
    step(1)
    poke(mod.io.ok,0)
    peek(mod.io.values) // indexed output
  }
}

object RegTester extends App {
  println("Testing RegFile Viewer")
  iotesters.Driver.execute(Array("--target-dir", "generated", "--generate-vcd-output", "on"), () => new ViewRegFile(4, 16)) {
    c => new RegUnitTester(c,4,16)
  }
}
...