[{"data":1,"prerenderedAt":375},["ShallowReactive",2],{"post-legacy\u002Fhigh-arch-bluespec-toolchain":3},{"id":4,"title":5,"aliases":6,"author":8,"authors":8,"body":9,"cover":8,"date":362,"description":363,"draft":364,"excerpt":8,"extension":365,"extra":8,"meta":366,"navigation":290,"pageKind":8,"path":367,"seo":368,"stem":369,"taxonomy":370,"unlisted":8,"__hash__":374},"posts\u002Fposts\u002Flegacy\u002Fhigh-arch-bluespec-toolchain.md","高级祭祖 Bluespec 现代工具链简单食用指南",[7],"high-arch-bluespec-toolchain",null,{"type":10,"value":11,"toc":360},"minimark",[12,19,30,33,46,49,54,57,79,89,96,99,103,116,119,125,128,149,155,160,163,181,194,197,202,205,226,233,237,246,249,334,341,345,348,356],[13,14,15],"blockquote",{},[16,17,18],"p",{},"本文的目标阅读群体是还在上北航 6 系高级计组，但是看着 RHEL、Git 1.8 和还需要 X11 转发 GUI 的 Bluespec 工具链不爽的同学们。",[13,20,21],{},[16,22,23,24,29],{},"本文作者强烈要求以后的实验全部用 ",[25,26,28],"a",{"href":27},"https:\u002F\u002Fgithub.com\u002Fchipsalliance\u002Fchisel3","Chisel"," 做。",[31,32],"hr",{},[16,34,35,36,40,41,45],{},"前情提要：你或许不知道，但是 Bluespec 工具链已经开源了。地址在这里：",[25,37,39],{"href":38},"https:\u002F\u002Fgithub.com\u002FB-Lang-org\u002Fbsc\u002Freleases\u002Ftag\u002F2022.01","https:\u002F\u002Fgithub.com\u002FB-Lang-org\u002Fbsc\u002F","。开源版本的 Bluespec 跟闭源版本存在一点不兼容（主要是名称上的，详情见 ",[25,42,44],{"href":43},"https:\u002F\u002Fgithub.com\u002FB-Lang-org\u002Fbsc\u002Fblob\u002F2021.07\u002Frelease\u002FReleaseNotes.adoc#202107-release","2021.07 版本的发布日志","），但是基本一致。",[16,47,48],{},"如果你不想在本地安装 Bluespec，但是想直接用远程机的命令行进行编译，那么可以直接跳到 Step 1 阅读。",[50,51,53],"h1",{"id":52},"step-0-%E5%AE%89%E8%A3%85-bluespec","Step 0. 安装 Bluespec",[16,55,56],{},"要自己搭工具链那肯定不能再用老师提供的机器了。",[16,58,59,60,64,65,68,69,72,73,75,76,78],{},"Bluespec 工具链分为两个部分：提供基础功能的编译器 ",[61,62,63],"code",{},"bsc"," 以及图形环境 ",[61,66,67],{},"bdw"," （在实验机器上的命令是 ",[61,70,71],{},"bluespec"," 那个）。要编译我们写的 Bluespec 程序，我们可以不用 ",[61,74,67],{}," ，直接用 ",[61,77,63],{}," ——缺点嘛，就是要对着命令行发呆喽。",[16,80,81,82,85,86,88],{},"Bluespec 在开源仓库里面为 bsc 提供了 MacOS、CentOS 和 Ubuntu 版本的预编译程序，其他操作系统的同学需要自己编译。此外，Arch Linux 的同学可以在 AUR 安装 ",[61,83,84],{},"bluespec-git"," 包，NixOS 的同学可以安装 ",[61,87,71],{}," 包，当然都需要自己编译（笑）。",[16,90,91,92,95],{},"本文作者截止本次更新时尚未尝试过安装或运行过 bdw，所以很抱歉这里还没有关于 bdw 的具体安装指南。应该一个 ",[61,93,94],{},"make install"," 就能解决了（吧？）。",[16,97,98],{},"用你喜欢的方式安装好 Bluespec 编译器工具链之后就可以编译运行 Bluespec 编译器编译 bsv 文件啦！",[50,100,102],{"id":101},"step-1-%E8%BF%90%E8%A1%8C","Step 1. 运行",[13,104,105,106,110,111,115],{},"Bluespec 提供了完善的 ",[25,107,109],{"href":108},"https:\u002F\u002Fgithub.com\u002FB-Lang-org\u002Fbsc\u002Freleases\u002Fdownload\u002F2022.01\u002Fbsc_user_guide.pdf","编译器操作指南"," 和 ",[25,112,114],{"href":113},"https:\u002F\u002Fgithub.com\u002FB-Lang-org\u002Fbsc\u002Freleases\u002Fdownload\u002F2022.01\u002Fbsc_libraries_ref_guide.pdf","程序库参考指南","，本文只介绍快速入门的用法（其实是因为作者也是初学）。",[16,117,118],{},"按照课程 PPT 的要求下载和解压了 Lab1 的内容之后，差不多是这个情况：",[120,121,122],"pre",{},[61,123,124],{},"❯ ls -la\n.rwxrwxrwx  330 rynco  6 Jan  2013 Gates.bsv\n.rwxrwxrwx 3.2k rynco  7 Jan  2013 Lab1.bspec\n.rwxrwxrwx   44 rynco  7 Jan  2013 Makefile\n.rwxrwxrwx 1.2k rynco  2 May  2013 RightShifter.bsv\n.rwxrwxrwx  341 rynco  6 Jan  2013 RightShifterTypes.bsv\n.rwxrwxrwx 1.5k rynco  7 Jan  2013 TestShifter.bsv",[16,126,127],{},"下面我们编译一下我们的测试程序。Bluespec 的编译分为两步：",[129,130,131,143],"ol",{},[132,133,134,135,138,139,142],"li",{},"把 Bluespec SystemVerilog ",[61,136,137],{},".bsv"," 编译成 Bluesim Object ",[61,140,141],{},".bo"," 文件；",[132,144,145,146,148],{},"把 ",[61,147,141],{}," 文件编译到测试用的程序文件。",[16,150,151,152,154],{},"两步都要用到 ",[61,153,63],{}," ，但是使用的命令不一样。下面先进行第一步：",[120,156,157],{},[61,158,159],{},"❯ bsc -sim -u TestShifter.bsv\nchecking package dependencies\ncompiling .\u002FRightShifterTypes.bsv\ncompiling .\u002FGates.bsv\ncompiling .\u002FRightShifter.bsv\ncompiling TestShifter.bsv\ncode generation for mkTests starts\nElaborated module file created: mkTests.ba\nAll packages are up to date.",[16,161,162],{},"解释一下命令行的参数：",[164,165,166,172,178],"ul",{},[132,167,168,171],{},[61,169,170],{},"-sim"," 参数指示编译器把源代码编译到 Bluesim Object 文件；",[132,173,174,177],{},[61,175,176],{},"-u"," 参数指示编译器递归编译文件的所有依赖；",[132,179,180],{},"最后一个参数是要编译的文件。这里我们想要的是测试程序，所以直接编译测试文件就可以。",[16,182,183,184,186,187,190,191,193],{},"编译完成之后，我们的目录里就多了一大堆 ",[61,185,141],{}," 文件，以及一个 ",[61,188,189],{},"mkTests.ba"," 。 ",[61,192,189],{}," 是它为我们自动生成的用来测试的一个 module，下一步我们要从这里开始。",[16,195,196],{},"第二步就是生成 Bluesim 的测试程序。",[120,198,199],{},[61,200,201],{},"❯ bsc -sim -e mkTests\nBluesim object created: mkTests.{h,o}\nBluesim object created: model_mkTests.{h,o}\nSimulation shared library created: a.out.so\nSimulation executable created: a.out",[16,203,204],{},"同样解释一下命令行参数：",[164,206,207,212],{},[132,208,209,211],{},[61,210,170],{}," 的意义跟之前一样；",[132,213,214,217,218,221,222,225],{},[61,215,216],{},"-e \u003Cmodule>"," 指示编译器生成用于 ",[61,219,220],{},"\u003Cmodule>"," 参数的模拟器，这里是我们上一步生成的 ",[61,223,224],{},"mkTests"," 模块。",[16,227,228,229,232],{},"进行完这一步之后，我们就有最终的测试程序 ",[61,230,231],{},"a.out"," 了。运行它就可以测试我们的硬件能不能正常工作了！",[50,234,236],{"id":235},"step-2-%E6%B5%8B%E8%AF%95","Step 2. 测试",[120,238,243],{"className":239,"code":241,"language":242},[240],"language-text","❯ .\u002Fa.out\ncorrect!\ncorrect!\ncorrect!\ncorrect!\ncorrect!\ncorrect!\n","text",[61,244,241],{"__ignoreMap":245},"",[16,247,248],{},"如果你修改了源代码，你需要重新做一遍前两步才可以得到更新之后的测试程序。当然，你可以写点 makefile 来解决这个问题，比如",[120,250,254],{"className":251,"code":252,"language":253,"meta":245,"style":245},"language-make shiki shiki-themes min-light min-light min-dark","%.bo: %.bsv\n    bsc -sim -u $*.bsv\n\nmkTests.ba: TestShifter.bo # replace with the current testing file\n\ntest: mkTests.ba\nbsc -sim -e mkTests\n.\u002Fa.out\n","make",[61,255,256,279,285,292,306,311,322,328],{"__ignoreMap":245},[257,258,261,265,268,272,275],"span",{"class":259,"line":260},"line",1,[257,262,264],{"class":263},"sWwjJ","%",[257,266,141],{"class":267},"sgQzM",[257,269,271],{"class":270},"swSHS",":",[257,273,274],{"class":263}," %",[257,276,278],{"class":277},"swaF1",".bsv\n",[257,280,282],{"class":259,"line":281},2,[257,283,284],{"class":277},"    bsc -sim -u $*.bsv\n",[257,286,288],{"class":259,"line":287},3,[257,289,291],{"emptyLinePlaceholder":290},true,"\n",[257,293,295,297,299,302],{"class":259,"line":294},4,[257,296,189],{"class":267},[257,298,271],{"class":270},[257,300,301],{"class":277}," TestShifter.bo ",[257,303,305],{"class":304},"sJGvw","# replace with the current testing file\n",[257,307,309],{"class":259,"line":308},5,[257,310,291],{"emptyLinePlaceholder":290},[257,312,314,317,319],{"class":259,"line":313},6,[257,315,316],{"class":267},"test",[257,318,271],{"class":270},[257,320,321],{"class":277}," mkTests.ba\n",[257,323,325],{"class":259,"line":324},7,[257,326,327],{"class":277},"bsc -sim -e mkTests\n",[257,329,331],{"class":259,"line":330},8,[257,332,333],{"class":277},".\u002Fa.out\n",[16,335,336,337,340],{},"这样就可以一个 ",[61,338,339],{},"make test"," 走天下了（笑）",[50,342,344],{"id":343},"%E5%90%8E%E8%AE%B0","后记",[16,346,347],{},"本文作者也只是刚开始使用 Bluespec，所以文章内容可能会有疏漏。后续实验如果涉及到了更新的功能，我会在本文中更新。对文章内容有任何疑问或者补充都可以邮件联系。",[16,349,350,351,355],{},"用 VSCode 的同学可以在插件市场里找到 ",[25,352,354],{"href":353},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=mshr-h.VerilogHDL","Bluespec 的支持插件","。",[357,358,359],"style",{},"html pre.shiki code .sWwjJ, html code.shiki .sWwjJ{--shiki-default:#1976D2;--shiki-light:#1976D2;--shiki-dark:#F8F8F8}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .swSHS, html code.shiki .swSHS{--shiki-default:#D32F2F;--shiki-light:#D32F2F;--shiki-dark:#F97583}html pre.shiki code .swaF1, html code.shiki .swaF1{--shiki-default:#24292EFF;--shiki-light:#24292EFF;--shiki-dark:#B392F0}html pre.shiki code .sJGvw, html code.shiki .sJGvw{--shiki-default:#C2C3C5;--shiki-light:#C2C3C5;--shiki-dark:#6B737C}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":245,"searchDepth":281,"depth":281,"links":361},[],"2022-05-14 02:33:02","给在 RHEL、Git 1.8 和 X11 转发中挣扎的 6 系学子们",false,"md",{},"\u002Fposts\u002Flegacy\u002Fhigh-arch-bluespec-toolchain",{"title":5,"description":363},"posts\u002Flegacy\u002Fhigh-arch-bluespec-toolchain",{"category":371,"tags":373},[372],"legacy",[372],"t5YgYJWbnJsSx4IR6Gmp-KU9ibCMsRFNNde6ZEP66DY",1786371125293]