Commit 730eba18 authored by Wu Yuzhang's avatar Wu Yuzhang
Browse files

Update README.md, References/RISCV指令集总览表格.pdf,...

Update README.md, References/RISCV指令集总览表格.pdf, References/riscv-privileged.pdf, References/The_RISC-V_Instruction_Set_Manual_Volume_I_User-Level_ISA-V2.2.pdf, References/The_RISC-V_Instruction_Set_Manual_Volume_II_Privileged_Architecture_V1.9.1.pdf, References/RISC-V_指令集卷2-特权级指令-中文版.pdf, References/insts.md, References/RISC-V_指令集卷1-用户级指令-中文版.pdf, Design_Figure/Design_Figure.pdf, lab1/lab1.md files
parents
## Computer Architecture 2021Lab
**此仓库用于发布USTC体系结构课程2021年秋季学期的实验代码和要求,同时可用于学生的意见反馈。**
实验成绩占课程成绩的40%,实验验收方式主要为课堂当面验收和实验报告的提交。
本学期计划实验时长为10周
* Lab1(第4-5周) 【15%】: 熟悉RISC-V指令集,完成RV32I指令集流水线CPU的设计报告;
* Lab2(第6-8周) 【40%】: 完成RV32I流水线CPU的Verilog代码;利用RISCV-test测试文件进行仿真和CPU功能验证
* Lab3(第9-11周) 【20%】: cache设计和实现
* Lab4(第12-13周)【15%】: 分支预测设计与实现
* Lab5(第14-15周) 【10%】: 学习使用提供的Tomasulo软件模拟器和多Cache一致性软件模拟器,并完成实验报告
签到与补交
## 签到与补交
* 学生总数155人左右,每周日下午和晚上开两次实验课,内容完全一样,可选择参加
* 验收和报告补交在一周内扣除20%成绩,介于一周两周之内补交扣除40%成绩,超过两周不予验收。
* 为了照顾对流水线不熟悉的学生和鼓励实验课出勤,每堂课设置签到。(每次实验课开始15分钟后停止签到,实验课结束半小时前可以签离,每周两个实验时间段任选其一参加,有签到和签离就算当周满勤)。
* 上周和本周连续两次满勤可以申请本周实验晚交一周不做扣分处理。(比如Lab2阶段一验收是第6周,如果到了第6周实验课结束了实验还没做完,如果你第5周和第6周都满勤,可以在第6周签离时向助教申请晚交一周同时不扣分。)希望对流水线和verilog不熟悉的同学可以积极参与实验课,届时有问题多问问助教,助教可以一对一讲解或者统一指导。
* 签到记录不以其他方式影响成绩
## 助教统一讲解
* 每周实验课的开始时间,**助教准点(14:30或18:30)**开始**本周实验指导****下周实验内容简单介绍**
* 大家可以参考提供的实验文档,如果有疑惑,可以在课程QQ群,或者仓库提Issue询问助教。
## 实验资源
* 实验教学中心提供了一个基于互联网的远程进行硬件、系统和软件 7x24 教学实验的平台,可校外登录使用,支持 SSH、浏览器和 VNC 远程桌面的方式来使用(方便 Windows 用户使用 Linux)。这个平台可以通过虚拟机的方式来进行软件和系统方面的实验(基于 Linux 容器的方式使得线上体验和线下机房一致),还能够远程操作已部署好的 FPGA 集群进行硬件实验。
平台集群基于 Linux 容器搭建,计算与存储分离,提供给学生 7x24 小时使用。架构方面和 Linux 容器部署使用方面的稳定性已经经过多年验证。系统架构方面的瓶颈仅受限于网络带宽。
这套系统基于 Linux 容器来支持各类系统和软件的虚拟化及远程使用。现有容量支持 300 名以上的轻度使用用户同时在线使用,支持 150 名左右的中度使用用户同时在线,支持 90 名左右的重度使用用户(计算密集型)同时在线。
使用说明:[https://vlab.ustc.edu.cn/docs/vm/](https://vlab.ustc.edu.cn/docs/vm/),平台地址:[https://vlab.ustc.edu.cn/](https://vlab.ustc.edu.cn/)。欢迎大家试用
* 课程实验用到的语言是system verilog(sv, verilog的超集),所以理论上支持sv并且能仿真的IDE都可以用来做实验,但推荐使用vivado工具(ise 也可),这里给出vivado的下载链接。链接:[https://vlab.ustc.edu.cn/docs/downloads/](https://vlab.ustc.edu.cn/docs/downloads/)
## 实验发布、验收和报告
* **2021.3.31 Release Lab1**
请提交CPU设计报告 截止日期:2021.4.16
提交至BB平台
提交格式:要求包括一份**pdf格式**实验报告(如果无法打开会影响最终成绩)
# 指令的control信号
## 一:运算指令
### SLLI、SRLI、SRAI
- 偏移立即数指令,三条指令分别为逻辑左移、逻辑右移、算数右移
- **opcode**为0010011,**SLLI****SRLI****SRAI****func3**字段分别为001、101、101
- 指令具体格式如下,按inst[31:0]的顺序(**src****dest**各占5位,**opcode**占7位,**fun3**占3位)
- *0000000 位移次数[4:0] src SLLI dest opcode*
- *0000000 位移次数[4:0] src SRLI dest opcode*
- *0100000 位移次数[4:0] src SRAI dest opcode*
### ADD、SUB、SLL、SRL、SRA、SLT、SLTU、XOR、OR、AND
- 加法、减法、逻辑左移、逻辑右移、算数右移、符号数比较(*rs1 < rs2 **?** rd = 1 **:** rd = 0*)、无符号数比较(*rs1 < rs2 **?** rd = 1 **:** rd = 0*)、亦或、或、与
- **opcode**为0110011,不同指令的**func3**字段分别为:**ADD**/**SUB**(000)、**SLL**(001)、**SLT**(010)、**SLTU**(011)、**XOR**(100)、**SRL** /**SRA**(101)、**OR**(110)、**AND**(111)
- 指令具体格式如下,按inst[31:0]的顺序(**src****dest**各占5位,**opcode**占7位,**fun3**占3位)
- *0000000 src2 src1 ADD/SLT/SLTU dest opcode*
- *0000000 src2 src1 XOR/OR/AND dest opcode*
- *0000000 src2 src1 SLL/SRL dest opcode*
- *0100000 src2 src1 SUB/SRA dest opcode*
### ADDI、SLTI、SLTIU、XORI、ORI、ANDI
- 加法、有符号数比较(*rs1 < imm **?** rd = 1 **:** rd = 0*)、无符号数比较(*rs1 < imm **?** rd = 1 **:** rd = 0*)、亦或、或、与
- **opcode**为0010011,不同指令的**func3**字段分别为:**ADDI**(000)、**SLTI**(010)、**SLTIU**(011)、**XORI**(100)、**ORI**(110)、**ANDI**(111)
- 指令具体格式如下,按inst[31:0]的顺序(**src****dest**各占5位,**opcode**占7位,**fun3**占3位)
- *I立即数[11:0] src ADDI/SLTI/SLTIU dest opcode*
- *I立即数[11:0] src ANDI/ORI/XORI dest opcode*
### LUI、AUIPC
- 立即数加载指令(将20位的U立即数放到目标寄存器rd的31-12位,rd的低12位填0,32位结果将符号拓展到64位)、PC相对地址计算指令(将20位的U立即数低位添加12个0,符号位扩展成64位,将其加到PC上,结果写入rd)
- **LUI****opcode**为0110111,**AUIPC****opcode**为0010111
- 指令具体格式如下,按inst[31:0]的顺序(**rd**占5位,**opcode**占7位)
- imm[31:12] rd opcode
---
---
## 二:装载指令、跳转分支指令
### JALR
- 间接跳转指令(将12位有符号I类立即数加上**rs1**,将结果的最低位设置位0,作为目标地址,原始的**pc+4**保存到寄存器**rd**中)
- **JALR****opcode**为1100111
- 指令具体格式如下,按inst[31:0]的顺序(**rd****rs1**占5位,**opcode**占7位)
- *imm[11:0] rs1 000 rd opcode*
### JAL
- 跳转并连接指令(将J立即数编码的2的倍数的有符号偏移量符号扩展,加到PC上,形成目标跳转地址,原始的**PC+4**保存到寄存器rd中)
- **JAL****opcode**为1101111
- 指令具体格式如下,按inst[31:0]的顺序(**rd**占5位,**opcode**占7位)
- *imm[20] imm[10:1] imm[11] imm[19:12] rd opcode*
### BEQ、BNE、BLT、BGE、BLTU、BGEU
- 分支指令,**BEQ****rs1 == rs2** 则跳转;**BNE****rs1 != rs2 **则跳转;**BLT****rs1 < rs2 **则跳转;**BGE****rs1 >= rs2 **则跳转;**BLTU****BGEU**分别是**BLT****BGE**的无符号数版本。所有分支指令采用SB类指令格式,12位B立即数编码了以2字节倍数的有符号偏移量,并被加到当前**PC**上,生成目标地址
- **opcode**为1100011,不同指令的**func3**字段分别为:**BEQ**(000)、**BNE**(001)、**BLT**(100)、**BGE**(101)、**BLTU**(110)、**BGEU**(111)
- 指令具体格式如下,按inst[31:0]的顺序(**rs1****rs2**占5位,**func3**占5位,**opcode**占7位)
- *imm[12, 10:5] rs2 rs1 func3 imm[4:1, 11] opcode*
### LB、LH、LW、LBU、LHU
- **load**指令,将寄存器**rs1**与符号扩展的12位偏移量下相加得到有效地址,将存储器的一个值复制到寄存器**rd**中。这些**load**指令的区别在于,加载的数值位数不同。**LW**指令读取一个32位数值;**LH**指令读取一个16位数值后,符号扩展到32位;**LHU**指令读取一个16位无符号数值,零扩展到32位;**LB**指令读取一个8位数值,符号扩展到32位;**LBU**指令读取一个8位无符号数值,零扩展到32位
- **opcode**为0000011,不同指令的**func3**字段分别为:**LB**(000)、**LH**(001)、**LW**(010)、**LBU**(100)、**LHU**(101)
- 指令具体格式如下,按inst[31:0]的顺序(**rs1****rd**占5位,**func3**占5位,**opcode**占7位)
- *imm[11:0] rs1 func3 rd opcode*
### SB、SH、SW
- **store**指令,将寄存器**rs1**与符号扩展的12位偏移量下相加得到有效地址,将寄存器**rs2**的值复制到存储器中。这些**store**指令的区别在于,存储的数值位数不同。**SW**指令存储一个32位数值;**SH**指令存储寄存器**rs2**中的低16位数值;**SB**指令存储寄存器**rs2**中的低8位数值
- **opcode**为0100011,不同指令的**func3**字段分别为:**SB**(000)、**SH**(001)、**SW**(010)
- 指令具体格式如下,按inst[31:0]的顺序(**rs1****rs2**占5位,**func3**占5位,**opcode**占7位)
- *imm[11:5] rs2 rs1 func3 imm[4:0] opcode*
# Lab1 实验文档
## 实验说明
本次实验是 RV32I Core 设计的铺垫。我们提供了一个样例 RV32I Core 的设计图,参考设计图,理解每条指令需要的数据通路,以及相应的控制信号,并回答相应问题。
## 主要内容
提交一个**设计报告**。参考 Design_Figure 文件夹中提供的 RV32I Core 设计图,思考每条指令的数据通路,如何用 verilog 简洁高效的表达这些逻辑电路。
Lab2 会给出 RV32I Core 的 Verilog 代码框架,大家只需要完成部分模块的代码即可。
## 待实现指令
RISC-V 32bit 整型指令集(除去FENCE,FENCE.I,CSR,ECALL 和 EBREAK 指令)
* 可参考官方提供的 RISCV 用户指令集手册(中文版或者英文版)
* Reference 文件夹下的 [inst.md](https://git.ustc.edu.cn/Ithaqua/ustc_ca2021_lab/-/blob/master/References/insts.md) 文档提供了指令描述(存在的问题欢迎大家指正)
## 设计原则
* 你可以完全按照我们提供的设计图,补全模块内部逻辑完成 CPU 设计;
* 也可以根据你的个人理解对设计模块图做出相应修改,并在报告中提出你自己的改进方 案并给出修改原因(报告内容的问题基于你修改后的设计图进行回答)。
## 报告内容
请在报告中回答下述问题:
1. 描述执行一条 XOR 指令的过程(数据通路、控制信号等)。
2. 描述执行一条 BEQ 指令的过程·(数据通路、控制信号等)。
3. 描述执行一条 LHU 指令的过程(数据通路、控制信号等)。
4. 如果要实现 CSR 指令(csrrw,csrrs,csrrc,csrrwi,csrrsi,csrrci),设计图中还需要增 加什么部件和数据通路?给出详细说明。
5. Verilog 如何实现立即数的扩展?
6. 如何实现 Data Cache 的非字对齐的 Load 和 Store?
7. ALU 模块中,默认 wire 变量是有符号数还是无符号数?
8. 简述BranchE信号的作用。
9. NPC Generator 中对于不同跳转 target 的选择有没有优先级?
10. Harzard 模块中,有哪几类冲突需要插入气泡,分别使流水线停顿几个周期?
11. Harzard 模块中采用静态分支预测器,即默认不跳转,遇到 branch 指令时,如何控制 flush 和 stall 信 号?
12. 0 号寄存器值始终为 0,是否会对 forward 的处理产生影响?
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment