大实验报告

大实验报告

CPU 的结构图

new

功能模块功能

  • 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. 指令1:ADD R1, R2, R3(将R2和R3的值相加,结果存储到R1)

  2. 指令2:SUB R4, R1, R5(将R1和R5的值相减,结果存储到R4)

如果没有数据前传机制,指令2在ID阶段检测到要读取R1寄存器的时候,R1的值尚未被指令1写回。这将导致指令2必须等待指令1进入WB阶段,才能在下一个时钟周期读取R1的值。

波形图展示

image-20231224123103091

实现的扩展功能

uCore

我们组最终成功运行uCore:部分测例截图如下

4d3e953ebaf08ae3abd30e2c5a69b4c

cache

隔断法,仅仅icache

  1. Cache存储结构:

    • Cache使用64个缓存条目(cache entry),每个缓存条目有57位,其中包括一个有效位、24位标签、和一个32位数据。(24位标签是由于只做了icache,总是4地址对齐,因此忽略低二位)
    • cache_regs是一个包含64个缓存条目的寄存器数组。
  2. Cache地址结构:

    • Cache采用直接映射方式,使用6位索引(cache index)和24位标签(cache tag)。
  3. Cache逻辑

    • CACHE_IDLE状态,如果发生缓存命中,则立即提供数据,否则向存储器发出读请求。
    • CACHE_MEM_READ状态,等待存储器的响应,将数据写入缓存。

image-20231224124747700

页表&TLB

  1. TLB和页表结构:

    • MMU包含TLB和两级页表。TLB用于高效缓存最近的虚拟地址到物理地址的映射。
    • 两级页表包括Level-1(LV1)和Level-2(LV2)。、
    • TLB一项(陈康老师课上的建议),实际测试仍有较高命中率。
  2. 虚拟地址结构:

    • 输入的虚拟地址va_i包括32位,分为偏移(va_offset)、LV2 VPN(va_vpn_2)、LV1 VPN(va_vpn_1)。
  3. 物理地址结构:

    • 输出的物理地址pa_o包括32位,由LV2页表的PTE中的PPN和虚拟地址的偏移组成。
  4. TLB命中检测:

    • 通过tlb_hit信号判断是否发生TLB命中,通过比较TLB的有效位、标签和VPN。
  5. 页表访问:

    • 根据状态机状态,在mmu_lv1mmu_lv2状态下,向存储器发出读请求,获取对应的PTE。
  6. TLB更新:

    • mmu_lv2状态下,如果访问成功,更新TLB的标签和PTE。
  7. 异常处理:

    • 在状态机中,如果发生页错误,设置page_fault_o为1,通知上层。

    image-20231224124804221

性能对比

我们小组没有太关注性能优化,最终只通过了CRYPTONIGHT

测试 初始版本(15Mhz) icache(15Mhz) 50Mhz
CRYPTONIGHT 40.029s 15.065s 4.519s

思考题

  1. 流水线 CPU 设计与多周期 CPU 设计的异同

    流水线 CPU 将指令执行过程划分为多个阶段,并允许同时执行多个指令的不同阶段,以提高整体执行效率。多周期 CPU 则将指令执行划分为多个较大的时钟周期,每个周期内完成特定阶段的操作。总体而言,流水线 CPU 具有更高的吞吐量和效率,但可能会面临数据冲突和流水线停顿等问题。而多周期 CPU 相对简单,更容易实现,但在同一时刻只能执行一条指令,效率相对较低。

    插入等待周期(气泡)和数据旁路在处理数据冲突的性能上有什么差异。

    插入等待周期(气泡)是为了解决数据冲突而在流水线中插入空操作周期,以防止数据错误。这种方法会导致性能下降,因为处理器在等待周期内无法执行实际操作。相比之下,数据旁路允许处理器从其他可用的数据来源获取数据,而不是等待数据准备就绪。这样可以避免插入等待周期,提高性能。因此,数据旁路在处理数据冲突时通常比插入等待周期更有效,因为它允许处理器更灵活地继续执行指令,而不是被迫等待。

  2. 如何使用 Flash 作为外存,如果要求 CPU 在启动时,能够将存放在 Flash 上固定位置的监控程序读入内存,CPU 应当做什么样的改动?

    1. 引导程序修改: 需要修改系统引导程序,以支持从 Flash 中加载监控程序。引导程序负责在系统启动时初始化硬件,并将监控程序加载到内存中的指定位置。
    2. Flash 接口初始化: CPU 需要初始化 Flash 存储器的接口,确保能够正确地读取数据。这可能涉及到配置 Flash 控制器、设置时序参数等操作,以确保稳定和可靠的数据传输。
    3. 地址映射: 确保监控程序的固定位置在内存地址空间中有正确的映射。这意味着需要在内存地址映射表或者其他相应的机制中指定 Flash 存储器的地址范围,以便 CPU 能够正确访问其中的数据。
  3. 如何将 DVI 作为系统的输出设备,从而在屏幕上显示文字?

    将部分内存地址映射给DVI

分工表

  • 郭高旭:页表及虚拟地址转换、TLB 、指令缓存、verilator配置

  • zyz

  • szn




本文总阅读量