Gem5使用教程(NoC)【智联实验室】

本文为使用gem5对片上网络(NoC)进行仿真的教程。
环境:

虚拟机VM Workstation Pro
系统Ubuntu22.04
系统内存8G
处理器数量8
硬盘60G
IDEVS Code

gem5教学文档:https://www.gem5.org/documentation/

一、安装ubuntu虚拟机

1.下载Ubuntu22.04的镜像

Ubuntu官网下很慢,去清华的镜像站下
网址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/
在这里插入图片描述
点图中圈出的下载Ubuntu22.04版本的镜像

2.创建虚拟机

创建ubuntu的虚拟机,具体创建过程上网搜,网上很多。
在设置具体配置时,根据自己电脑配置尽量设置高一点,比如我的电脑内存16G,16个处理器,我分配的就是8G内存,8个处理器,硬盘大小建议最小30G。

二、安装和编译Gem5

1.安装Gem5

直接去GitHub里下载就可以,注意要在虚拟机里下,不能在主机里下完再移到虚拟机里。
网址:https://github.com/gem5/gem5
下载完压缩包直接解压,直接放在主目录下就可以,我这里是把名字改成gem5了。
在这里插入图片描述

2.安装相关依赖

想要编译和使用Gem5还需要下载一些相关的依赖
打开终端,在终端输入以下命令进行依赖安装。

sudo apt install build-essential git m4 scons zlib1g zlib1g-dev \
    libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev \
    python3-dev libboost-all-dev pkg-config python3-tk

3.编译Gem5

以上的依赖成功安装完成后就可以编译Gem5了
首先终端进入到gem5的目录下,如下图所示
在这里插入图片描述
然后输入以下编译指令

scons build/NULL/gem5.opt -j {cpus}

{cpus}是你想使用多少个处理器来编译,根据自己分配给虚拟机处理器个数来选择,我使用的是 -j 7 。

在编译过程中可能会遇到编译失败,进程终止的问题,我遇到的导致该问题产生的原因有:(1)交换区(swap)空间太小(2)虚拟机硬盘空间不足

(1)swap太小

首先终端进入到主目录下,然后依次在终端中使用以下命令

sudo mkdir ./swap
cd ./swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=2000000
sudo chmod 600 ./swapfile
sudo mkswap -f ./swapfile
sudo swapon /swapfile

依次执行完以上命令后,使用free -m 命令查看swap空间是否扩展成功。

(2)虚拟机硬盘空间不足

扩大虚拟机的硬盘空间,首先要把虚拟机关掉。
在这里插入图片描述
点击编辑虚拟机设置
在这里插入图片描述
点击扩展,因为这里我没有关掉虚拟机,所以无法扩展。正常情况下30G是够用的。

编译结束后终端出现以下结果说明编译成功。
在这里插入图片描述
编译成功后会在/gem5/build/NULL/目录下生成以下文件
在这里插入图片描述

在Gem5的教学文档中,有更为详细的编译教程
网址:https://www.gem5.org/documentation/general_docs/building

三、使用Gem5进行片上网络的仿真

首先要修改一个文件

在这里插入图片描述
点开图中圈中的python文件,划到最底。
在这里插入图片描述
将图中红线所划位置改为1ns(正常原来是1ps),然后保存。

使用命令进行仿真

首先创建一个装命令的文件夹 我这里取名为my_command
在这里插入图片描述
进入该文件夹下,创建一个shell脚本,我这里取名commad.sh
在这里插入图片描述

./build/NULL/gem5.org configs/example/garnet_synth_traffic.py  \
        --num-cpus=16 \
        --num-dirs=16 \
        --network=garnet \
        --topology=Mesh_XY \
        --mesh-rows=4  \
        --sim-cycles=1000 \
        --synthetic=uniform_random \
        --injectionrate=0.1

以上命令是对一个4×4mesh结构的片上网络进行仿真
下面终端进入到gem5目录下,运行bash ./my_command/command.sh命令
在这里插入图片描述
出现以上结果说明仿真成功
仿真的结果会出现在gem5目录下的m5out文件夹下
在这里插入图片描述
其中的stats.txt文件中是全部的仿真结果,像平均延迟,平均跳数都在里面。

对片上网络的仿真,gem5中有很多参数,对这些参数的说明可以在教学文档中查看
网址:https://www.gem5.org/documentation/general_docs/ruby/garnet_synthetic_traffic/

扩展

如果你想对Gem5的片上网路进行修改,则需要修改gem5的源代码,gem5的底层是由C++进行编写,所以如果想要使用gem5成功自定义NoC还是需要一定的c++基础的。注意,修改后需要重新进行编译
在这里插入图片描述
gem5中garnet部分的源代码是以上图片显示的部分。个人建议想要学会如何在gem5中自定义自己的片上网络,一定要清楚消息在garnet中的生命周期,可以去教学文档中学习
网址:https://www.gem5.org/documentation/general_docs/ruby/heterogarnet/
在这里插入图片描述
搞懂上面这张图对创建自己的片上网络至关重要。

调试

学会Gem5的调试是非常重要的,如果你对Garnet做了一些修改,通过调试可以知道你所做的修改是否成功。
我常使用的两个调试命令是--debug-flags=Ruby --debug-file=debug.txt
具体使用方法如下:
在这里插入图片描述
执行完该命令后会在m5out文件夹生成一个debug.txt文件,这个文件中包含了全部的调试信息,大家在使用调试命令测试自己网络的时候记住尽量减少仿真次数(sim-cycles),否则过多的仿真次数会在生成调试结果文件(debug.txt)时消耗大量的时间,且生成的文件也会很大,几g几十g都有可能。
在这里插入图片描述
调试信息来源于garnet源代码中的DPRINTF()语句,如下图所示。
在这里插入图片描述
他在debug.txt对应的就是
在这里插入图片描述
我们也可以自行添加DPRINTF语句,用来观察自己定义的变量的值的变化,在下一节中,我给大家举个例子。

