Chisel3中Flipped()的功能是什么?附Generator-Bootcamp代码示例
解答:Chisel中
Flipped的功能 我来帮你彻底搞懂Chisel里Flipped的作用,刚好对这个机制很熟悉!
首先得先回忆下Decoupled接口的默认行为:Chisel的Decoupled是标准的AXI-style握手接口,默认是主设备(Master)视角——也就是说,默认情况下:
valid信号是模块的输出(由当前模块驱动,告诉对方“我有数据要发”)ready信号是模块的输入(由外部模块驱动,告诉当前模块“我准备好接收了”)- 数据信号(这里是
UInt(8.W))是模块的输出
而Flipped的核心作用就是翻转整个接口的方向,把主设备视角的接口转换成从设备(Slave)视角,反过来也一样。
结合你给出的代码片段:
val io = IO(new Bundle { val in = Flipped(Decoupled(UInt(8.W))) val out = Decoupled(UInt(8.W)) })
out是默认的Decoupled接口:你的模块是主设备,负责驱动out.valid和out.bits,等待外部的out.ready信号来完成握手。in加了Flipped之后:你的模块变成了从设备——外部模块会驱动in.valid和in.bits,而你的模块需要驱动in.ready来告诉外部“我已经准备好接收数据了”。
再拓展一下,Flipped不是只能用在Decoupled上,它是一个通用的接口方向翻转工具:任何自定义的Bundle或者接口,只要用Flipped包裹,所有内部端口的方向都会被反转。比如你自己定义一个带读写信号的Bundle,用Flipped之后,原来的输入会变成输出,输出变成输入,这样在模块互连时能省去手动调整每个端口方向的麻烦。
内容的提问来源于stack exchange,提问作者Po-wei Huang
相关产品推荐
相关产品推荐

