使用gem5模拟器入门(二)——创建一个简单的配置脚本-CSDN博客配置脚本作为起点,本章将介绍一个更复杂的配置。我们将向系统添加一个缓存层次结构,如下图所示。此外,本章还将介绍如何理解gem5的统计输出,并向您的脚本添加命令行参数。
1.创建Cache对象
我们将使用经典的缓存,而不是ruby-intro-chapter,因为我们正在模拟一个单CPU系统,我们不关心建模缓存一致性。我们将扩展Cache SimObject并为我们的系统配置它。首先,我们必须了解用于配置缓存对象的参数。
Cache SimObject的声明可以在src/mem/cache/Cache.py中找到。这个Python文件定义了您可以设置SimObject的参数。在底层,当实例化SimObject时,这些参数被传递给对象的C++实现。Cache SimObject继承自下面显示的BaseCache对象。
在BaseCache类中,有许多参数。例如,assoc是一个整数参数。一些参数,比如write_buffers,在这种情况下有一个默认值8。默认参数是Param.*的第一个参数,除非第一个参数是一个字符串。每个参数的字符串参数是描述参数是什么的(例如,tag_latency = Param.Cycles("Tag lookup latency")表示tag_latency控制“此缓存的命中延迟”)。
许多这些参数没有默认值,所以我们需要在调用m5.instantiate()之前设置这些参数。
现在,为了使用特定参数创建缓存,我们首先要在与simple.py相同的目录configs/tutorial/part1中创建一个新文件caches.py。第一步是在这个文件中导入我们要扩展的SimObject(s)。
from m5.objects import Cache
接下来,我们可以像对待任何其他Python类一样对待BaseCache对象并对其进行扩展。我们可以将新缓存命名为任何我们想要的名字。让我们从创建一个L1缓存开始。
class L1Cache(Cache):
assoc = 2
tag_latency = 2
data_latency = 2
response_latency = 2
mshrs = 4
tgts_per_mshr = 20
这里,我们设置了一些BaseCache中没有默认值的参数。要查看所有可能的配置选项,并找出哪些是必需的,哪些是可选的,您必须查看SimObject的源代码。在这种情况下,我们使用BaseCache。
我们扩展了BaseCache并设置了大多数在BaseCache SimObject中没有默认值的参数。接下来,让我们创建L1Cache的两个子类,一个是L1DCache,另一个是L1ICache。
class L1ICache(L1Cache):
size = '16kB'
class L1DCache(L1Cache):
size = '64kB'
也创建一个带有一些合理参数的L2缓存。
class L2Cache(Cache):
size = '256kB'
assoc = 8
tag_latency = 20
data_latency = 20
response_latency = 20
mshrs = 20
tgts_per_mshr = 12
现在我们已经指定了BaseCache所需的所有必要参数,我们只需要实例化我们的子类并将缓存连接到互连即可。然而,将大量对象连接到复杂的互连可能会使配置文件迅速增长并变得难以阅读。因此,让我们首先为Cache的子类添加一些辅助函数。请记住,这些只是Python类,所以我们可以像处理Python类一样处理它们。