Rocket - util - AsyncQueue

https://mp.weixin.qq.com/s/6McbqOKM4fu4J5vdpZvxKw

简单介绍异步队列(AsyncQueue)的实现。

??

0. 异步队列

异步队列的两端分属不同的时钟域,拥有各自的复位逻辑。

异步队列用于存值的一端为上游端(source),用于取值的一端为下游端(sink)。

1. AsyncQueueParams

??

异步队列的参数,包含如下几项:

a. depth

队列深度,表示队列可以存储几个元素;

b. sync

表示流水线的级数。

c. safe

使用valid来标识ridx和widx是否合法;是否要把一端的reset同步到另一端。

d. narrow

标识数据同步通道的宽度。如果数据同步通道为窄,则每次只同步一个数据。否则,为所有数据提供同步通道。

??

2. AsyncBundleSafety

??

safe相关要在队列两端同步的信号(这里略去不做详细介绍):

??

个人认为更名为AsyncSafetyBundle更好,因为本质上是一个Bundle,Safety是修饰词,前置为宜。如白马和马白不是同一个意思。

3. AsyncBundle

??

要在队列两端同步的数据,包括:

a. 待读取元素的索引号:ridx;

b. 待写入元素的索引号:widx;

c. 数据:mem;

d. 数据索引号:index;

e. safe相关的bundle(valid和reset);

c和d重构如下:

??

如果数据同步通道为窄通道,则mem这个Vec只包含1个元素,而index则是当前数据通道中元素的索引号。

如果数据同步通道为宽通道,则mem这个Vec包含depth个元素,每一个元素都有自己的同步通道,就不需要index来指示元素索引号了,所以此时index为None。

PS. option是一个隐式方法,定义如下:

??

4. GrayCounter

格雷码计数器。

5. AsyncValidSync

用于支持AsyncBundleSafety,这里不做具体介绍。

6. AsyncQueueSource

异步队列的上游端。上游端写数据。

??

1) io

??

a. enq:输入;

b. async:用于数据同步的端口;

2) 实现

a. enq

??

当对方valid,而我方ready,亦即io.enq.fire()时,把io.enq.bits存入mem中。

注意,此index为新定义的index,非io.async.index:

??

b. mem

也要注意区分mem和io.async.mem。

mem的定义为:

??

存储的元素个数为队列深度params.depth。

根据数据同步通道的宽窄,来决定同步一个,还是全部同步:

??

c. widx

??

source端为写端,widx是一个格雷码计数器,会被同步到sink端:

??

d. ridx

??

读取的元素索引号。sink端为读端。ridx从sink端同步而来。

e. ready

队列不满,则可以ready。

??

??

可以看到io.enq.ready也取决于sink_ready。在不考虑safe的情况下,sink_ready一直为true。

7. AsyncQueueSink

??

与AsyncQueueSource对应,这里略去。

8. FromAsyncBundle

??

x是一个AsyncBundle,构造一个sink端与之连接。从AsyncBundle到DecoupledIO,即From AsyncBundle to DecoupledIO。

9. ToAsyncBundle

??

x是一个ReadyValidIO,构造一个source端与之连接。从ReadyValidIO到AsyncBundle,即To AsyncBundle from ReadyValidIO。

10. AsyncQueue

??

创建异步队列的两端,并把它们相连。

CrossingIO定义如下:

??

原文地址:https://www.cnblogs.com/wjcdx/p/10909757.html

时间: 2024-09-29 08:16:08

Rocket - util - AsyncQueue的相关文章

Rocket - util - ECC

https://mp.weixin.qq.com/s/yato1PrnHe517J8twgZFOg 介绍ECC(Error Correcting Code/Error Checking and Correcting)的实现框架.不涉及编码的具体实现细节. ?? 1. 码:Code ?? 所有编码(如奇偶校验码.海明码)的抽象父类. 包含如下几个方面: a. 能否检错:canDetect: b. 能否纠错:canCorrect: c. width():输入为数据的宽度,输出为编码后码文的宽度,一般

