验证符合AXI/ACE标准的互连的策略:第二部分

描述

在这篇文章中,我们将重点介绍基本的连贯交易测试。我们使用术语“基本”来表示在进行更高级测试之前作为先决条件的东西。相干事务是 AXI/ACE 协议中用于执行加载和存储操作的一组事务。这些事务中的每一个都有一组与互连不同的响应要求。此外,这些事务中的每一个都可以在多个配置中使用。我们需要验证互连对于每种事务类型是否正常工作。我们将首先概述该协议,然后再进行这些协议的测试策略。

ACE 协议概述

ACE 协议为系统级一致性提供了一个框架。它可以在跨缓存共享数据时保持正确性。它还支持最大限度地重用缓存数据。该协议旨在支持不同的一致性协议,如 MESI、ESI、MEI 和 MOESI(其中 M 代表修改,O 代表拥有,E 代表独占,S 代表共享,I 代表无效)。ACE 协议是使用以下方法实现的:

一个五状态缓存模型,用于定义相干系统中任何缓存行的状态,如下图所示:

服务器

定义的状态为:

– 有效,无效:无效时,缓存行不存在。如果有效,缓存行将存在于缓存中。

– 唯一,共享:当唯一时,缓存行仅存在于一个缓存中。共享时,缓存行可能存在于多个缓存中。

– 干净、脏污:干净后,缓存不负责更新主内存。当脏时,缓存行已相对于主内存进行了修改,并且此缓存必须确保主内存最终更新。

现有 AXI4 通道上的附加信令,允许传输新的事务和信息。

附加通道(称为侦听通道)使互连能够访问存储在与其连接的主服务器缓存中的信息。

我们将通过一个来自可共享位置的加载操作和存储操作的示例来更清楚地说明 ACE 协议。

执行加载操作

考虑下面给出的系统,其中两个主设备连接到互连。两个主节点都有一个缓存。互连也连接到主存储器。考虑主控 1 需要读取存储在变量 u 中的值的情况。还假设此值已存储在主 2 的缓存中。以下序列用于检索 u 的值:

主站 1 在读取地址通道上发出读取事务 (1)

互连在主站2的侦听地址通道上发出侦听事务(2)

主站 2 返回侦听响应和数据信息 (3a)

如果主站2未返回数据,互连将从主存储器(3b)读取数据。请注意,即使在收到对 snoop 事务的响应之前,也允许互连从主内存读取

一旦收到数据,它就会通过其读取数据通道(1)返回到主4。

ReadClean、ReadNotSharedDirty 或 ReadShared 事务用于从可共享位置执行加载操作。当启动主节点不想承担更新内存的责任时,将使用 ReadClean 事务。当主服务器想要加载数据并且可以接受除 SharedDirty 状态之外的任何状态的缓存行时,将使用 ReadNotSharedDirty 转换。当主节点想要加载数据并且可以接受处于任何状态的缓存行时,将使用 ReadShared 事务。如果不需要缓存副本,则使用 ReadOnce 事务。ReadNoSnoop 用于从不可共享的位置读取。

服务器

执行存储操作

在上面的系统中,假设主控 1 想要向变量 u 写入一个新值。以下序列用于将新值存储到 Master1 的缓存中:

Master 1 发出一个事务,指示它想要存储 u 的缓存行的唯一副本。这是通过发送MakeUnique交易(1)来完成的。

互连将侦听事务发送到主 2 以使其缓存行无效。这是通过发送 MakeInvalid 事务 (2) 来完成的。

失效完成后,Master 2 将在其侦听响应通道 (3) 上做出响应。

互连现在响应主节点 1,指示所有其他主节点使变量 u (4) 的缓存行存储值无效。

主 1 现在将 U 的新值写入其缓存中。此时,缓存行对于主控服务器 1 处于唯一状态,而主控服务器 2 中不存在此高速缓存行。

服务器

