Skip to content

Chisel3坑汇总

maoyuchaxue edited this page Jul 30, 2018 · 8 revisions
  • Mem.applynew Mem的实现似乎不同。直接使用后者在仿真时可能导致key not found的内部错误。猜测Mem.applynew Mem之外裹了一层别的操作,new Mem本身只是提供给chisel库内部使用的。
  • UInt不支持修改其中某一位,要达到这个效果需要用Vec(x.toBools)转成Vec然后再用asUInt转回去。
  • 信号(包括输入输出端口)没有初始化可以导致仿真时的内部错误。
  • 试图定义首位为1(即负数)的32位UInt时不能直接用0xffffffff.U(32.W)的形式,大概是因为前半部分会被Scala转成-1. 正确做法是定义成SInt再asUInt.
  • 在定义定宽UInt(width.W)时,如果.W漏写,虽然可以通过语法检查,但会导致chisel认为这是一个UInt常量,后续对其的任何赋值将报错(reassign to Data)。
  • Bundle构造函数中无法传参。因此若想定义多态的Bundle,需要在包含它的Module中做。例见src/main/scala/sysbus/SysBusSlave.scala
  • log2Up最小返回1。也就是说log2Up(1) === 1
  • Chisel3不允许IO中有空的bundle,这问题有时会威胁到整体框架的优雅性,一种解决方法是在其中加入一个哑信号,给它随便连上
  • chisel对于长度检查非常宽松,这意味着你可以在长度不等的信号间赋值,但同时也要注意如果某一个Wire/Reg定义时写错或漏写宽度,可能会导致信号经过它之后被截取而丢失。
Clone this wiki locally