Skip to content

Chisel3坑汇总

Jason Yu edited this page Jul 19, 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
Clone this wiki locally