vimacs's personal siteWritten with Vim and Emacs

Gem5 的 TimeBuffer 数据结构

读 O3CPU 的时候,我们遇到一个叫 TimeBuffer 的数据结构。从名字可以看出来, 这个数据结构用于模拟数据在一定延迟之下,在部件之间的传送。同样在 MinorCPU 中, 也有一个叫 Latch 的结构,事实上是对 TimeBuffer 进行了一个封装。

通过读 TimeBuffer 的代码,可以发现,其实它就是构造了一个环形队列,同时用 wire 指针可以访问这个队列里的每一个元素。在每个时间单位的 advance() 操作之后,该队列的 内部指针自增,使得 wire 指向的内容自动变为一个时间单位后的内容。

我把 timebuf.hh 复制出来单独使用,写了一个小的测试程序 testbuf.cpp.

可以看出,我的 fromPrev wire 用于访问 3 个时间单位之前写入至 TimeBuffer 的数据, 从而在这个 TimeBuffer advance() 3 次之后,fromPrev 就得到通过 toNext wire 写进去的数据, 再 advance() 一次,fromPrev 就不再指向这个数据了。

此外,把代码改为以下形式结果相同:

TimeBuffer<MyClass> mybuf(0, 3);

TimeBuffer<MyClass>::wire toNext = mybuf.getWire(3);
TimeBuffer<MyClass>::wire fromPrev = mybuf.getWire(0);