首页 > 其他分享 >Bluespec SystemVerilog(BSV) 及 MIT 体系结构公开课 笔记

Bluespec SystemVerilog(BSV) 及 MIT 体系结构公开课 笔记

时间:2024-10-10 12:12:24浏览次数:10  
标签:connectal 编译 elf2hex BSV Bluespec 公开课 报错 make bsc

前言

早年 MIT 有三门用 bsv 作为硬件描述语言的体系结构课程,代号分别为 6.004,6.175 和 6.375. 根据 MIT CS course list,现在这三门课分别改名为了 6.1910、6.1920 和 6.5900. 本文是自学这三门课所需的 bsv 时记录的笔记,内容主要来源于这三门课目前公开的资料(6.175 16fall, 6.375 19fall)。

环境配置

在 windows11 wsl2-ubuntu22.04 和 ArchLinux 上均搭建了实验环境,通过 Git 进行多端开发。

ArchLinux 上通过 yay -S bluespec-git 构建 bsc 时 GHC 会报错,考虑到后续需要使用 Connectal,ArchLinux 对 Connectal 的支持不完善,此处采用 kazutoiris 的 docker 镜像 进行实验。

在用 docker 做 6.375lab3 的 p2 时,会报错缺少 fft3w,暂时先不用 docker 做,做完以后再用 docker

6.175

lab5

和 ysyx 差不多,从单周期开始,写到多周期,再到两级流水,再到两级 BTB.

2016 版的 lab5 用 Scemi 仿真,2017 版用 connectal。这里我们做 2017 版的 lab5。

执行 bash init.sh 时可能会报错 “RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CANCEL (err 8)”,开全局代理 + 执行下述命令后暂时解决:git config --global http.postBuffer 524288000

随后脚本会使用 curl 下载 ply-3.9.tar.gz,但脚本中的链接已经失效,我们可以手动从 https://github.com/dabeaz/archive/blob/main/ply/ply-3.9.tar.gz 下载。此外,脚本会将 connectal 中的 python script 全部替换为 python2.7 script,但最新拉下来的 connectal 文件夹里的 Makefile 用得其实是 python3 script。这里要么把 ply 和 py 都改用最新版(没试过),要么全部对齐到实验当年的版本。我的选择是把 python3 改回 python2.7

由于 bsc 版本问题,实验代码的一些部分需要修改以后才能跑通,例如 tagged Valid 要改为 tagged Valid False,并修改相应寄存器的类型从 Maybe#(void) 改为 Maybe#(Bool)。

lab5 初始代码缺少 simple.S,并且 Makefile 中的工具链路径需要手动修改一下。此处通过 apt 安装交叉编译工具链,并把 Makefile 中的路径改成 /usr/bin/ 下的路径,上网扒了个 Simple.S 过来。

实验自带的 Makefile 中传递了 -m32 参数给交叉编译工具链,但现在 GCC 和 RISC-V Spec 的版本均已更新,I 扩展中也不再包含 Zicsr 指令,需要写 -march=rv32i_zicsr 代替,并去掉 -m32,此外若编译工具链时使用的 abi 不是 ilp32, 则需要加上 -mabi=ilp32 选项。

配置好交叉编译工具链后,make 会报错缺少 mtohost 这个 CSR,mtohost 并不属于 RISC-V 标准(曾经是非标准 HTIF 的一部分,现在已经被移除了),主要是用于测试。我们需要把 mtohost 换成别的 CSR。后续要读出时,也要把 mfromhost 换成对应的 CSR。

自行编译的工具链不带有 elf2hex 工具,可以 git clone git://github.com/sifive/elf2hex.git 下载。编译之后创建一个软链接到 /opt/riscv/bin/ 下并命名为 elf2hex 即可。需要注意的是要改一下 Makefile 中 elf2hex 的参数的格式。

elf2hex 报错:elf2hex: could not find objcopy。可以直接用 vim 修改 elf2hex 脚本,把里面的 objcopy 路径改了。
此外 make 的执行还需要安装 python. docker 里已经有 python3 了,可以装个 python2 来跑 make。直接用 python-is-python3 的话可能还得修改 python 脚本里的部分语法。

编译 benchmark 时也需要进行上述修改,此外 crt.S 中会用到 eret 这个指令,其对应的具体指令与当前特权级有关。

编译项目时会报错 ply.lex 找不到,经检查发现是 ln -s 无法有效创建指向 ply 文件夹的软链接,直接把 ply 文件夹里的文件复制过来也可以。