获取和设置flit中的数据块(datablock)

你们现在所做的课题,我觉得后面肯定会需要修改flit中的数据块,那garnet本身有DataBlock这个类,类里面也有获取和修改数据块信息的函数(getData()和setData()),但是想要使用这两个函数我们首先需要从消息实体(MsgPtr)中提取出DataBlock,但这是Gem5默认没有提供的,需要我们对源代码进行一点修改才能调用MsgPtr的getDataBlk()函数。
下面我告诉你们在哪里修改,首先找到Message.hh文件,在下图所示的位置。
在这里插入图片描述
打开这个文件我们可以看到默认是没有getDataBlk()函数的,只有getDestination()函数
在这里插入图片描述
我们可以借鉴getDestination()的写法自己写一个getDataBlk()函数,下面是我在Message.hh文件中所插入的语句,在做出这个修改后,我们的MsgPtr类就可以使用getData()来获取flit的数据块了,下面我举个具体的例子
在这里插入图片描述
我在NoC的网络接口(NetworkInterface)处读取flits的数据块并将数据块中的数据的前48位全部设为0×1,并添加调试语句,将修改结果显示在调试文件中。
下面是我在NetworkInterface.cc文件中所作出的修改:
在这里插入图片描述
在做出以上修改并且对Gem5进行编译后,运行仿真命令,查看调试结果(debug.txt)
在这里插入图片描述
上面是我的调试结果,可以看出我添加的用来查看数据块前三位数据的DPRINTF()语句在debug.txt中生成了。
还可以看出我对flit的数据块修改也成功了,flit原本的DataBlk全为0×0,在经过我的修改后前48位变成了0×1。

所以在gem5的使用过程中,调试的作用是非常大的,大家一定要熟练使用调试,在Gem5的教学文档中还说了其他的调试方法,大家感兴趣的也可以了解了解
网址:https://www.gem5.org/documentation/general_docs/debugging_and_testing/debugging/trace_based_debugging

常用脚本分享

以下是我常用的两个脚本:一个是提取仿真结果中的重要信息,一个是用来进行重复性实验

extract_network_stats.sh

在这里插入图片描述

lab.sh

在这里插入图片描述
以上两个脚本大家都可以根据自己的需求进行修改。

Gem5其他模式

gem5的fs和se模式是可以用来进行基准测试的,例如splash2基准。这里建议大家做为初学者就先将garnet自带的合成流量先用懂,再去研究另外两种模式。
在这里举个se模式的例子吧
在这里插入图片描述
以上是使用se模式,在4×4Mesh片上网络下执行splash2中FFT进行测试的命令
在这里插入图片描述
以上为仿真成功的结果。

最后,本文用于智联实验室片网课题的仿真器学习使用,实话实说,片上网络的学习并不简单,但希望片网课题的同学还是要静下心来,贵在坚持吧。

新来的同学如果在安装编译或使用过程中遇到实在不太懂的问题,可以在这个博客的评论区留言,如果我有时间会为大家解答,大家也可以互相交流互相学习。

  • 44
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: NOC Verilog,简称为NOC Verilog语言,是一种基于硅基微处理器的硬件描述语言,用于描述网络栅格(Network-on-Chip,简称NOC)结构的特性和功能。NOC是一种基于片上网络(Network-on-Chip,简称NOC)的通信架构,用于在片上系统(System-on-Chip,简称SOC)中实现不同功能模块之间的通信和数据传输。 NOC Verilog语言的设计是为了描述和设计NOC的结构和功能,使得硬件工程师可以使用这种语言进行硬件设计和验证。NOC Verilog提供了一种规范和标准的方法来描述NOC的拓扑结构、数据传输和通信协议等方面的信息。 使用NOC Verilog语言可以轻松地建立NOC的模型,并对其进行仿真和验证。通过定义NOC的结构和连接方式,可以方便地确定数据从一个模块到另一个模块的路径,并实现单元之间的通信。 NOC Verilog语言还支持对NOC进行性能分析和优化。在设计NOC时,可以通过修改NOC Verilog代码来调整网络的带宽、时延和吞吐量等性能指标。这样可以根据应用的需求和系统的约束,对NOC进行定制和优化。 总而言之,NOC Verilog是一种用于描述和设计网络栅格结构的硬件描述语言。它提供了一种方便、标准化和规范化的方法,使硬件工程师能够更轻松地设计、验证和优化NOC。 ### 回答2: NOC是网络隔离开关(Network on Chip)的缩写,它是一种用于集成电路内部的通信架构。NOC的设计是为了解决集成电路内各个模块之间的通信问题,特别是在多处理器系统中。NOC的目标是提供高效的通信通道,减少通信延迟,提高系统性能。 Verilog是一种硬件描述语言,用于描述数字电路的结构和行为。它主要用于设计和仿真集成电路,并且对于设计大型复杂系统非常有用。Verilog的设计可以通过编写代码来定义电路的结构和行为,并使用仿真工具验证电路的功能。 当把NOC和Verilog结合起来时,可以使用Verilog来描述和设计NOC结构。通过使用Verilog语言,可以定义NOC的各个模块以及它们之间的通信方式。同时,Verilog还可以用于验证NOC的功能,通过仿真工具来模拟NOC的行为,以确保其在实际应用中的正确性和稳定性。 总而言之,NOC Verilog指的是使用Verilog语言来描述和设计网络隔离开关的结构和行为。通过使用Verilog语言,可以更好地实现NOC的设计、验证和优化,提高集成电路系统的性能和可靠性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值