【问题标题】:Can cache coherency protocols like snooping coherence be implemented in hardware(RTL)?可以在硬件(RTL)中实现像窥探一致性这样的缓存一致性协议吗?
【发布时间】:2017-03-04 23:53:22
【问题描述】:

是否可以在硬件 (RTL) 中实现缓存一致性协议(如窥探一致性协议和 MESI/MOESI)?我正在为多核缓存环境设计一个 RTL,并且需要在其中实现缓存一致性协议以获得所有处理器的一致和一致的数据。这只是一个学术练习。

任何线索确实会有所帮助。我有 MSI 的状态图,我应该先尝试实现 FSM 吗?我正在开发可合成的verilog/systemverilog的代码。

每个缓存块的 FSM 应该是不同的,那么是否有一个多路复用器连接到 FSM 状态机控制器,如下所示?

【问题讨论】:

  • 鉴于真正的 CPU 多年来一直在使用(变体)MESI,很明显它可以在硬件中实现!这是一个真正的问题吗?
  • 我不知道它可以在硬件中实现。每个缓存行都有自己的 FSM 吗?
  • IDK 如何 Intel/AMD/ARM/其他所有人设计他们的缓存,但实际硬件中的真正缓存使用 MESI / MOESI / MESIF / 任何其他变体,针对具有多个未完成的未命中、多个读写端口以及现代高性能缓存所需的所有常见功能的流水线操作。 (而且像你这样的学习练习可能不会。)我不是硬件专家,所以我不能告诉你更多。

标签: caching architecture verilog processor


【解决方案1】:

您还可以查看普林斯顿大学的 openPiton 项目 (openPiton)。它是一个研究框架,可让您合成和流片多核设计。

【讨论】:

    【解决方案2】:

    可以在硬件(RTL)中实现诸如窥探一致性协议和MESI/MOESI等缓存一致性协议吗?

    是的。正如评论者已经指出的那样,它们已经在 VLSI 中实施多年。

    我是否应该首先尝试实施 FSM [for Modified/Shared/Invalid (MSI) cache-coherence protocol]

    我想是的。它当然是更容易的之一。你没有提到你是否已经实现了一个基本的缓存控制器。我觉得您应该先从单处理器缓存控制器开始,然后将其扩展以从那里查看其他处理器的缓存。

    就个人而言,我发现计算机组织和设计:硬件/软件接口第五版在进入缓存架构时非常有用。我附上了一本关于构建缓存控制器的书的屏幕截图。


    从那时起,您可能会查看类似的资源,这些资源会深入研究具有缓存一致性功能的缓存控制器的架构设计。我通过基本的 Google 搜索找到了这些。

    是否有一个多路复用器连接到如下 FSM 状态机控制器?

    要访问缓存中的块/行,是的。但是,请记住,您的一致性控制器可能不需要访问缓存中的数据。您的一致性逻辑很可能只需要读取和/或修改块的状态位。这可以为您节省一些位宽。所以我可能会这样画我的图表:

    这只是一个想法,而不是具体的“这就是你应该这样做”的答案。

    由于您使用的是 MSI,您实际上只需要 2 位来表示这三种状态。仅获取和输出 2 位应该比为一致性控制器获取整个块及其数据更有效。

    // Note this code has not been tested. It is simply for illustrative purposes only.
    module <cache name> (
    
    input [X:0] address,
    output logic [1:0] block_state
    
    );
    
        // Cache memory blocks (32-bits of data. 2 bits of "state" info)
        logic [33:0] cache_mem [0:N];
    
        // Give index bits of address a name
        wire [Y:0] address_index;
        assign address_index[Y:0] = address[A:B];
    
        // Output the state bits of the selected cache block.
        assign block_state[1:0] = cache_mem[33:32][address_index];
    
    endmodule
    

    希望其中一些对您有所帮助!干杯!

    【讨论】:

    • 感谢您的链接。抱歉没有提及,但我已经按照您共享的完全相同的链接实现了缓存控制器。所以现在,我有多个处理器(简单的 MIPS),每个处理器都有自己的缓存(设计的缓存内存和控制器),我有一个共享 RAM 和共享内存控制器。到目前为止,我很好。我现在也阅读了这些链接。关于mux图的唯一混淆点。如果您也可以回答连接情况如何,那将很有帮助。
    • @ShankhadeepMukerji 我假设 MUX 应该是您对缓存行的访问。您访问缓存的方式实际上取决于您是否有直接映射的、x 路集关联的或完全关联的缓存。它看起来有点像你在做直接映射,你的图表的绘制方式。我不能肯定地说。您打算如何映射缓存?
    • 是的,确实,它是直接映射的。我希望我的图表对于直接映射是正确的?说完全关联或 2 路关联如何?
    • 我只是假设您有一个 4 字块并且您的缓存是字节可寻址的。您可以根据自己的喜好选择修改它。但是您必须在开始构建缓存之前确定您将如何访问缓存。修改的一个示例是删除字节寻址功能并仅输出完整的 32 位字。无论您如何决定,它都会极大地影响您访问缓存的方式。
    • 在我上面的例子中,如果一个直接映射的、4 字块、字节可寻址的缓存,你将有一个带有如下字段的地址:msb [tag][index][WiB][biW] lsb 其中“WiB”= 块中的字和“ biW" = Word 中的字节。
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多