|
| 1 | +# 实验3 |
| 2 | + |
| 3 | +## 简介 |
| 4 | + |
| 5 | +在本次实验中,你将设计一个布线算法,探索每个数据集的最小布线通道宽度,并输出相应的routing segments数量。 |
| 6 | + |
| 7 | +* 实现你的算法,但**暂时不提交**代码。(大作业时统一收三次实验代码)。 |
| 8 | +* **提交**实验报告说明你是如何做的,实验报告应该包含以下内容: |
| 9 | + * <mark>学号+姓名</mark> |
| 10 | + * 算法逻辑和实现思路 |
| 11 | + * 你采用的算法是什么算法? |
| 12 | + * 你是如何设计算法的? |
| 13 | + * 你的算法有无特别之处、创新之处。 |
| 14 | + * 等等。 |
| 15 | + * 你的算法运行结果表格,报告每一个数据集的最小布线通道宽度和对应的routing segments数量。 |
| 16 | + * 实验总结。说明你的方法存在的优缺点,下一步改进的方向是什么? |
| 17 | + * <mark>非必要,报告中不包含实验代码。实验代码和截图不计入总页数。</mark> |
| 18 | + |
| 19 | +## FPGA架构说明 |
| 20 | + |
| 21 | +下图描述了FPGA架构。 |
| 22 | + |
| 23 | +每个`Logic block`共有4个引脚,其中,引脚1和2与左边相邻通道的所有轨道连接,引脚3和4与上边相邻通道的所有轨道连接,通道的轨道数即为通道的宽度W。 |
| 24 | + |
| 25 | +<img width=400 alt="switch-block" src="/VLSI-FPGA/lab3/img/arch.png" style="margin:auto; display:flex;"> |
| 26 | + |
| 27 | +开关块(switch block)是双向的,使用Wilton拓扑连接水平和垂直方向的导线,其中W为通道宽度。 |
| 28 | + |
| 29 | +从左到右和从右到左保持相同的轨道序号,具体线路编号和连接规则如下图所示: |
| 30 | +* 从左到上则是`i`到`W-i` |
| 31 | +* 从上到右则是`i`到`(i+1)%W` |
| 32 | +* 从右到下则是`i`到`(2W-2-i)%W` |
| 33 | +* 从下到左则是`i`到`(i+1)%W` |
| 34 | + |
| 35 | +<img width=700 alt="route-track" src="/VLSI-FPGA/lab3/img/routing_tracks.png" style="margin:auto; display:flex;" /> |
| 36 | + |
| 37 | +## 代码说明 |
| 38 | + |
| 39 | +为了降低同学们非核心算法的代码量,助教为各位同学提供了一个初始代码,你只需要实现一个布线算法。 |
| 40 | + |
| 41 | +初始代码包括了`FPGA`、`FpgaTile`、`Design`、`Net`、`RRNode`等基本类,你需要在`Solution.cpp`中实现你的算法,然后在`main.cpp`中调用你的算法。 |
| 42 | + |
| 43 | +* `main.cpp`:主可执行文件,需要两个命令行参数——电路文件的路径和通道布线宽度。 |
| 44 | +* `Design.cpp/.h`:包含设计中所有线网的类。 |
| 45 | +* `FPGA.cpp/.h`:包含FPGA大小,通道宽度和一个包含所有FPGA块的列表,`getNumSegmentsUsed`函数可以获得routing segments的数量。 |
| 46 | +* `FpgaTile.cpp/.h`:表示FPGA块的类,包含指向相邻FPGA块的指针,以及指向块中`RRNode`引脚和导线的指针,这里的FPGA块包括开关块,开关块右边的导线`hWire`,开关块下面的导线`vWire`,以及`logic block`(只有开关块的右边和下面都有开关块的时候才存在)的4个`cbWire`。 |
| 47 | +* `Net.cpp/.h`:表示线网的类,包含一个源`RRNode`和目标`RRNode`列表。 |
| 48 | +* `RRNode.cpp/.h`:表示单个布线资源节点(导线或引脚)的类,带有指向所有连接的`RRNode`的指针。要使用`RRNode`分配一个线网进行布线,你可以调用`RRNode->setNet()`。 |
| 49 | +* `Solution.cpp/.h`:包含一个`Router`空类,你需要在此基础上实现一个`MyRouter`类,**并实现你的布线算法**,你需要为每个线网分配相应的`RRNode`。 |
| 50 | + |
| 51 | +### 数据集 |
| 52 | + |
| 53 | +下载链接:[校内链接(circuits.zip)](http://172.18.233.211:5244/d/VLSI%E8%AF%BE%E4%BB%B6/dataset/routing/circuits.zip?sign=_PReUHaMMGRJNm3A7aqg-KvFcuOpxh4_QY-SNmCw25A=:0)和[校外链接]() |
| 54 | + |
| 55 | +数据集大小如下图所示: |
| 56 | + |
| 57 | +| 数据集名称 | 网格大小 | 线网数量 | |
| 58 | +| ----------- | -------- | -------- | |
| 59 | +| huge | 40 | ~900 | |
| 60 | +| xl | 30 | ~490 | |
| 61 | +| large_dense | 20 | ~400 | |
| 62 | +| lg_sparse | 20 | ~140 | |
| 63 | +| med_dense | 12 | ~140 | |
| 64 | +| med_sparse | 12 | ~50 | |
| 65 | +| small_dense | 6 | ~20 | |
| 66 | +| tiny | 4 | ~10 | |
| 67 | + |
| 68 | +### 程序运行方法 |
| 69 | + |
| 70 | +1. 手动编译运行 |
| 71 | + |
| 72 | +```bash |
| 73 | +g++ -std=c++17 -o main main.cpp Design.cpp FPGA.cpp FpgaTile.cpp Net.cpp RRNode.cpp Solution.cpp |
| 74 | +./main.exe ./circuits/tiny 12 |
| 75 | +``` |
| 76 | + |
| 77 | +2. 使用`makefile`脚本编译运行 |
| 78 | + |
| 79 | +```bash |
| 80 | +make all |
| 81 | +``` |
| 82 | + |
| 83 | +3. 兼容Vscode的`F5运行并调试`功能: |
| 84 | + |
| 85 | +操作方式类似于实验1,在`.vscode/launch.json`中配置`args`参数,使其适应lab3程序的参数需求即可。 |
| 86 | + |
| 87 | +## 输入文件格式 |
| 88 | + |
| 89 | +本节内容面向需要自行编写数据读取模块的同学。 |
| 90 | + |
| 91 | +* 第一行由一个整数n组成,其中n表示n×n的logic blocks网格,网格单元在每个维度中从0到n-1进行编号。 |
| 92 | + |
| 93 | +* 接下来的行的格式为:`XS YS PS XD1 YD1 PD1 XD2 YD2 PD2 ...`,其中XS,YS表示源点的坐标,PS表示源点的引脚,XD1,YD1表示目标点的坐标,PD1表示目标点的引脚。当读取到`-1 -1 -1 -1 -1 -1 `时停止。 |
| 94 | + |
| 95 | +示例输入文件: |
| 96 | + |
| 97 | +```text |
| 98 | +10 表示(10 x 10)网格 |
| 99 | +1 2 4 2 3 2 (1,2)处的块的引脚4连接(2,3)处的块的引脚2 |
| 100 | +0 0 4 1 2 3 (0,0)处的块的引脚4连接(1,2)处的块的引脚3 |
| 101 | +-1 -1 -1 -1 -1 -1 表示读取终止 |
| 102 | +``` |
| 103 | + |
| 104 | +## 输出文件格式 |
| 105 | + |
| 106 | +要求布线算法的输出是一个文件,命名格式为`benchmark_name_routing.txt`,如`tiny_routing.txt`。 |
| 107 | + |
| 108 | +输出文件为两行,第一行为布线通道宽度,第二行为routing segments的数量,例如: |
| 109 | + |
| 110 | +```text |
| 111 | +12 |
| 112 | +48 |
| 113 | +``` |
| 114 | + |
| 115 | +## 如何提交 |
| 116 | + |
| 117 | +实验报告命名为**学号\_姓名\_第三次作业.pdf**。 |
| 118 | + |
| 119 | +发送到助教邮箱(可在主页找到)<br> |
| 120 | +<mark>截止日期:2025年6月19日23时59分</mark><br> |
| 121 | +后期会统计已经收到作业的同学,并发在群里。如果上传作业后有更新,请命名为V2、V3……,并在助教统计作业上交情况时注意是否收到最新版本。 |
| 122 | + |
0 commit comments