gem5:在 BaseCPU 中使用 xbar stat

gem5: Use xbar stat in BaseCPU

我在 xbar.cc/hh 文件中创建了一个公式类型的新统计数据。我在那里汇总了所有不同的 transDist 类型。我想使用这个新创建的统计数据来计算 BaseCPU 对象中的另一个统计数据。从 BaseCPU 访问它(即 allTransactions stat)的最佳方式是什么?有什么办法让它可以在全球范围内访问吗?

我最终在 xbar 和 CPU 对象之间建立了直接通信。

我在 Xbar 对象中实现了一个函数,该函数 returns 我想要的统计数据,称为 getAllTrans()。从 CPU 对象,我调用该函数并获取统计值。使用以下代码实现通信。

// Research (Memory Boundedness)
void
BaseCPU::getAllTrans() {
    allTrans = 0;

    Cache *dCache = dynamic_cast<Cache*>
            (this->getPort("dcache_port", 0).getPeer().getOwner());
    if (dCache) {
        Cache *l2Cache = dynamic_cast<Cache*>
                (dCache->getPort("mem_side", 0).getPeer().getOwner()->
                getPort("mem_side_ports", 0).getPeer().getOwner());
        if (l2Cache) {
            CoherentXBar *membus = dynamic_cast<CoherentXBar*>
            (l2Cache->getPort("mem_side", 0).getPeer().getOwner());
            if (membus) {
                allTrans = membus->getAllTrans();
            }
        }
        else {
            CoherentXBar *membus = dynamic_cast<CoherentXBar*>
            (l2Cache->getPort("mem_side", 0).getPeer().getOwner());
            if (membus) {
                allTrans = membus->getAllTrans();
            }
        }
    }
}

以上代码假定 dcache 存在。

Cache *dCache = dynamic_cast<Cache*>
            (this->getPort("dcache_port", 0).getPeer().getOwner());

上面的代码指向cpu中的dcache对象。啤酒花是这样的:

CPU -> CPU 端口到 dCache -> 该端口的 Peer(即,dCache 端口到 CPU) -> 该端口的所有者(即,dCache本身)。

我在将 CPU 连接到 Xbar 的每个对象之上构建,直到我到达 XBar。这不是最优雅的解决方案,但我还没有找到更好的解决方案来将信息从一个 gem5 对象获取到另一个对象。