我正在关注一些向火箭芯片添加外围设备的示例。我使用了五个块作为参考。
下面是他们的 I2C 示例中的一个示例(我希望可以在这里发布)
case object PeripheryI2CKey extends Field[Seq[I2CParams]]
trait HasPeripheryI2C { this: BaseSubsystem =>
val i2cNodes = p(PeripheryI2CKey).map { ps =>
I2C.attach(I2CAttachParams(ps, pbus, ibus.fromAsync)).ioNode.makeSink()
}
}
trait HasPeripheryI2CBundle {
val i2c: Seq[I2CPort]
}
trait HasPeripheryI2CModuleImp extends LazyModuleImp with HasPeripheryI2CBundle {
val outer: HasPeripheryI2C
val i2c = outer.i2cNodes.zipWithIndex.map { case(n,i) => n.makeIO()(ValName(s"i2c_$i")) }
}
我了解 makeIO 步骤,该步骤是打包并在其上应用 IO,但不了解 makeSink 步骤。他们为什么要做这一步,makeIO还不够吗?