大实验报告
CPU 的结构图
功能模块功能
-
immu段
- immu:将虚拟指令地址转换为物理地址
-
if:
- icache:隔断法接入,取指
-
id:
- decode:指令译码
- regfile:寄存器堆
-
exe:
- alu:完成算术、逻辑运算
-
dmmu:
- dmmu:将mem段虚拟地址转换为物理地址
-
其他
- hazard_controller: 控制stall,flush
- csr_trap:处理中断异常
数据前传
冲突检测:
-
在每个可能产生数据相关性的阶段,检测是否有需要向后传递的数据。
-
这些阶段包括执行阶段(EX,ALU 输出)、访存阶段(MEM,内存读输出)、写回阶段(WB,CSR输出和PC+4)。
-
hazard_controller模块根据指令的数据相关性情况和优先级,选择合适的数据前传路径。
-
按照指令从新到老的顺序,判定需要前传的数据的优先级。
-
根据优先级判定,决定是否进行数据前传。如果检测到数据相关性且前一条指令的执行结果已经准备好,就进行数据前传。
冲突例子
-
指令1:
ADD R1, R2, R3
(将R2和R3的值相加,结果存储到R1) -
指令2:
SUB R4, R1, R5
(将R1和R5的值相减,结果存储到R4)
如果没有数据前传机制,指令2在ID阶段检测到要读取R1寄存器的时候,R1的值尚未被指令1写回。这将导致指令2必须等待指令1进入WB阶段,才能在下一个时钟周期读取R1的值。
波形图展示
实现的扩展功能
uCore
我们组最终成功运行uCore:部分测例截图如下
cache
隔断法,仅仅icache
-
Cache存储结构:
- Cache使用64个缓存条目(cache entry),每个缓存条目有57位,其中包括一个有效位、24位标签、和一个32位数据。(24位标签是由于只做了icache,总是4地址对齐,因此忽略低二位)
cache_regs
是一个包含64个缓存条目的寄存器数组。
-
Cache地址结构:
- Cache采用直接映射方式,使用6位索引(cache index)和24位标签(cache tag)。
-
Cache逻辑
- 在
CACHE_IDLE
状态,如果发生缓存命中,则立即提供数据,否则向存储器发出读请求。 - 在
CACHE_MEM_READ
状态,等待存储器的响应,将数据写入缓存。
- 在
页表&TLB
-
TLB和页表结构:
- MMU包含TLB和两级页表。TLB用于高效缓存最近的虚拟地址到物理地址的映射。
- 两级页表包括Level-1(LV1)和Level-2(LV2)。、
- TLB一项(陈康老师课上的建议),实际测试仍有较高命中率。
-
虚拟地址结构:
- 输入的虚拟地址
va_i
包括32位,分为偏移(va_offset
)、LV2 VPN(va_vpn_2
)、LV1 VPN(va_vpn_1
)。
- 输入的虚拟地址
-
物理地址结构:
- 输出的物理地址
pa_o
包括32位,由LV2页表的PTE中的PPN和虚拟地址的偏移组成。
- 输出的物理地址
-
TLB命中检测:
- 通过
tlb_hit
信号判断是否发生TLB命中,通过比较TLB的有效位、标签和VPN。
- 通过
-
页表访问:
- 根据状态机状态,在
mmu_lv1
和mmu_lv2
状态下,向存储器发出读请求,获取对应的PTE。
- 根据状态机状态,在
-
TLB更新:
- 在
mmu_lv2
状态下,如果访问成功,更新TLB的标签和PTE。
- 在
-
异常处理:
- 在状态机中,如果发生页错误,设置
page_fault_o
为1,通知上层。
- 在状态机中,如果发生页错误,设置
性能对比
我们小组没有太关注性能优化,最终只通过了CRYPTONIGHT
测试 | 初始版本(15Mhz) | icache(15Mhz) | 50Mhz |
---|---|---|---|
CRYPTONIGHT | 40.029s | 15.065s | 4.519s |
思考题
-
流水线 CPU 设计与多周期 CPU 设计的异同
流水线 CPU 将指令执行过程划分为多个阶段,并允许同时执行多个指令的不同阶段,以提高整体执行效率。多周期 CPU 则将指令执行划分为多个较大的时钟周期,每个周期内完成特定阶段的操作。总体而言,流水线 CPU 具有更高的吞吐量和效率,但可能会面临数据冲突和流水线停顿等问题。而多周期 CPU 相对简单,更容易实现,但在同一时刻只能执行一条指令,效率相对较低。
插入等待周期(气泡)和数据旁路在处理数据冲突的性能上有什么差异。
插入等待周期(气泡)是为了解决数据冲突而在流水线中插入空操作周期,以防止数据错误。这种方法会导致性能下降,因为处理器在等待周期内无法执行实际操作。相比之下,数据旁路允许处理器从其他可用的数据来源获取数据,而不是等待数据准备就绪。这样可以避免插入等待周期,提高性能。因此,数据旁路在处理数据冲突时通常比插入等待周期更有效,因为它允许处理器更灵活地继续执行指令,而不是被迫等待。
-
如何使用 Flash 作为外存,如果要求 CPU 在启动时,能够将存放在 Flash 上固定位置的监控程序读入内存,CPU 应当做什么样的改动?
- 引导程序修改: 需要修改系统引导程序,以支持从 Flash 中加载监控程序。引导程序负责在系统启动时初始化硬件,并将监控程序加载到内存中的指定位置。
- Flash 接口初始化: CPU 需要初始化 Flash 存储器的接口,确保能够正确地读取数据。这可能涉及到配置 Flash 控制器、设置时序参数等操作,以确保稳定和可靠的数据传输。
- 地址映射: 确保监控程序的固定位置在内存地址空间中有正确的映射。这意味着需要在内存地址映射表或者其他相应的机制中指定 Flash 存储器的地址范围,以便 CPU 能够正确访问其中的数据。
-
如何将 DVI 作为系统的输出设备,从而在屏幕上显示文字?
将部分内存地址映射给DVI
分工表
-
郭高旭:页表及虚拟地址转换、TLB 、指令缓存、verilator配置
-
zyz
-
szn