|
在chisel中,我们可以通过Vec创建逻辑表从而很容易生成逻辑。有时候数据在文件中,我们通过读其中的
数据从而产生逻辑表。逻辑表的数据可以用VecInit来存储,比如:
val logictable = VecInit(array.map(_.U(8.W)))
下面举例,读取一个文本文件内容生成逻辑表,代码如下:
import chisel3._
import scala.io.Source
class FileReader extends Module {
val io = IO(new Bundle {
val address = Input(UInt(8.W))
val data = Output(UInt(8.W))
})
val array = new Array[Int](256)
var idx = 0;
//读文件内容并存入ARRAY
val source = Source.fromFile("h:/data.txt") //一个数据占一行 ,分别是1 2 3 ....
for(line <- source.getLines()) {
array(idx) = line.toInt
idx += 1
}
//将ARRAY中数据转换成chisel的Vec类型
//每个数据加1
val table = VecInit(array.map(d => (d+1).U(8.W))) //VecInit的apply中需要Seq[T] T是硬件类型
//从address所选的地址单元输出
//VecInit需要Seq[T],而且T是硬件类型,array则是一个数据区块空间, 可以用Aggregate.scala中的class Vec的def apply(p:UInt):T获取区块中某个地址索引的值
io.data := table(io.address)
}
测试:
import chisel3._
import chisel3.iotesters._
class SourceFileReaderModuleTester(m:SourceFileReaderModule) extends PeekPokeTester (m){
poke(m.io.addr,2) //所以:正确值应该是4而不是2或3
expect(m.io.data,2) //[info] [26.799] EXPECT AT 0 io_data got 4 expected 2 FAIL
expect(m.io.data,3) //[info] [26.811] EXPECT AT 0 io_data got 4 expected 3 FAIL
expect(m.io.data,4)
}
object SourceFileReaderModuleTester {
def main(args: Array[String]): Unit = {
iotesters.Driver(()=>new SourceFileReaderModule)(t=>new SourceFileReaderModuleTester(t))
}
}
|
|