【问题标题】:Reference is not fully initialized引用未完全初始化
【发布时间】:2021-09-07 12:31:41
【问题描述】:

我有一个如下模块:

class ComputationIO[T <: Data](val OperandType: T) extends Bundle {
    val data = OperandType.cloneType
}

class Computation [T <: Data] (OperandType: T) extends Module {
    val io = IO( new Bundle {
        val in = Input(new ComputationIO(OperandType))
    })
    // REST OF THE CODE HERE...
}

而且,我正在实例化Computation,如下所示:

    val compUnit  = for (i <- 0 until nParal) yield {
        val Comp =  Module(new Computation(UInt(32.W)))
        Comp
    }

然而,虽然我将UInt(32.W) 传递给构造函数,但它给了我以下错误

firrtl.passes.CheckInitialization$RefNotInitializedException:Reference compUnit is not fully initialized.                                                                                                                                                           
[error]    : compUnit.io.in.OperandType <= VOID  

我可以通过删除 IO 类中的val 并覆盖cloneType 来解决问题,如下所示:

class ComputationIO[T <: Data](OperandType: T) extends Bundle {
    val data = OperandType.cloneType

    override def cloneType = new ComputationIO(OperandType).asInstanceOf[this.type ]
} 

但是,我想知道第一种方法的问题是什么?构造函数已初始化。所以,not fully initialized 错误没有意义。

谢谢

【问题讨论】:

    标签: scala chisel


    【解决方案1】:

    另一个答案中链接的documentation 提到了这一点,但我想强调一点:

    唯一需要注意的是,如果您将数据类型的东西作为“生成器”参数传递,在这种情况下,您应该将其设为私有 val。

    这是因为如果您将类参数设为val,它将成为该类的公共字段。 Bundle 的硬件字段被定义为“Data 类型类的公共字段”。因此,val OperandType 是类的一个字段,它与写作相同:

    class ComputationIO[T <: Data](_operandType: T) extends Bundle {
        val OperandType = _operandType
        val data = OperandType.cloneType
    }
    

    事实上,您只需要在OperandType 上调用cloneType,因为您会得到字段别名,其中OperandTypedata 是完全相同的对象。 这显然只是一个问题,因为您无意中将 OperandType 作为 Bundle 的公共字段。

    您可以通过将其设为private val 来解决此问题,这不会导致它成为Bundle 的字段:

    class ComputationIO[T <: Data](private val OperandType: T) extends Bundle {
        val data = OperandType // note .cloneType not necessary
    }
    

    请注意,从 Chisel v3.4.3 开始,可选择加入 Autoclonetype2,它不需要参数为 vals 即可推断克隆类型,您可以查看release notes 了解更多信息。 Autoclonetype2 将成为 Chisel v3.5.0(尚未发布)中的默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-25
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2021-11-11
      • 2014-10-20
      相关资源
      最近更新 更多