我有 2 个块,其中 block_A 正在写入,block_B 正在读取。
写入配置:每 5 个时钟 3 次写入,
读取配置:每 50 个时钟 30 次读取
为了避免 FIFO 下溢/上溢,所需的 FIFO 深度是多少? 假设两个 FIFO 以相同的频率工作。
如果我们计算频率,两个块的频率都是 3/5。但话说回来,这个 3/5 的频率是平均频率。 所以我不知道如何计算 FIFO 深度。
从你的描述中我不清楚这是否是一种固定模式,或者是对其中一侧在很长一段时间内的某种估计。
如果保证每 5 个周期有 3 次写入,每 50 个周期有 30 次读取,那么您可以使用以下公式计算所需的缓冲区深度:
FifoDepth = BW*LatencyFromPushToPop
您的情况:
BW = 3/5 //This is the BW that you want to pass through the FIFO.
LatencyFromPushToPop = (50-30) = 20 cycles //you must add to this number the actual latency of the FIFO (1, 2 cycles?), which I am not considering here
从这个等式中,您可以得出避免写背压的最小 FIFO 深度为:
3 / 5 * 20 = 12.
您还可以通过尝试模拟 FIFO 填充水平的最坏情况来实现这一点:
块 A 将在 20 个周期内最多写入 20 / 5 * 3 = 12 个条目。
当块 B 开始读取时,它将连续读取 30 个条目。 在这 30 个周期中,块 A 最多将写入 30 / 5 * 3 = 额外的 18 个条目。
由于块 B 将在这 30 个周期中读取 30 个条目,即 12+18 个条目,因此 FIFO 将被清空,并且其填充水平不会超过数字 12(我们又回到了方块一)。
注1:
不确定我理解你所说的下溢是什么意思。根据定义,块 A 仅发送数据 3/5 的时间,因此必须有一些周期没有任何内容可从 FIFO 读取。 如果 FIFO 中没有任何内容可供读取,则块 B 不应弹出任何内容。
注2:
如果一侧的平均BW是对很长一段时间的估计,那么它实际上取决于流量的突发性。
一个很好的例子是,如果一个块在 1 秒内写入了 50% 的时间,但在前 0.5 秒内写入了所有内容。
平均写入带宽为 50%,但 FIFO 需要在前 0.5 秒内吸收 100% 的写入流量。因此,在长时间使用平均 BW 时,您必须了解优化 FIFO 的模式和时间范围。