编译 benchmark 时会报错 median.riscv: no such file. 这是因为传给 elf2hex 的路径不对。

修复之后 make 会报错 bk_init 函数参数只有两个,但是用的时候传了三个参数。connectal 的源码 connectal/scripts /Makefile.connectal.build 中对 bsc 的版本进行了判断,在 bsc major 小于等于 2019 时会使用三个参数,否则使用两个参数。看上去这个判断没有正确执行,导致了出错。我们可以手动调整相应位置的代码。

修复之后 make 执行仿真会报错缺了两个库:

/usr/bin/ld: cannot find -lbskernel: No such file or directory
/usr/bin/ld: cannot find -lbsprim: No such file or directory

这同样是 connectal 对 bsc 的版本判断未生效导致的。我们可以手动修改 Makefile.connectal.build 中的内容,去掉对老旧版本 bsc 的判断。

跑 run_asm.sh 仿真时会报错 ERROR: ld.so: object 'libSegFault.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored./bin/sh: 1: cannot open /home/ubuntu/MIT_BSV/6.175lab5/connectal/boardinfo/.json: No such file. https://lemire.me/blog/2023/05/01/under-linux-libsegfault-and-addr2line-are-underrated/ 中提到现在版本 工具链似乎移除了 libsegfault,自从 ubuntu22.04 开始,需要安装 glibc-tools 才能获得这个库。通过 apt 在 docker 中安装后不再报错。

此外注意到会报 ERROR: Executing unsupported instruction at pc: 00000200. Exiting,怀疑是生成的 vmh 有问题,查看 vmh 转换脚本,发现每行读八个字符,但是 vmh 文件每行只有两个字符。注意:这个 bug 修复之前运行 run_asm.sh 可能会导致 bne 测例死循环,生成巨大的 log。

重读了一遍 https://mp.weixin.qq.com/s?__biz=MzkwNTMzOTE2MA==&mid=2247485751&idx=3&sn=36a5323b3c32984bb94c97b313aa0c23&chksm=c0f80140f78f8856abd37f667cbd06a3267eed4ed34c1d36f16f527d8613ea14d1dbdcad0b8f&scene=21#wechat_redirect,发现 6.175 的 lab5 要改的地方还蛮多的,run_asm.sh 和 run_bmarks.sh 都要改。

6.375

lab2

dlopen 报错

做 6.375 的 lab2 时,按照讲义 make simulation 随后 ./out 报了如下错误:

Error: dlopen: ./out.so: undefined symbol: _Z12dollar_fopenPKcPKSsS2_
    invoked from within
"sim load $model_name $top_module"
    (file "/opt/tools/bsc/lib/tcllib/bluespec/bluesim.tcl" line 188)

上网搜到如下帖子后按照帖子里的方法添加 -ffat-lto-objects 参数重新编译 bsc,还是会报这个错误。

解决方法:在 BluespecSV-CN 交流群里问群友得知,可以将 bscflags 的 -Xc++ -D_GLIBCXX_USE_CXX11_ABI=0 删掉,或者将 0 改为 1 即可。

lab3

p2 ref.c

没看懂 p2 要干嘛,意思是要根据 ref.c 造一组新测例喂给 bsv?暂时跳过

ToMP & FromMP

实现流水线中的 ToMP 和 FromMP 模块,用 Cordic 算法转换直角坐标和极坐标。Cordic 的代码已经给我们了,直接调用就行。

写完以后往流水线里加三个模块。

最终结果和期望结果在 char 15 line 1 不同。上 Github 扒了个其他人写好的代码跑了一下,也是这样。暂时认为实现是正确的。

lab4

connectal

用 Docker 做。如果直接用非 root 账户 make simulation,可能会遇到权限不足的问题。这种情况下可以在启动容器时指定 -root 选项切换到 root 账户做。

p1 make simulation 的结果和期望结果在 char 15 line 1 不同,和 lab3 的结果在 char 787 line 1 处不同。

用到 FPGA 的实验部分暂时跳过,但还是扫一眼讲义中的内容。(* synthesize*) 可以让编译器不内联某个模块,而是为该模块生成单独的文件和模块。

多态模块前面不能直接加 (* synthesize *),这是由于 Verilog 不支持多态。因此我们需要在多态模块所使用到的各个非多态模块前面加 (* synthesize *)。需要注意的是,如果一个模块加了 provisos 就不能 synthesize 了。

