最近一生一芯做到了接 SoC 的部分,发现还是需要重新配置一下 mill 的配置文件才能使用 IDEA 的高亮和代码跳转,因此记录一下配置过程。

ysyxSoC Chisel 开发环境配置

如果是在 2024 年 4 月 21 号后获取的代码,请直接跳到 新版本 ysyxSoC 代码导入章节!

代码导读

ysyxSoC 的代码可以通过下面的命令进行获取:

1
2
cd ysyx-workbench
git clone [email protected]:OSCPU/ysyxSoC.git

ysyxSoC 的代码结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ysyxSoC
├── Makefile
├── chiplink # chiplink 相关代码
├── generated # 生成的 SoC 代码
│   ├── ysyxSoCFull-ChipLink.v
│   └── ysyxSoCFull.v
├── lint # verilator lint 检查
│   ├── Makefile
│   ├── README.md
│   └── verilator-warning.txt
├── patch # Rocket-chip 的补丁
│   ├── chisel6.diff
│   └── rocket-chip.patch
├── perip # 外设相关 IP
├── rocket-chip # rocket-chip 代码
├── soc # soc 代码
└── spec # spec 文档(接口规范)
└── cpu-interface.md

ysyxSoC 的总线部分借助了 rocket-chipdiplomacy 框架来完成连接,因此我们通过阅读 ysyxSoC 的 Makefile 可以得知,ysyxSoC 的代码是在 rocket-chip 中生成,再拷贝到 generated 文件夹中的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FINAL_V = rocket-chip/out/emulator/freechips.rocketchip.system.TestHarness/freechips.rocketchip.system.DefaultConfig/mfccompiler/compile.dest/TestHarness.sv
YSYXSOCFULL_V = generated/ysyxSoCFull.v
ROCKET_CHIP_YSYXSOC_PATH = rocket-chip/src/main/scala/ysyxSoC
ROCKET_CHIP_CHIPLINK_PATH = rocket-chip/src/main/scala/chiplink

