Chisel3中处理相同泛型类型加法操作的通用解决方案有哪些
Chisel3泛型硬件模块加法操作报错解决方案
问题根源
你定义的泛型参数T的上界仅为Data,而Data是所有Chisel硬件类型的父类,本身没有实现+运算符,只有具备数值运算能力的类型(如UInt、SInt、FixedPoint等)才支持加法操作,因此编译器无法匹配到合法的+方法,触发类型不匹配报错。
通用解决方案
Chisel3提供了Numeric类型类用来约束支持数值运算的泛型类型,你只需要给泛型参数添加上下文绑定,导入对应隐式转换即可解决问题。
修正后的代码示例如下:
import chisel3._ import chisel3.experimental.Numeric import Numeric.Implicits._ class hardware_module[T <: Data : Numeric](gen: T) extends Module { val io = IO(new Bundle { val in0 = Input(gen) val in1 = Input(gen) val out = Output(gen) }) io.out := io.in0 + io.in1 }
如果你不需要兼容自定义数值类型,仅需要支持UInt、SInt这类原生位宽类型,也可以直接把泛型的上界设置为Bits,不需要额外导入Numeric相关内容:
import chisel3._ class hardware_module[T <: Bits](gen: T) extends Module { val io = IO(new Bundle { val in0 = Input(gen) val in1 = Input(gen) val out = Output(gen) }) io.out := io.in0 + io.in1 }
注意事项
- 第一种方案的通用性更强,支持所有实现了
Numeric类型类的数值类型,包括自定义的定点数、浮点数硬件类型 - 第二种方案仅支持Chisel原生的
Bits子类(UInt、SInt等),代码更简洁但适用范围更窄 - 上述代码兼容Chisel3.4及以上版本,低版本可使用
Arithmetic类型类替代Numeric实现相同效果
内容的提问来源于stack exchange,提问作者fffff
相关产品推荐
相关产品推荐

