-
该CPU现在可以执行
ori lui addiu beq
这四种指令,但并没有完成数据相关,请自行添加相关数据通路。 -
之后出现的问题可直接在群里提问,然后会被记录在这里形成Q&A。
-
请使用
Github
进行版本管理,便于验收时检查。如果因为误操作导致一些记录被抹掉或者需要更换仓库请及时通知助教。
- 在服务器上准备好文件夹,导入
SampleCPU
内的所有.v .vh
文件 - 启动路径
nscscc2021_group_v0.01/func_test_v0.01/soc_sram_func/run_vivado/mycpu_prj1
下的mycpu.xpr
项目 - 在
Vivado
中添加源文件,把SampleCPU
内的所有.v .vh
文件都导入(包括lib文件夹下) - 点击
Simulation
进行仿真,第一次仿真时会对项目使用的ip
核进行综合,可能需要等待10分钟左右 - 点击▶进行仿真,如果波形图卡住可在下方的控制台看到提示信息,这是龙芯实验平台提供的比对,会告诉你当前在哪条指令出现错误,根据汇编指令和你学的流水线知识进行debug
- 运行的汇编指令可在
nscscc2020_group_v0.01/func_test_v0.01/soft/func/obj/test.s
该文件中查找。VSCode
打开搜索pc值即可,9fc
开头的pc值在汇编文件中就是bfc
。 - 指令集文件可在
doc
文件夹的A03
中查看。 - 其他相关问题基本都可在
doc
文件夹或参考书籍中找到答案。 - 欢迎留言,看到会回复,另外请注意Q&A的更新。
- 阅读指令集文件,查看该指令会进行哪些操作
- 对于IF段,新指令一般对其没有影响(除了在添加异常的时候,需要检查指令地址是否出错)
- 对于ID段
- 需要在该级进行指令译码
- 从寄存器中读取需要的数据
- 完成数据相关处理
- 生成发给EX段的控制信号
- 对于EX段
alu
模块已经提供,基本通过给alu
提供控制信号就可以完成逻辑和算术运算
- 对于MEM段
- 接收并处理访存的结果,并选择写回结果
- 对于WB段
- 和IF段类似,暂时没有需要改动的东西
- 查看console(控制台)中的trace比对机制的提示,记下提示的PC值,并猜测可能发生的错误
- 打开
test.s
文件,使用提示的PC值进行查找,查看该PC值对应的指令是什么,判断是否添加该指令 - 如果没添加指令,则前往
A03
文件阅读指令集,学习对应指令如何添加 - 如果指令已经被添加,则到波形图中去检查运算结果错误原因
- 当找到错误波形图时,请逐步添加其源头信号,直至发现引入错误的源信号,并改正
- 修改后可能会出现新的错误,此时请重复步骤5
- 可能会遇到波形图并未自动停止的情况,已知有两种情况:测试程序因为错误执行陷入死循环,写回级的输出出现错误一般是
全X或0
导致比对机制失效 - 如果添加新的指令需要改动流水线结构可以参考《自己动手做CPU》或者问助教。PS:这本书原理说的还算明白,代码真别抄了,
always
写出来的组合逻辑你们把握不住 - 如果助教也不知道你们错在哪了,请陪他一块反思
- 正文小四号字体
- 1.25倍行距
- 10页左右
- 封面(1页)目录(1页)PS:封面在doc文件夹里,自行取用
- 每个人的工作量,总体设计,不同流水段之间的连线图,完成了多少条指令,程序运行环境及使用工具。(1-2页)
- 单个流水段说明: 该流水段的整体功能说明,端口介绍,信号介绍,包含的功能模块说明,大致的结构示意图。(不要贴大段源码,可以选择一小部分,并对其进行解释。比如说贴一个选择器,介绍一下是怎么控制优先级,又或者这个选择器没有优先级,是并行选择器)(5页-8页)
- 组员的实验感受,改进意见(这部分三人加起来不要超过1页)
- 参考资料(1页)
- 纸质版1份:于最后一次实验课时上交
- 电子版:使用pdf格式,添加到小组的仓库
-
Q: 关于如何检查工作量?
A: 建议各位同学每天写完代码都push到github上,到最后代码量一目了然,工作进度也很清楚。
(如果一定要最后几天扎堆提交,我也愿意听你解释,当然分数好不好看就不知道了) -
Q: 拿到这个模板我应该如何入手?
A: 群里有《自己动手写CPU》这本书的PDF,如果对流水线、旁路、数据相关之类的内容还没有概念,可以先看看这本书。在掌握每章的内容后把该章节的内容写到自己的CPU里去。(请不要妄图直接使用这本书里的源码,最后验收的时候会检查代码,代码长什么样我还是一清二楚的。对于别的学校的代码,如果你去观摩学习,然后把里面的好东西拿来用,那我非常支持。如果你直接把别人的代码copy过来用,那看一下代码风格,问几个问题基本就露馅了,没意思的。所以有问题就快问,别一直拖着)