高级祭祖 Bluespec 现代工具链简单食用指南

at 2022-05-14
本文的目标阅读群体是还在上北航 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 的编译分为两步:

  1. 把 Bluespec SystemVerilog .bsv 编译成 Bluesim Object .bo 文件;
  2. .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.bamkTests.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 的支持插件