docs: 完成实验9大致结构

This commit is contained in:
Liphen 2024-01-12 08:51:35 +08:00
parent 7dc4a8838a
commit ff91db660f
2 changed files with 32 additions and 16 deletions

View File

@ -29,6 +29,9 @@
#let dir_name = "这里填开发环境名称"
#let soc_freq = "100MHz"
#let inst_ram_date_wid = 32
#let paddr_wid = 32
= 实验目的
+ 掌握R型运算类指令的数据通路
+ 掌握经典单发射五级流水线的设计方法
@ -127,13 +130,13 @@ RISC-V单周期CPU设计实现简单控制器部分是纯组合逻辑电路
#fakepar
#figure(
image("../image/image-20240109155256358.png"),
caption: "取指单元"
)<取指单元>
caption: "取指单元及指令RAM"
)<取指单元及指令RAM>
#fakepar
pc的输出将送到指令SRAM中用于获取指令由于我们的指令SRAM的地址宽度只有32位因此只有pc的低32会被使用。目前来看PC的输入有两个一个是复位值0x80000000由于发送给指令SRAM的是pc_next所以pc的真正复位值其实是0x80000000-0x4一个是复位撤销之后pc_next的值。
pc的输出将送到指令SRAM中用于获取指令由于我们的指令SRAM的地址宽度只有#paddr_wid 位因此只有pc的低#paddr_wid 会被使用。目前来看PC的输入有两个一个是复位值0x80000000由于发送给指令SRAM的是pc_next所以pc的真正复位值其实是0x80000000-0x4一个是复位撤销之后pc_next的值。
因为取指单元只会对内存进行读操作因此inst_sram_en只要在reset无效时使能即可而inst_sram_wen应该恒为低电平。@取指单元 展示了取指单元的结构。
因为取指单元只会对内存进行读操作因此inst_sram_en只要在reset无效时使能即可而inst_sram_wen应该恒为低电平。@取指单元及指令RAM 展示了取指单元的结构。
#noindent #text(fill: blue)[#unitcnt_inc虚实地址转换]
@ -143,11 +146,13 @@ pc的输出将送到指令SRAM中用于获取指令由于我们的指令SRAM
得到取指所需的物理地址后接下来就要将该地址送往内存。我们采用片上的RAM作为内存并且将RAM进一步分拆为指令RAM和数据RAM两块物理上独立的RAM以简化设计。
指令RAM输出的32位数据就是指令码。本书中我们实现的CPU采用小尾端的寻址所以指令RAM输出的32位数据与指令系统规范中的定义的字节顺序是一致的不需要做任何字节序调整。
指令RAM输出的#inst_ram_date_wid 位数据就是指令码。本书中我们实现的CPU采用小尾端的寻址所以指令RAM输出的#inst_ram_date_wid 位数据与指令系统规范中的定义的字节顺序是一致的,不需要做任何字节序调整。
@取指单元及指令RAM 展示了指令RAM的结构。指令RAM保留了写接口这样的接口设计是为了和之后的AXI的设计保持一致性。
#noindent #text(fill: blue)[#unitcnt_inc指令队列]
我们将Fetch/Decode之间的流水线缓存称为指令队列。我们将指令队列之前的阶段称为前端,将指令队列之后的阶段称为后端。当取指单元一次取指的数量大于译码单元可以解码的数量时,又或是后端流水线发生暂停时,取指单元可以继续取指,多余的指令可以在指令队列中排队等待,而不用暂停取指。通过指令队列这个部件可以解耦前后端。
我们将取指单元/译码单元之间的流水线缓存称为指令队列。我们将指令队列之前的阶段称为前端,将指令队列之后的阶段称为后端。当取指单元一次取指的数量大于译码单元可以解码的数量时,又或是后端流水线发生暂停时,取指单元可以继续取指,多余的指令可以在指令队列中排队等待,而不用暂停取指。通过指令队列这个部件可以解耦前后端。
#fakepar
#figure(
@ -306,7 +311,7 @@ ADD指令需要写回通用寄存器堆因此我们需要在写回级访问
// #fakepar
// #figure(
// //TODO增加目录结构图
TODO增加目录结构图
// caption: "开发环境目录结构"
// )<开发环境目录结构>
// #fakepar
@ -338,7 +343,7 @@ myCPU和dram、Peripherals之间有一个“一分二”部件。这是因为在
由于上板的限制条件很多,这里我们再介绍我们实现的软件仿真方法,其运行效果与上板仿真几乎无异,但效率更高且更加方便。
// TODO仿真结构
TODO仿真结构
=== myCPU的顶层接口
@ -377,14 +382,14 @@ myCPU和dram、Peripherals之间有一个“一分二”部件。这是因为在
[reset], [1], [input], [复位信号,高电平同步复位],
colspanx(3)[], text(red)[指令端访存接口],
[inst_sram_en], [1], [output], [RAM使能信号高电平有效],
[inst_sram_wen], [8], [output], [RAM字节写使能信号高电平有效],
[inst_sram_addr], [32], [output], [RAM读写地址字节寻址],
[inst_sram_wdata], [64], [output], [RAM写数据],
[inst_sram_rdata], [64], [input], [读数据],
[inst_sram_wen], [#{inst_ram_date_wid/8}], [output], [RAM字节写使能信号高电平有效],
[inst_sram_addr], [#paddr_wid], [output], [RAM读写地址字节寻址],
[inst_sram_wdata], [#inst_ram_date_wid], [output], [RAM写数据],
[inst_sram_rdata], [#inst_ram_date_wid], [input], [读数据],
colspanx(3)[], text(red)[数据端访存接口],
[data_sram_en], [1], [output], [RAM使能信号高电平有效],
[data_sram_wen], [8], [output], [RAM字节写使能信号高电平有效],
[data_sram_addr], [32], [output], [RAM读写地址字节寻址],
[data_sram_addr], [#paddr_wid], [output], [RAM读写地址字节寻址],
[data_sram_wdata], [64], [output], [RAM写数据],
[data_sram_rdata], [64], [input], [读数据],
colspanx(3)[], text(red)[debug信号供验证平台使用],
@ -427,11 +432,21 @@ myCPU和dram、Peripherals之间有一个“一分二”部件。这是因为在
= 实验要求
+ 根据本实验提供的五级流水线编程框架,在流水线 CPU 中添加以下指令ADD、SLL、SLT 、SLTU、XOR 、SRL 、OR、AND 、SUB 、SRA
+ 通过本实验提供的所有测试用例
+ 根据本实验提供的五级流水线编程框架,在流水线 CPU 中添加以下指令ADD、SUB、SLL、SLT、SLTU、XOR、SRL、SRA、OR、AND、ADDW、SUBW、SLLW、SRLW、SRLW、SRAW。
+ 通过本实验提供的所有仿真验证测试用例
+ 通过本实验提供的所有板级验证测试用例
+ 撰写实验报告:撰写报告时要求叙述以下内容,以及你对本实验的思考与探索。
#[
#set enum(numbering: "a")
+ 选择需要实现的指令中的一条,按照你自己的理解,逐步介绍其数据通路设计的思路以及实现过程
+ 尝试自己绘制一幅属于自己的数据通路图。(注意:以后数据通路的添加都需要在该图上继续增加。因此打一个好的地基很重要,现在偷懒之后还是需要补的。)
+ TODO增加更多内容
]
= 实验步骤
+ 实验平台的使用
+ 如何上板
+ 如何打开工程文件进行编程
+ 如何使用模拟器进行仿真
+ 如何提交测评
@ -443,4 +458,5 @@ myCPU和dram、Peripherals之间有一个“一分二”部件。这是因为在
+ SLT 和 SLTU 这类比较指令的实现是为了什么目的,比如是为了实现什么样的目标才有了这类指令?(方便实现大数计算的进位操作)
+ SLL、SRL 和 SRA 这三条指令在 src2 高 63 至 6 位不全为 0 的时候,指令的执行结果是什么?(手册规定只需要看 src2 低 6 位即可,高位忽略)
+ RISC-V 的运算指令有进行运算结果的溢出判断吗,为什么要这样设计?可以对比 MIPS 指令集进行说明(无溢出判断,相比 MIPS 少了 ADDU 等不判断溢出的指令,应该是为了节省指令编码空间,况且溢出判断可以用软件实现)
+
+ 为什么并不是所有的R型计算指令都有对应的字指令
+ 谈谈你在实验中碰到了哪些问题?又是如何解决的?