connectal 仅支持 Bit#(n) 类型的信号,因此需要把 FixedPoint#(16, 16) 转换成 Bit#(32) 才能在 connectal 中使用。调用硬件中的方法时可以把 Bit#(32) 通过 unpack 转换为 FixedPoint#(16, 16),硬件返回的 FixedPoint#(16, 16) 结果可以通过 pack 转换为 Bit#(32)。

unpack 的作用是将 Bit 表示转换为其它 Bluespec 中的类型。

做完 p7 跑 make run_simulation 会报错,改用直接执行 ubuntu.exe 的方式可以运行并跑出 out.pcm,但仿真结束时会出现 [sock_fd_write:184] error in sendmsg -1 104 xsim_disconnect:75 pint=0x7761f8001000 calling $finish Aborted (core dumped)

标签:connectal,编译,elf2hex,BSV,Bluespec,公开课,报错,make,bsc
From: https://www.cnblogs.com/YjmStr/p/18456045

相关文章

  • 基于springboot+vue的微信小程序的公开课管理系统的设计与实现
    前言......
  • 基于SpringBoot + Uniapp的公开课管理小程序(角色:学生、教师、管理员)
    文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例八、一站式毕设支持服务结语......
  • 公开课 | 测试工程师的质量体系构建指南
    掌握质量体系的知识与技能,对于个人与企业而言,均占据着举足轻重的地位。对于个体而言,深入学习质量体系不仅能够显著提升专业技能的广度与深度,还能在激烈的职场竞争中脱颖而出,更关键的是,它能在心中根植起强烈的质量意识,成为职业生涯中不可或缺的宝贵财富。而对于企业而言,构建并持续优......
  • 从零开始带你玩转 AI 变现公开课
    在这个数字化时代,AI技术正以前所未有的速度改变着我们的创作与变现方式。小红书,作为年轻人喜爱的社交电商平台,更是为创作者们提供了广阔的舞台。但如何在小红书上利用AI技术实现内容创作与收益转化的双赢?我们的公开课将为你一一揭晓答案!主课程亮点:掌握DALLE模型文生图技巧,创意......
  • 公开课 | 测试工程师如何构建质量体系
    学习质量体系对于个人和企业而言都至关重要,学习质量体系对于个人来说可以提升专业技能、增强竞争力并培养质量意识;对于企业来说则可以确保产品质量、降低成本、提高运营效率、增强顾客满意度、适应市场需求并提高组织声誉和竞争优势。因此,无论是个人还是企业都应该重视质量体系的......
  • 大咖公开课 | 大模型场景讲解以及测试方法
    在这个日新月异的科技时代,人工智能(AI)正以惊人的速度改变着我们的生活与工作方式。为了帮助大家系统地掌握人工智能的场景及测试方法,我们特别推出了大模型与人工智能平台测试公开课,带领大家从大模型场景、RAG及人工智能平台的测试开始,深入探索人工智能技术的场景及测试方法。本......
  • 腾讯云加速企业和个人开发创新公开课直播预告
    直播预告:07/18(周四)15:00-16:00随着人工智能与大模型的蓬勃发展,我们正步入一个由技术驱动的创新时代。Al不仅是技术革新的先锋,更是每位程序员不可或缺的“搭子”,掌握AI工具的创造、加工与使用技巧,成为广大从业者当下的挑战之一。腾讯云高性能应用服务HAl,打造一系列热门框架模......
  • 利用AI智能体实现自动化公开课
    在这个信息爆炸的时代,AI技术逐渐渗透到各行各业,为我们的工作提供了更多可能性。在即将开始的公开课中,我们将探讨如何利用AI智能体实现自动化,从而打造专属AI助理,提升工作效率。主要内容课程的主要内容涵盖AIAgent介绍与开发框架,ReAct自动推理模式与AutoGPT产品,手工用例直接转自......
  • 测试用例设计方法公开课来啦!
    测试用例编写是软件测试过程中的重要一环,但也常常面临一些痛点和挑战。你是不是遇到过以下问题:软件系统过于复杂,导致无法编写全面且有效的测试用例。需求文档不完整、模糊,编写的测试用例遗漏关键场景或导致测试结果不准确。对于相似的功能或场景,需要编写大量重复的测试用......
  • 【4月27日RPA公开课UiPath圆满结束】掌握验证码自动登录技巧,实现高效自动化
    在数字化时代,自动化已成为提高工作效率、降低成本的必备工具。而RPA(RoboticProcessAutomation,机器人流程自动化)技术正是其中的佼佼者。为了帮助更多学员掌握RPA技术,RPA学习天地于4月27日举办了一场别开生面的公开课,主题为“如何实现各种验证码的自动登录”。   本次公开......