Queue
中有Decoupled
和其他标准库接口(Valid
,val input = Decoupled(new DivRecFN_io(expWidth, sigWidth)).flip
等)的简要定义,以及Cheat-Sheet中的更多细节{3}}。我还在StackOverflow上找到了这两个答案 - Chisel Manual和here。
然而,这些资源都没有用塑料方式解释 - 我觉得这有助于我更好地理解这些接口的用途 - 这些代码行合成了什么 - 它们在实际硬件中看起来是什么样的?
例如,以下是包here中的FPU代码片段:
DivRecFN_io
其中class DivRecFN_io(expWidth: Int, sigWidth: Int) extends Bundle {
val a = ...
val b = ...
val ...
...
}
是一个类,如下所示:
Decouple
包含struct Deck {
int* cards; //an array of cards
int deck_size; //the size of the deck
int* cnt_top; //the index to the top card;
};
?
谢谢。
答案 0 :(得分:2)
将DivRecFN Bundle连接到指定字段的字段,并添加就绪和有效信号,这些信号通常用于管理不在单个周期内返回结果的模块的流控制。默认情况下,DecoupledIO的数据字段为Output
。该行末尾的翻转将其转换为Input
。考虑包含val input
的模块 C 和使用模块实例的模块 P ( C ),模块< strong> C 将消耗 Bundle中的数据,此模块的父级 P 将生成放置在Bundle中的数据。 C 会断言ready
表示已准备好接收数据,并在 P 声明valid
时读取/使用该数据。
分离的Bundle中的字段是
input.ready
input.valid
input.bits.a
input.bits.b
...
答案 1 :(得分:2)
对于实际硬件中的样子:
默认的Chisel util Queue是标准的circular buffer实现。这意味着它有一系列带有enqueue和dequeue指针的寄存器,这些寄存器由于对队列的操作而移动,检查是否充满和空虚。