鬱猫のつぶやき

鬱猫が日々思っていることをつづります

Chisel3でメモリにテキストデータを読み込む際の手順

やり方がよくわからず結構苦戦した。一応ドキュメントにそれっぽい記載はあるんだけども。

chisel3.util.experimental.loadMemoryFromFileという関数を使うのが簡単。例えば、

class InstMemory(memfile: String) extends Module {
  val io = IO(new Bundle{
    val read_addr = Input(UInt(4.W))

    val read_data = Output(UInt(8.W))
  })

  val memory = Mem(16, UInt(8.W))
  loadMemoryFromFile(memory, memfile) // memoryにデータを読み込む

  io.read_data := memory(io.read_addr)
}
class MemoryTester extends ChiselFlatSpec {
  "InstMemory" should s"read data correctly" in {
    Driver(() => new InstMemory("src/test/resources/raw/test.txt"), "treadle") {
      m => new MemoryUnitTest(m)
    } should be (true)
  }
}

みたいな感じで使う。ここでtest.txtはデータの最小単位を改行で区切って並べたものとする。以下のような感じ。

00
01
02
03
04
05
06
07
08
09
0a
0b
0c
0d
0e
0f

こうすると、memoryの第0要素から第15要素に0から15までがそれぞれ埋められる。

ちなみに試した限りでは、この方法だとバイナリファイルを読み込むことができない。以下のようなエラーが出てくる。

[info]   treadle.executable.TreadleException: loading memory memory[0] <=  : error: Zero length BigInteger

実行ファイルとかを読み込む際には他の方法を使うしかなさそうである。