如果我们运行以下Chisel3代码
class Controller extends Module {
val io = IO(new Bundle {
})
val sff = Module(new SFF)
val frame: Vec[UInt] = Reg(Vec(ProcedureSpaceSize, Integer32Bit))
for(i <- 0 until ProcedureSpaceSize)
frame(i) := 99.U
sff.io.inputDataVector := frame
}
class SFF extends Module {
val io = IO(new Bundle {
val inputDataVector: Vec[UInt] = Input(Vec(ProcedureSpaceSize, Integer32Bit))
})
}在REPL调试模式下。先做
reset;step
peek sff.io_inputDataVector_0;peek sff.io_inputDataVector_1;peek sff.io_inputDataVector_2REPL返回
Error: exception Error: getValue(sff.io_inputDataVector_0) returns value not found
Error: exception Error: getValue(sff.io_inputDataVector_1) returns value not found
Error: exception Error: getValue(sff.io_inputDataVector_2) returns value not found那就去做
eval sff.io_inputDataVector_0这将是一个成功的,屈服
...
resolve dependencies
evaluate sff.io_inputDataVector_0 <= frame_0
evaluated sff.io_inputDataVector_0 <= 99.U<32>然后再执行上面的检查。
peek sff.io_inputDataVector_0;peek sff.io_inputDataVector_1;peek sff.io_inputDataVector_2;这一次,它回来了
peek sff.io_inputDataVector_0 99
peek sff.io_inputDataVector_1 99
peek sff.io_inputDataVector_2 99更让人期待的。
为什么REPL会这样做呢?还是我错过了什么?谢谢!
*chisel-iotesters在1.4.2版本中,chiseltest在0.2.2版本中。两者都应该是最新版本。
发布于 2020-08-10 21:51:45
firrtl解释器REPL不一定计算或存储不使用的mux分支上的值。这可能导致上面提到的问题,如
Error: exception Error: getValue(sff.io_inputDataVector_0) returns value not found。
无论如何,可以使用eval强制计算未使用的分支。REPL是一个实验性的特性,并没有太多的用途。
踏板是一种更现代的基于scala的模拟器.它比解释器支持得更好,速度更快。它有自己的REPL,但没有一个executeFirrtlRepl等效的。
它必须通过根目录中的./treadle.sh脚本从命令行运行。还可以运行sbt assembly来创建一个放置在utils/bin中的更快的启动jar。这个REPL也没有被使用很多,但我对反馈感兴趣,这将使它更好和更容易使用。
发布于 2020-08-09 03:51:24
我认为,您所看到的问题是,由于死代码消除,您的所有连接都被消除了。有几件事你应该试着解决这个问题。
如果你完成了上面的工作,我认为回购会像预期的那样起作用。我确实有一个问题,您正在使用哪种repl (有两种:firrtl-解释器和treadle),我建议使用后者。它更加现代化,得到更好的支持。它还具有两个有用的命令。
show lofirrtl将向您展示降低的firrtl,这就是您如何从chisel3发出的高firrtl中看到的大量内容已经被更改。symbol .向您显示电路中的所有符号(.是匹配一切的正则表达式)。下面是一个基于frame Vec驱动和输出的电路的随机编辑。这个电路将产生第一次,不会消除你想要看到的电线。
class Controller extends Module {
val io = IO(new Bundle {
val out = Output(UInt(32.W))
})
val sff = Module(new SFF)
val frame: Vec[UInt] = Reg(Vec(ProcedureSpaceSize, Integer32Bit))
when(reset.asBool()) {
for (i <- 0 until ProcedureSpaceSize) {
frame(i) := 99.U
}
}
frame.zipWithIndex.foreach { case (element, index) => element := element + index.U }
sff.io.inputDataVector := frame
io.out := sff.io.outputDataVector.reduce(_ + _)
}
class SFF extends Module {
val io = IO(new Bundle {
val inputDataVector: Vec[UInt] = Input(Vec(ProcedureSpaceSize, Integer32Bit))
val outputDataVector: Vec[UInt] = Output(Vec(ProcedureSpaceSize, Integer32Bit))
})
io.outputDataVector <> io.inputDataVector
}https://stackoverflow.com/questions/63291620
复制相似问题