6.175

课程讲义和实验都在此: http://csg.csail.mit.edu/6.175/

Lab0:搭建环境

可以参照 https://github.com/WangXuan95/BSV_Tutorial_cn 搭建BSV编译环境

Lab1:多路选择器和加法器

学习BSV基础语法,实现组合逻辑/善用for loop
学习数电基础
掌握基于function的描述方式,包括门级和行为级,实现代码复用
基于随机数的testbench编写方式,尽可能保证测试覆盖率
了解BSV的多态特性,valueOf(n)

Lab2:FIFO、流水线FFT、弹性

基于Reg实现的时序逻辑
Maybe数据类型,及其涉及的隐式条件(非常重要)
interface接口的概念,用接口简化模块连接时的代码量
接口中的 基于method实现,动作值等语法

给好了FFT的基本框架,类似搭积木一样,根据示意图插入寄存器实现不同结构的寄存器

基于Rule的描述风格

弹性流水线与非弹性流水线的差别(有了valid bit后没区别?)

Lab3:乘法器

巩固tb和多态实现,模块参数化
电路使用寄存器实现折叠
booth乘法的实现原理,推导

用BSV实现算法的样例(FFT太超前了,仅能供架构层面理解,乘法器更具体一点)

Lab4:FIFO进阶

通过FIFO的各种实现理解 BSV中冲突的概念
引入EHR寄存器

EHR寄存器的特点

标号大的端口 优先级大于 标号小的端口

读前者时,如果后者同时在写入,则直接bypass新数据;否则就直接读寄存器内容,在pipelineFIFO和bypassFIFO中用到
写前者时,永远能够覆盖后者的写,即优先级高

基于此,就能根据各个操作的优先级,对FIFO中不同操作使用不同的EHR寄存器标号
BYPASS/PIPELINE/CF

Lab5:RISCV多周期处理器/两级流水线处理器

理解本Lab的运行框架,如何输入指令,如何测试

或者层级更高一点,需要了解处理器设计的内容

了解指令集,包括整个Lab使用的RISCV指令集
另外,还可以了解RISCV编译的工具链(gcc),如何编译和配置
处理器的运行架构,数据通路(取值\译码\执行\访存\写回)

多周期处理器相当于一件事情一件事情逐步在每个周期完成,看起来减少了关键路径,但IPC并没有提升

流水线处理器,流水线的概念容易理解,每周期都做这件事情,然后逐级往下传递

但只要引入流水线,就会出现竞争冒险hazard

设计流水线处理器的过程就是不断处理竞争冒险

学习如何调试处理器?软件程序层面还是硬件层面?

如何逐步提升IPC(应该能算出来理论值,然后实践逼近)

Lab6:RISCV六级流水线处理器

六级流水线看起来就是将操作分为六个阶段,但会引入问题

如指令预测错误,需要flush(BTB),分支方向预测BHT,JALR寄存器跳转
指令预测/分支预测
有一个没做出来的是寄存器前递,这样就不需要scoreboard,也不需要stall太多周期,等待寄存器写完

每级之间如何/传递那些数据,如何实现flush和stall

流水线各级之间通过FIFO传递数据
flush:这级的数据丢掉,不enq到下一级,需要Epoch机制配合.只有Epoch一直保持不变,这条指令才能完整执行
stall:不deq上一级送来的数据

Lab7:RISCV六级流水线处理器/DRAM和Cache

考虑真实的存储场景,读取DDR需要非常多个周期,不可能每条指令,每次访存都读DDR
理解Cache的原理,为什么能有用

理解新的测试框架,接口GetPut

Lab8:RISCV六级流水线处理器exception

支持exception,CSR寄存器的概念

Project

多核处理器的概念,和单核处理器的区别
处理器之间的通信
Cache一致性问题(顺序一致性?)
原子指令

6.375 Lab的基本思路是完成一个lab后,基于这个lab实现下一个lab,是连续的