-
Notifications
You must be signed in to change notification settings - Fork 5
Chisel3坑汇总
Jason Yu edited this page Jul 31, 2018
·
8 revisions
-
Mem.apply
和new Mem
的实现似乎不同。直接使用后者在仿真时可能导致key not found的内部错误。猜测Mem.apply
在new 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.U
将x
的末两位清零,而实际上它的结果始终都是零,因为chisel自动给3.U
指定宽度为2,在进行取反操作后就变成b00
,最后和x
进行与操作时b00
将扩展成更长的一串0 - Chisel里Bundle子类的构造函数如果带参数,参数需要是immutable的,即参数名前需要加
val
修饰,否则chisel会报错