高级祭祖 Bluespec 现代工具链简单食用指南
本文的目标阅读群体是还在上北航 6 系高级计组,但是看着 RHEL、Git 1.8 和还需要 X11 转发 GUI 的 Bluespec 工具链不爽的同学们。
本文作者强烈要求以后的实验全部用 Chisel 做。
前情提要:你或许不知道,但是 Bluespec 工具链已经开源了。地址在这里:https://github.com/B-Lang-org/bsc/。开源版本的 Bluespec 跟闭源版本存在一点不兼容(主要是名称上的,详情见 2021.07 版本的发布日志),但是基本一致。
如果你不想在本地安装 Bluespec,但是想直接用远程机的命令行进行编译,那么可以直接跳到 Step 1 阅读。
Step 0. 安装 Bluespec
要自己搭工具链那肯定不能再用老师提供的机器了。
Bluespec 工具链分为两个部分:提供基础功能的编译器 bsc
以及图形环境 bdw
(在实验机器上的命令是 bluespec
那个)。要编译我们写的 Bluespec 程序,我们可以不用 bdw
,直接用 bsc
——缺点嘛,就是要对着命令行发呆喽。
Bluespec 在开源仓库里面为 bsc 提供了 MacOS、CentOS 和 Ubuntu 版本的预编译程序,其他操作系统的同学需要自己编译。此外,Arch Linux 的同学可以在 AUR 安装 bluespec-git
包,NixOS 的同学可以安装 bluespec
包,当然都需要自己编译(笑)。
本文作者截止本次更新时尚未尝试过安装或运行过 bdw,所以很抱歉这里还没有关于 bdw 的具体安装指南。应该一个 make install
就能解决了(吧?)。
用你喜欢的方式安装好 Bluespec 编译器工具链之后就可以编译运行 Bluespec 编译器编译 bsv 文件啦!
Step 1. 运行
Bluespec 提供了完善的 编译器操作指南 和 程序库参考指南,本文只介绍快速入门的用法(其实是因为作者也是初学)。
按照课程 PPT 的要求下载和解压了 Lab1 的内容之后,差不多是这个情况:
❯ ls -la
.rwxrwxrwx 330 rynco 6 Jan 2013 Gates.bsv
.rwxrwxrwx 3.2k rynco 7 Jan 2013 Lab1.bspec
.rwxrwxrwx 44 rynco 7 Jan 2013 Makefile
.rwxrwxrwx 1.2k rynco 2 May 2013 RightShifter.bsv
.rwxrwxrwx 341 rynco 6 Jan 2013 RightShifterTypes.bsv
.rwxrwxrwx 1.5k rynco 7 Jan 2013 TestShifter.bsv
下面我们编译一下我们的测试程序。Bluespec 的编译分为两步:
- 把 Bluespec SystemVerilog
.bsv
编译成 Bluesim Object.bo
文件; - 把
.bo
文件编译到测试用的程序文件。
两步都要用到 bsc
,但是使用的命令不一样。下面先进行第一步:
❯ bsc -sim -u TestShifter.bsv
checking package dependencies
compiling ./RightShifterTypes.bsv
compiling ./Gates.bsv
compiling ./RightShifter.bsv
compiling TestShifter.bsv
code generation for mkTests starts
Elaborated module file created: mkTests.ba
All packages are up to date.
解释一下命令行的参数:
-sim
参数指示编译器把源代码编译到 Bluesim Object 文件;-u
参数指示编译器递归编译文件的所有依赖;- 最后一个参数是要编译的文件。这里我们想要的是测试程序,所以直接编译测试文件就可以。
编译完成之后,我们的目录里就多了一大堆 .bo
文件,以及一个 mkTests.ba
。 mkTests.ba
是它为我们自动生成的用来测试的一个 module,下一步我们要从这里开始。
第二步就是生成 Bluesim 的测试程序。
❯ bsc -sim -e mkTests
Bluesim object created: mkTests.{h,o}
Bluesim object created: model_mkTests.{h,o}
Simulation shared library created: a.out.so
Simulation executable created: a.out
同样解释一下命令行参数:
-sim
的意义跟之前一样;-e <module>
指示编译器生成用于<module>
参数的模拟器,这里是我们上一步生成的mkTests
模块。
进行完这一步之后,我们就有最终的测试程序 a.out
了。运行它就可以测试我们的硬件能不能正常工作了!
Step 2. 测试
❯ ./a.out
correct!
correct!
correct!
correct!
correct!
correct!
如果你修改了源代码,你需要重新做一遍前两步才可以得到更新之后的测试程序。当然,你可以写点 makefile 来解决这个问题,比如:
%.bo: %.bsv
bsc -sim -u $*.bsv
mkTests.ba: TestShifter.bo # replace with the current testing file
test: mkTests.ba
bsc -sim -e mkTests
./a.out
这样就可以一个 make test
走天下了(笑)
后记
本文作者也只是刚开始使用 Bluespec,所以文章内容可能会有疏漏。后续实验如果涉及到了更新的功能,我会在本文中更新。对文章内容有任何疑问或者补充都可以邮件联系。
用 VSCode 的同学可以在插件市场里找到 Bluespec 的支持插件。