根据是否需要完整缓存行存储或部分缓存行存储,以及主服务器是否已具有缓存行的副本,存储操作将使用 MakeUnique、CleanUnique 或 ReadUnique 事务。如果正在存储的主节点没有缓存,但希望写入可共享的内存位置,则使用 WriteUnique 或 WriteLineUnique 事务。WriteNoSnoop 事务用于写入不可共享的位置。

ACE 中使用的其他交易记录

内存更新事务,用于将脏线写入内存。WriteBack 或 WriteClean 用于此目的。

逐出事务由主服务器发出,以指示要从其本地缓存中逐出的缓存行的地址。

缓存维护事务用于访问和维护系统中其他主组件的缓存。CleanShared、CleanInvalid 或 MakeInvalid 事务用于此目的。

屏障事务用于提供有关系统中事务的排序和观察的保证。这将在后续帖子中详细讨论。

分布式虚拟内存 (DVM) 事务用于虚拟内存系统维护。

基本一致性事务测试

如上所述,ACE 中使用了许多不同的事务来保持一致性。由于这些事务类型中的每一个都有不同的响应和一致性要求,因此最好单独测试每个事务类型,以确保互连满足所有规范要求。我们将以 ReadShared 事务为例来描述这些事务类型的一般验证要求。

下面是规范中的表,显示了 ReadShared 事务的缓存行状态更改:

服务器

在上表中,“开始状态”是指在发出事务之前主服务器中缓存行的状态。RRESP 是指互连对发起事务的主站给出的响应。预期结束状态是指事务完成后缓存行的状态。最后两列根据是否存在窥探过滤器引用了其他可能的最终状态,我们将在本文中详细介绍这些状态。第二个表指的是推测性阅读。这表示甚至在主服务器读取缓存行的状态之前发出的事务。基本上,如果读取事务的缓存已经具有该地址的条目,则不需要将其发送出主服务器。但是,为了提高性能,主服务器可能会选择在获取有关缓存行状态的信息之前发送事务。如果事务是在这种状态下发出的,则在第二个表中表示。

从上表可以看出,单个交易的验证空间相当大。需要注意的一个重要方面是,激励需要来自多个主站的流量。这是因为要覆盖的状态空间要求测试所有不同的响应类型和缓存状态。仅当主节点具有相对于彼此处于特定缓存行状态的缓存行时,才能在系统中创建不同的响应类型。例如,响应类型 (RRESP) 为 10 表示缓存行由另一个主服务器共享,这要求缓存行存在于互连侦听的主节点中。下图总结了测试此序列的关键要求:

服务器

在启动特定类型的事务之前,序列必须将系统初始化为随机但有效的状态。这可确保执行所有不同的响应类型和缓存行状态。

初始化必须确保也遵守缓存状态的规则。例如,缓存行只能在一个缓存中是唯一的或脏的。如果两个主节点中存在缓存行,并且两个缓存行都是干净的,则它们的数据应该是相同的。同样,如果某个位置的所有缓存行都是干净的,则缓存行的内容必须与内存的内容匹配。

序列必须具有配置感知能力:它必须知道系统中的主节点数量、这些主节点的接口类型等。使序列具有配置感知性可确保序列在具有不同拓扑的系统中可移植。

关键验证点

主缓存之间的一致性:在任何给定时间点,所有主缓存都必须具有相同的数据视图。

主缓存和内存之间的一致性:如果所有缓存行都是干净的,则缓存行的内容必须与内存的内容匹配。

窥探交易:由主站发起的每个事务都有一个相应的窥探交易,该事务将由互连启动。我们需要确保互连发出的窥探交易是正确的。

侦听和相干事务之间的数据完整性:如果 Snoop 事务返回数据,则必须将相同的数据返回给通过其读取数据通道请求数据的主服务器。

排序事务:访问同一位置的事务具有互连的特定排序要求。这将在本系列的下一篇文章中详细讨论。

在这篇文章中,我们描述了测试策略和连贯交易测试的关键方面。在下一篇文章中,我们将重点介绍与访问重叠地址相关的规范的一些细节。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分