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
実行ファイルとかを読み込む際には他の方法を使うしかなさそうである。