gem5作为multicore的一个仿真软件,在各大高手的努力下,也有了NoC的部分。好像早就有了,就是最近我才用到,才注意到。
我在gem5中看到的就是garnet2.0了,他是在ruby下的NoC模型。
基本的使用方法是
--ruby --network=garnet2.0 --topology=XXX --num-dir=XXX XXX是需要自己填的
查看具体参数的话--ruby -help
如果使用FS的话,编译gem5需要指定使用PROTOCOL,选项的话在/gem5/config/ruby/中,例子如下
PROTOCOL=MOESI_hammer
他功能还是挺全的,可以选择clock,topology,latency,buffers,routing-algorithm等。
有一个课程,有条件的可以参加,像我没有条件的,就只能看看PPT和布置的作业自己学习了。
Garnet2.0中的NoC由如下几个部分组成:
各个部分的连接是在/gem5/config/ruby/Ruby.py中
具体的源码在/gem5/src/mem/ruby中
先看network中的文件,贼尴尬
在头文件中,定义了Topology的Class。包括了link,switch等。
createLInks函数创建各个switch的最短连接
看名称就知道设置了基础的Link、Router,Buffer的类,就不多说了。Buffer还有一些函数。
这个是将上述通用的部件组合在一起,并进行了初始化。有一个函数是addressToNodeID,这个是map了每个节点的地址。
上面的是通用的配置,因为我主要用的是Garnet2.0,所以还得看garnet2.0文件夹下面的代码。这就比较困难了,因为我NoC的基础也不是很好,哎。
看代码先看README,
先说说readme,readme中也有了一些解释。
大概就是所有的当scheduleevent之后就会在规定时间调用各种wakeup函数,使整个流程完成。
然后是其他的文件。
未完待续
首先在/gem5/config/ruby/topologies中有很多的topology可以选择。
我们可以仿照着写,一个topology有如下的部分组成
函数返回一个topology对象,其属性包括routers以及extlink和inlink,都是对象数组。此MakeTopology函数的主要任务是构建路由器以及各种节点与路由器之间、路由器与路由器之间的连线。
这里是输出的参数选择,在“--routing-algotithm”中增加自己的算法
这个文件具体定义routing-algorithm
函数outportCompute是选择算法的函数,默认是使用路由表
在switch中选择routing_algorithm,使用对应的lookupxxxxx函数
接下来就看看lookupxxx函数,比如lookupRoutingTable函数
可以按照这个来写自己的routing_algorithm,注意是输入和输出。
参考:
http://synergy.ece.gatech.edu/tools/garnet/
http://www.gem5.org/Garnet2.0
Extending Gem5-Garnet for Efficient and Accurate Trace-driven NoC Simulation