# lab3 **Repository Path**: aufidius/lab3 ## Basic Information - **Project Name**: lab3 - **Description**: 五级流水线的企业实训课 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-01 - **Last Updated**: 2026-09-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # openLA500 ## 前言 openLA500是一款实现了龙芯架构32位精简版指令集(loongarch32r)的处理器核。其结构为单发射五级流水,分为取指、译码、执行、访存、写回五个流水级。并且含有两路组相连结构的指令和数据cache;32项tlb;以及简易的分支预测器。此外,处理器核对外为AXI接口,容易集成。 OpenLA500已经过流片验证,.13工艺下频率为100M,dhrystone,coremark分数分别为0.78 DMIPS/MHz(指令数有点高),2.75 coremark/Mhz。软件方面,uboot、linux 5.14、ucore、rt-thread等常用工具及内核已完成对openLA500的适配。 详细设计报告见doc目录。 ## 说明 本项目基于openLA500修改而来,用于LoongArch32精简指令集处理器设计教学目标,共设计4个lab,分别为: - lab1:流水线设计(需通过chiplab:func/func_lab7) - lab2:AXI总线/CSR设计/部分异常处理(需通过chiplab:func/func_lab9) - lab3:Cache设计(需通过chiplab:func/func_lab9、coremark/drystone性能测试) - lab4:MMU/TLB设计(原则上需通过chiplab所有测试,至少通过func/func_lab19、coremark、drystone、rtthread、linux) 每个lab需要实现的代码使用TODO(labx)标记。每个lab的代码均在对应的分支上(`dev-labx`),lab(x+1)会给出lab(x)的实现,lab4的实现位于`dev`分支。 chiplab func测试点列表: ```plaintext n1_lu12i_w.S n2_add_w.S n3_addi_w.S n4_sub_w.S n5_slt.S n6_sltu.S n7_and.S n8_or.S n9_xor.S n10_nor.S n11_slli_w.S n12_srli_w.S n13_srai_w.S n14_ld_w.S n15_st_w.S n16_beq.S n17_bne.S n18_bl.S n19_jirl.S n20_b.S n21_pcaddu12i.S n22_slti.S n23_sltui.S n24_andi.S n25_ori.S n26_xori.S n27_sll_w.S n28_sra_w.S n29_srl_w.S n30_div_w.S n31_div_wu.S n32_mul_w.S n33_mulh_w.S n34_mulh_wu.S n35_mod_w.S n36_mod_wu.S n37_blt.S n38_bge.S n39_bltu.S n40_bgeu.S n41_ld_b.S n42_ld_h.S n43_ld_bu.S n44_ld_hu.S n45_st_b.S n46_st_h.S n47_syscall_ex.S n48_brk_ex.S n49_ti_ex.S n50_ine_ex.S n51_soft_int_ex.S n52_adef_ex.S n53_ale_ld_w_ex.S n54_ale_ld_h_ex.S n55_ale_ld_hu_ex.S n56_ale_st_h_ex.S n57_ale_st_w_ex.S n58_rdcnt.S n59_tlbrd_tlbwr.S n60_tlbfill.S n61_tlbsrch.S n62_invtlb_0x0.S n63_invtlb_0x1.S n64_invtlb_0x2.S n65_invtlb_0x3.S n66_invtlb_0x4.S n67_invtlb_0x5.S n68_invtlb_0x6.S n69_invtlb_inv_op.S n70_tlb_4MB.S n71_tlb_ex.S n72_dmw_test.S n73_icacop_op0.S n74_dcacop_op0.S n75_icacop_op1.S n76_dcacop_op1.S n77_icacop_op2.S n78_dcacop_op2.S n79_cache_writeback.S n80_ti_ex_wait.S n81_atomic_ins.S ``` chiplab func/func_lab测试点: ```plaintext - lab3 : n1~n20 - lab4~5 : n1~n20 - lab6 : n1~n36 - lab7 : n1~n46 - lab8 : n1~n47 - lab9, 11~12 : n1~n58 - lab14 : n1~n70 - lab15, 17~18 : n1~n72 - lab19 : n1~n81 ``` Tips: - 实现过程中无需修改模块端口。 - 所有的题目用已有信号即可正确实现要求的功能。 - 如有必要也可声明新的中间变量。 ## 分支说明 流水线设计起始代码,需要完成TODO(lab1)的所有内容,并通过至少通过chiplab中func/func_lab7测试。 由于在lab1是在lab2分支上实现的,因此注释中的TODO(lab1)内容可能不同,但lab2分支保证实现了lab1的所要求的内容。 ## 实验内容说明 ### Lab1:流水线设计 Lab1是LoongArch32精简指令集处理器的基础流水线设计实验,需要实现一个五级流水线处理器(取指、译码、执行、访存、写回)的核心控制逻辑。本实验要求完成以下TODO(lab1)任务,并通过chiplab的func/func_lab7测试(即测试点n1~n46)。 ### Lab1 TODO任务 | 流水级 | 文件 | 行号 | 信号/任务 | 功能描述 | 实现提示 | |--------|------|------|-----------|----------|----------| | **ALU** | `alu.v` | 47 | ALU运算逻辑 | 根据操作控制信号执行算术逻辑运算 | 支持加法、减法、比较、逻辑运算、移位等14种运算 | | **取指(IF)** | `if_stage.v` | 483 | `fs_ready_go` | IF阶段准备完成条件 | 指令数据返回 或 指令缓冲有效 或 发生异常 | | | | 487 | `fs_allowin` | IF阶段允许新数据进入 | 当前无有效数据或准备完成且后级允许 | | | | 491 | `fs_to_ds_valid` | 向译码阶段传递有效信号 | 当前有效且准备完成 | | **译码(ID)** | `id_stage.v` | 488 | `ds_ready_go` | 译码阶段准备完成条件 | 无数据相关阻塞、无TLB指令阻塞、无内存屏障阻塞,或发生异常 | | | | 492 | `ds_allowin` | 译码阶段允许新数据进入 | 当前无有效数据或准备完成且执行阶段允许 | | | | 496 | `ds_to_es_valid` | 译码到执行阶段数据有效 | 当前有效且准备完成 | | | | 671 | ALU操作码生成 | 根据指令类型生成ALU控制信号 | 生成14位独热编码的ALU操作控制信号 | | | | 1004 | 数据前递逻辑 | 处理来自执行和访存阶段的数据前递 | 考虑exe和mem两个阶段的前递,避免数据相关停顿 | | **执行(EXE)** | `exe_stage.v` | 311 | `es_ready_go` | 执行阶段准备就绪条件 | 除法不停顿、内存访问/Cache操作地址握手、TLB搜索、指令Cache操作、异常处理 | | | | 320 | `es_allowin` | 执行阶段允许接收新数据 | 当前无有效数据 或 (准备就绪且访存阶段允许接收) | | | | 324 | `es_to_ms_valid` | 传给访存阶段的数据有效 | 当前有效且准备就绪 | | | | 382 | `forward_enable` | 前推使能条件 | 有写寄存器操作 && 目标寄存器非0 && 执行阶段有效 | | | | 385 | `dep_need_stall` | 数据依赖停顿处理 | 加载操作、除法、乘法指令会产生数据依赖 | | **访存(MEM)** | `mem_stage.v` | 288 | `ms_ready_go` | 访存阶段准备就绪条件 | dcache数据准备好、数据缓冲有效、不访问内存、异常发生、条件存储取消 | | | | 295 | `ms_allowin` | 访存阶段允许接收新数据 | 当前无有效数据或(准备就绪 且 写回阶段允许接收新数据) | | | | 298 | `ms_to_ws_valid` | 传给写回阶段的数据有效 | 数据有效且准备就绪 | | | | 358 | `forward_enable` | 前递使能条件 | 写寄存器、目标不为0、当前阶段有效 | | | | 361 | `dep_need_stall` | 加载指令停顿处理 | 当加载指令还没到写回阶段时,后续指令需要等待 | ### 实验整体解读 **核心概念:五级流水线设计** Lab1的核心是实现一个经典的五级流水线处理器,每个阶段都需要正确的流水线控制逻辑: 1. **流水线握手机制**:每个阶段都有三个关键信号 - `ready_go`:当前阶段是否完成工作 - `to_next_valid`:向下游阶段传递的数据是否有效 - `allowin`:是否允许上游阶段传入新数据 2. **数据前递机制**:解决流水线中的数据冒险 - 执行阶段和访存阶段都可以向译码阶段前递数据 - 避免因数据依赖而导致的不必要停顿 - 对于无法前递的情况(如加载指令),需要插入停顿 3. **ALU设计**:实现基本的算术逻辑运算 - 支持LoongArch32指令集的基本运算需求 - 包括算术运算、逻辑运算、移位运算等 ### 实验报告要求 - 通过测试的截图 - 如果没能通过测试,简述当前的实验进展和遇到的困难,并提交提交调试的时波形截图