Skip to content

Chisel3坑汇总

Jason Yu edited this page Jul 31, 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)。
  • log2Up最小返回1。也就是说log2Up(1) === 1
  • Chisel3不允许IO中有空的bundle,这问题有时会威胁到整体框架的优雅性,一种解决方法是在其中加入一个哑信号,给它随便连上
  • chisel对于长度检查非常宽松,这意味着你可以在长度不等的信号间赋值,但同时也要注意如果某一个Wire/Reg定义时写错或漏写宽度,可能会导致信号经过它之后被截取而丢失。
  • Chisel中,如果不对常数指定宽度,它的宽度将是可以容纳该值的最小宽度。在对宽度不同的信号进行运算时,chisel会自动对宽度较小的那个信号进行扩展,不会显示任何警告信息。这可能导致一些难以发现的问题,例如试图使用x & ~3.Ux的末两位清零,而实际上它的结果始终都是零,因为chisel自动给3.U指定宽度为2,在进行取反操作后就变成b00,最后和x进行与操作时b00将扩展成更长的一串0
  • Chisel里Bundle子类的构造函数如果带参数,参数需要是immutable的,即参数名前需要加val修饰,否则chisel会报错
Clone this wiki locally