Chisel 3的Queue标准库接口合成了什么?

时间:2017-12-14 22:31:45

标签: riscv chisel

Queue中有Decoupled和其他标准库接口(Validval input = Decoupled(new DivRecFN_io(expWidth, sigWidth)).flip等)的简要定义,以及Cheat-Sheet中的更多细节{3}}。我还在StackOverflow上找到了这两个答案 - Chisel Manualhere

然而,这些资源都没有用塑料方式解释 - 我觉得这有助于我更好地理解这些接口的用途 - 这些代码行合成了什么 - 它们在实际硬件中看起来是什么样的?

例如,以下是包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; };

的行究竟取得了什么成果?

谢谢。

2 个答案:

答案 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指针的寄存器,这些寄存器由于对队列的操作而移动,检查是否充满和空虚。