$(YSYXSOCFULL_V):
cp $(abspath soc)/* $(ROCKET_CHIP_YSYXSOC_PATH)
cp $(abspath chiplink)/* $(ROCKET_CHIP_CHIPLINK_PATH)
$(MAKE) -C rocket-chip verilog
cp $(FINAL_V) $@
sed -i -e 's/_\(aw\|ar\|w\|r\|b\)_\(\|bits_\)/_\1/g' $@
sed -i '/firrtl_black_box_resource_files.f/, $$d' $@

verilog: $(YSYXSOCFULL_V)

我使用 JetBrains 家的 IDEA 进行 Chisel 的开发,但是由于我将 ysyxSoC 文件夹直接加到了 npc 目录中,且暂时未对 build.sc 进行修改,这导致 ysyxSoC 文件夹中所有的 chisel 代码在 IDEA 都无法进行高亮显示和代码跳转。因此接下来我们要对 build.sc 进行适当调整,以提供 IDEA Support 。

为 rockee-chip 添加 IDEA 支持

我在 npc 文件夹中直接加入了 ysyxSoC 框架,所以接下来需要改动 npc 中的 build.sc,以将 rocket-chip 加入到我的构建模块中。
这里我偷了个小懒, 借鉴了香山的 build.sc,对其进行了适当的删减(去除了很多不需要的模块)。
修改过的 build.sc 如下:

需要说明一下的是这里我同样也是选择了进行了 Cross Builds,主要是出于两个考虑:

  1. 需要将 rocket-chip 的 build.sc 加进 npc 的 build.sc, 而 rocket-chip 中的 build.sc 是 Cross Builds,因此为了偷懒,不修改 rocket-chip 代码我将 npc 也改为 Cross Builds 了
  2. ysyxSoC 环境中默认使用 chisel3.6, 而我在 npc 环境中可能会用到 chisel6 甚至是 chisel7,因此使用 Cross Builds 更方便切换版本

经过上述修改后,rocket-chip 已经被我加入到了 npc 的 mill 构建系统中,但是如果直接进行编译:

1
mill -i __.compile

我们会发现 mill 的编译是无法通过的。这是因为目前 rocket-chip 还是使用 chisel5, 有许多 API 在 chisel6 中已经被废弃了,因此我们还是需要对 rocket-chip 中的部分代码进行修改

替换 rocket-chip 中在 chisel6 中已弃用的 API

我们进入香山 fork 的 rocket-chip 仓库,可以看到香山中的 rocket-chip 也已经对这些在 chisel6 中被废弃的 API 进行了 替换
xiangshan rocket-chip
当然,由于猜测香山的 rocket-chip 做了些定制化的修改,具体的代码位置和内容与 ysyxSoC 中的代码相比可能会有区别,我还是选择从 chipsalliance 的 rocket-chip 仓库中 fork 了一个 rocket-chip 进行修改。
因此只要根据我 fork 的仓库 生成 path 补丁即可:

1
2
3
4
git clone https://github.com/Emin017/rocket-chip.git rocket-chip-patch
cd rocket-chip-patch
git checkout minsoc
git diff 542030fe dbcb06af > ../patch/chisel6.patch

这里也直接提供了一个可以直接使用的 patch:

最后只要进行将这个 patch 打上就行了:

1
2
cd ysyxSoC/rocket-chip
git apply ../patch/chisel6.patch

为 SoC 相关代码提供高亮和跳转支持

ysyxSoC 目录中的 soc 文件夹和 chiplink 文件夹中也有 chisel 代码文件,这些代码是需要被拷贝到 rocket-chip 中,参与最终的 verilog 生成。
我选择将这些代码文件夹软连接到 src 中的 ysyx 文件夹中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
src
└── main
└── scala
├── amba
│   ├── ahb
│   ├── apb
│   ├── axi4
│   ├── axis
├── aop
├── chiplink
├── devices
│   ├── debug
│   └── tilelink
├── diplomacy
├── examples
├── formal
├── groundtest
├── interrupts
├── jtag
├── prci
├── regmapper
├── rocket
├── subsystem
├── system
├── tile
├── tilelink
├── unittest
├── util
├── ysyx
│   ├── chiplink -> ysyxSoC/chiplink
│   └── soc -> ysyxSoC/soc
└── ysyxSoC

OK,现在所有的代码应该都有高亮和跳转支持了,可以直接通过 mill 生成 IDEA 索引:

1
2
cd ysyxSoC
mill -i mill.idea.GenIdea/idea

新版本 ysyxSoC 代码导入

yzh 老师在 2024 年 4 月 21 日推送了新版本的 ysyxSoC 框架,新版本的 SoC 框架相较与旧版本有了大量的改动,其结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ysyxSoC
├── Makefile
├── build.sc
├── lint // lint 语法检查
│   ├── Makefile
│   ├── README.md
│   └── verilator-warning.txt
├── patch // rocket-chip 补丁
│   └── rocket-chip.patch
├── perip //外设 IP
│   ├── amba
│   ├── bitrev
│   ├── flash
│   ├── gpio
│   ├── ps2
│   ├── psram
│   ├── sdram
│   ├── spi
│   ├── uart16550
│   └── vga
├── rocket-chip
├── spec // cpu 端口规范说明
│   └── cpu-interface.md
└── src // ysyxSoC 代码
├── CPU.scala
├── SoC.scala
├── Top.scala
├── amba
├── chiplink
├── device
└── util

在新版 ysyxSoC 中,我们可以发现 ysyxSoC 的代码被统一移动到了 src 文件夹下(此前分为 chiplink 和 soc 两个文件夹),因此现在我们无需软链接即可生成所有代码的 IDEA 索引。另外工程中也内置了 build.sc,在其中已经将 rocketchip 加入到 MILL 的构建中,并且还声明了一个名为 ysyxsoc 的单例对象(ysyxsoc 中定义了 rocketchip 模块),所以我们在 npc 的 build.sc 中定义这个对象就能导入 ysyxSoC 工程。详细修改如下:

另外还需要注意的是 ysyxSoC 中虽然引入了 rocket-chip, 但是并没有采用 Cross Build, 因此如果要采用和上文一样的 Cross Build 方式,则还需要进行更多的修改。

到这里我们就能使用代码高亮和自动跳转啦!Enjoy it ! :)