Rocket - util - MaskGen

https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw 介绍MaskGen的实现. ?? 1. 基本介绍 给定总线宽度beatBytes,根据访问的地址(address)和访问的字节数(bytes = 2^lgSize),生成访问字节的掩码. 2. 实现 思路不复杂,写法很难懂.重构一下,提高可读性. 1) 首先忽略groupBy,清爽很多: ?? 2) 把addr_lo重命名为address,把lgSize重命名为size,这样可以很明显的看出来ad

Rocket - util - MultiWidthFifo

https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A 简单介绍MultiWidthFifo的实现. ?? 1. 基本介绍 实现一个输入宽度为inW,输出宽度为outW,可存n个outW宽度元素的FIFO. a. 如果inW == outW,直接使用队列(Queue)实现: b. 如果inW > outW,则相当于每次输入多个元素,而输出只能有一个元素: c. 如果inW < outW,则相当于每次输出多个元素,而输入只能有一个元素: 需要注意的是,

Rocket - util - Repeater

https://mp.weixin.qq.com/s/xyEq3DgYuf2QuNjssv8pkA 简单介绍Repeater的实现. ?? 1. 基本功能 A Repeater passes it's input to it's output, unless repeat is asserted. When repeat is asserted, the Repeater copies the input and repeats it next cycle. 2. 实现 1) io ?? a.

Rocket - util - PrefixSum

https://mp.weixin.qq.com/s/G2vLP-ncoJzSOgxGGEJkfA 简单介绍PrefixSum的实现. ?? 1. 基本介绍 ?? 把一个序列从前向后逐个执行迭代(assocOp),每针对一个元素执行一遍迭代,针对一整行执行一次迭代(layerOp). 2. PrefixSum ?? a. layers:抽象方法,返回层数,等于layerOp执行的次数: b. idLayer: 默认的layerOp,即没有动作,把输入原样返回: 3. RipplePrefixSu

Rocket - util - Replacement

https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw 简单介绍Replacement的实现. ?? 1. 基本介绍 用于实现Cache替换相关的功能. ?? From: Cache Replacement Policies, Prof. Mikko H. Lipasti, University of Wisconsin-Madison, ECE/CS 752 Spring 2016 2. ReplacementPolicy 代表替换策略的抽象类. ?

Rocket - util - ReduceOthers

https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA 简单介绍ReduceOthers的实现. ?? 1. 基本介绍 输入一组Bool元素,把其他位置元素逐个相与的结果,作为当前位置的值输出. 2. helper helper实现ReduceOthers的核心功能: ?? 1) 输入参数 x是输入的一组Bool类型的元素. 2) 返回值 返回一个元组:(Seq[Bool], Bool) a. Seq[Bool]:每个位置上返回其他位置上元素逐个相与的

Rocket - util - Timer

https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A 简单介绍Timer的实现. ?? 1. 基本功能 实现定时器的功能. 2. Timer 实现一个静态装入的定时器: ?? 1) initCount 定时器的初始值,静态配置,不可动态改变. 2) maxInfligh 定时器事件的种类. 3) io ?? a. start:某个定时器事件需要启动定时器,io.start.bits为这个定时器事件的ID: b. stop:某个定时器事件需要停止定时器

64位开源处理器Rocket的源代码简单介绍

最近大概阅读了一下UCB发布的Rocket处理器的源码,对源代码各个文件的功能有了一些大致的了解,Mark一下. Rocket是一款64bit的标量处理器,5级流水线,采用的是risc-v指令集,集成FPU,并有许多or1200没有的特性,比如:无阻塞缓存.分支预测.返回地址堆栈.硬件页表填充.cache支持ECC.支持多核等. Rocket的源代码是使用Chisel编写的,Chisel是UCB发布的基于Scala的领域特定语言.可以在https://github.com/ucb-bar/roc