CS152 · Lab 1
把第 1-3 课学到的 ISA/微架构分离、单总线微编码数据通路,第一次变成能在真实 RISC-V 核上跑起来的实验:用 Chipyard 里的 Sodor 教学核家族,跑通指令级追踪、CPI 分析,并动手修改一个真实的微编码核心。
mcycle、minstret)验证第 4 课 Iron Law 中"CPI ≈ 1"的说法本实验基于 Chipyard RISC-V SoC 生成框架,具体使用其中的 5 个 "Sodor" 教育用核心(位于 generators/riscv-sodor):1 级(单周期)、2 级、3 级、5 级流水线,以及一个微编码核心。
实测记录:在真实的 cs152 教学主机上构建并运行 1 级核心的命令是:
make CONFIG=Sodor1StageConfig run-binary-fast BINARY=path/to/test.riscv
注意大小写:类名是 Sodor1StageConfig("Stage" 中 S 大写),不是 Sodor1stageConfig;"Sodor" 得名于《托马斯小火车》里的 Sodor 岛,不要误拼成 "Sodar"。构建成功后的一次基线运行给出了 mcycle = 6166,minstret = 6172——即 CPI ≈ 6166/6172 ≈ 0.999,与第 4 课"单周期不流水机器 CPI = 1"的理论预测几乎完全吻合(个别周期差异来自复位/收尾开销)。
指导性部分要求每位同学独立完成并提交个人报告,围绕四个具体问题:
tracer.py 工具,对 dhrystone、median、multiply、qsort、rsort、towers、vvadd 等基准程序做指令类型统计consts.scala 里切换 USE_FULL_BYPASSING 参数,实测第 4 课"旁路 vs. 互锁"这对权衡在真实 CPI 数字上的差异tracer.py 以检测非零偏移量的 load/store 指令开放性部分类似"一天的迷你项目",可以独立完成,也可以 2-3 人组队(但组队报告须单独提交),从以下选项中任选其一:
与第 2、3 课的直接呼应:选项 3(在微编码核心里加一条自定义指令)正是第 2、3 课"微编码如何免费实现复杂指令"这一论点的亲手验证——按照第 3 课"内存-内存加法"例子的思路,新增指令通常不需要改动数据通路,只需要在微码 ROM 里多写几行控制程序。这也是验证第 2 课中被标记为"教学草图、需要对照真实源码"的 JAL/Branch 微码细节的最佳机会:直接去读 Sodor 微编码核心的 microcode.scala 源文件,确认 PC 相对寻址的精确寄存器传输顺序。
Sodor1StageConfig 中 "Stage" 的 S 必须大写,写成 Sodor1stageConfig 会直接触发 ClassNotFoundException。问题 1:Lab 1 中,对 Sodor 单周期核心的一次实测运行给出 mcycle=6166、minstret=6172,这验证了第 4 课的什么结论?
问题 2:开放性部分的选项 3(在微编码核心中实现自定义指令)主要呼应了第 2、3 课的哪个论点?
generators/riscv-sodor