首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chisel3 REPL分配到模块后才能工作

Chisel3 REPL分配到模块后才能工作
EN

Stack Overflow用户
提问于 2020-08-06 20:55:38
回答 2查看 58关注 0票数 1

如果我们运行以下Chisel3代码

代码语言:javascript
复制
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调试模式下。先做

代码语言:javascript
复制
reset;step

peek sff.io_inputDataVector_0;peek sff.io_inputDataVector_1;peek sff.io_inputDataVector_2

REPL返回

代码语言:javascript
复制
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

那就去做

代码语言:javascript
复制
eval sff.io_inputDataVector_0

这将是一个成功的,屈服

代码语言:javascript
复制
...
resolve dependencies
  evaluate     sff.io_inputDataVector_0 <= frame_0
  evaluated    sff.io_inputDataVector_0 <= 99.U<32>

然后再执行上面的检查。

代码语言:javascript
复制
peek sff.io_inputDataVector_0;peek sff.io_inputDataVector_1;peek sff.io_inputDataVector_2;

这一次,它回来了

代码语言:javascript
复制
peek sff.io_inputDataVector_0  99
peek sff.io_inputDataVector_1  99
peek sff.io_inputDataVector_2  99

更让人期待的。

为什么REPL会这样做呢?还是我错过了什么?谢谢!

*chisel-iotesters1.4.2版本中,chiseltest0.2.2版本中。两者都应该是最新版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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也没有被使用很多,但我对反馈感兴趣,这将使它更好和更容易使用。

票数 1
EN

Stack Overflow用户

发布于 2020-08-09 03:51:24

我认为,您所看到的问题是,由于死代码消除,您的所有连接都被消除了。有几件事你应该试着解决这个问题。

  • 确保你的电线有有意义的连接。最终不会影响输出的硬件很可能会被淘汰。在您的示例中,没有驱动顶级输出的任何内容。
  • 你可能需要你的电路来计算那些寄存器。如果寄存器初始化为99,则常数传播可能会消除它们。我不知道你想让电路做什么,所以很难给出具体的建议。

如果你完成了上面的工作,我认为回购会像预期的那样起作用。我确实有一个问题,您正在使用哪种repl (有两种:firrtl-解释器和treadle),我建议使用后者。它更加现代化,得到更好的支持。它还具有两个有用的命令。

  • show lofirrtl将向您展示降低的firrtl,这就是您如何从chisel3发出的高firrtl中看到的大量内容已经被更改。
  • symbol .向您显示电路中的所有符号(.是匹配一切的正则表达式)。

下面是一个基于frame Vec驱动和输出的电路的随机编辑。这个电路将产生第一次,不会消除你想要看到的电线。

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63291620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档