如何避免chisel将部分信号优化?
问题描述
我在用chisel来描述rv64的处理器核时,出现了如下的情况,原来有四种情况的mux,最后生成的verilog只有一种情况,说明lsType
信号被优化掉了
1 | // chisel |
在描述寄存器时也出现了同样的情况,发现stall
信号也没看见了,但是在生成的firrtl中是存在的,说明被编译器给优化掉了
1 | // chisel |
1 | // 生成的verilog |
解决方案
编译器会进行死代码消除和常量传播,会优化掉部分没有使用的代码(但是这个信号明明是会被用到的,搞不懂)
将信号拉到模块顶层
对于组合逻辑的描述,可以将信号拉到模块顶层,这样一般可以避免被优化掉
1 | class IDU extends Module { |
使用dontTouch函数
寄存器的信号即使拉到顶层也无法解决某些信号被优化的问题,需要使用dontTouch函数将被优化的信号包裹起来
1 | // chisel |
总结
推荐使用dontTouch函数来避免信号被优化,将信号拉到顶层的方法有时候会失效,比如对于寄存器