流水账(CPU设计实战)——lab9_8

本文详细介绍了在FPGA上设计并实现MIPS五级流水线CPU的过程,包括Top顶层模块、IF、ID、EXE、MEM和WB各阶段的接口信号和时序设计。在Debug部分,作者分析并解决了诸如badvaddr、mfc0、adel、eret、rf_we的使能等问题,展示了CPU设计中可能遇到的挑战及其解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lab9_8 V6.8

版本控制

版本 描述
V0 Lab3
V1.0 Lab3 相对V0变化: 修改了文件名,各阶段以_stage结尾(因为if是关键词,所以module名不能叫if,遂改为if_stage,为了统一命名,将所有module后缀加上_stage) 删除了imm_sign信号(默认对立即数进行有符号数扩展) 由于对sw指令进行了重新理解:无论如何都是需要将rt_data传递给EXE阶段,故将部分译码逻辑进行后移至EXE阶段,避免id_to_exe_data总线过于庞大 将ins_shmat剔除出id_to_exe_data,因为imm包括ins_shamt 对信号进行重命名(例如在ID阶段有个信号叫rf_we,最终要传递给WB阶段,那么在EXE阶段,该信号叫作exe_rf_we,同理mem_rf_we,wb_rf_we),不然都叫rf_we,Debug的时候太痛苦了。
V2.0 Lab4 相对V1.0的变化 引入`ifdef-`else-`endif来实现相对V1.0的代码增量 增加了旁路控制,减少流水线阻塞(因为增加了旁路,所以修改了ID、EXE、MEM的接口) 修改了ready_go命令,用于控制流水线的阻塞
V3.0 Lab6(加载的是func_lab6的.coe文件,而不是func_lab5的,因为没有func_lab5这个东西) 相对V2.0的变化:电路细节变化详见:“CPU设计实战电路图”,图中Lab6的变化均以红色背景的方框框起来,并以黄色背景的“Lab6复用/新增信号”标注。本lab6.docx中,新增及修改的信号以红色标注。 删掉了ALU.v的接口,将alu_shamt合并至data_1,方便对新加指令sllv、srlv、srav的数据通路的复用 增加了ID.v中的alu_add的“或门”的输入 扩充了id_to_exe_data总线数据, 因为alu_op扩充了新的指令 添加了imm_zero_ext信号 修改了ins_R、ins_J、ins_I,因为增加了新的指令 乘法器和除法器调用vivado的IP,其周期参数化可配置设计 乘法和除法结果存放的寄存器HI/LO放在WB.v中 增加了sfr.v,用于特殊寄存器的存储 增加了mul_div.v,用于处理乘法和除法。增加了mul.v用于处理乘法,增加了divu.v用于处理无符号除法,增加了divs.v用于处理有符号除法 修改了id_to_exe_data,添加了新信号:imm_zero_ext_en 修改了id_to_exe_data,扩充了alu_op的位宽,并将alu_op调整至id_to_exe_data的最高位,方便未来扩充指令
V4.0 Lab7 修改了alu_op的位宽 新增了两个bus:lw_bus、sw_bus,同时将mem_rd整合至lw_bus,将mem_we整合至sw_bus 扩大了id_to_exe_data lw_bus传递至MEM阶段结束,sw_bus传递至EXE阶段结束 修改了旁路,之前都是lw的旁路,这里将其扩充了lb、lbu、lh、lhu、lwl、lwr
V5.0 Lab8 (对应第7章任务一):添加syscall例外支持 增加MTC0、MFC0、ERET指令 增加CP0寄存器Status、Cause、EPC 增加SYSCALL指令 新建SSR.v(即system registers),是ID.v的子模块 为ID、EXE、MEM、WB级增加了flush信号,用于将数据清零
V6.0 添加break指令断点例外 添加地址错、整数溢出、保留指令例外 增加CP0寄存器Count、Compare、BadVAddr 增加时钟中断 增加6个硬中断 增加2个软件中断
V6.8 此版本感觉叫5.8更好,但是本人就顺着叫6.8了,此版本实际上是V5.0的重写,重新设计了数据通路: 将SSR.v放在WB阶段(依据原书P173) MFC0/MTC0也放在WB阶段,并且不引入旁路,而是直接插入NOP(依据原书P180)

Top顶层

接口信号

MYCPU_TOP.v(TOP

名称 宽度 方向 描述
时钟与复位
clk 1 I 时钟信号,来自clk_pll的输出时钟
resetn 1 I 复位信号,低电平同步复位
取指端访存接口
inst_sram_en 1 O 指令RAM使能信号,高电平有效
inst_sram_wen 4 O 指令RAM字节写使能信号,高电平有效
inst_sram_addr 32 O 指令RMA读写地址,字节寻址
inst_sram_wdata 32 O 指令RAM写数据
inst_sram_rdata 32 I 指令RAM读数据
数据端访存接口
data_sram_en 1 O 数据RAM使能信号,高电平有效
data_sram_wen 4 O 数据RAM字节写使能信号,高电平有效
data_sram_addr 32 O 数据RAM读写地址,字节寻址
data_sram_wdata 32 O 数据RAM写数据
data_sram_rdata 32 I 数据RAM读数据
debug信号,供验证平台使用
debug_wb_pc 32 O 写回级(多周期最后一级)的PC,需要myCPU里将PC一路传递到写回级
debug_wb_rf_wen 4 O 写回级写寄存器堆(regfiles)的写使能,为字节使能,如果myCPU写regfiles为单字节写使能,则将写使能扩展成4位即可
debug_wb_rf_wnum 5 O 写回级写regfiles的目的寄存器号
debug_wb_rf_wdata 32 O 写回级写regfiles的写数据

接口时序

略(MIPS经典五级流水线)

代码结构

MYCPU_TOP.v

|____IF.v

|____ID.v

|____RF.v(2个读端口,1个写端口)

|____SFR.v(1个读端口,2个写端口)

|____EXE.v

|____ALU.v

|____MUL_DIV.v(专门处理乘法和除法)

|____MUL.v

|____DIVU.v

|____DIVS.v

|____MEM.v

|____WB.v

|____SSR.v

|____MYCPU.h

DATA_RAM.v

IF.v(修改为IF_STAGE,因为会与关键词if冲突)

接口信号

名称 宽度 方向 描述
时钟与复位
clk 1 I 时钟信号,来自clk_pll的输出时钟
resetn 1 I 复位信号,低电平同步复位
与TOP
inst_sram_en 1 O RAM使能信号,高电平有效
inst_sram_wen 4 O RAM字节写使能信号,高电平有效
inst_sram_addr 32 O RMA读写地址,字节寻址
inst_sram_wdata 32 O RAM写数据
inst_sram_rdata 32 I RAM读数据
与ID
id_to_if_allowin 1 I pipe allowin
if_to_id_vld 1 O pipe valid
if_to_id_data 64 O pipe data(instruction 32-bits, pc 32-bits)
jump_bus 33 I branch instructions(enable 1bit,address 32-bits)
与WB
wb_jump_en 1 I 检测到EXC,然后决定是否jump
wb_jump_pc 32 I 检测到EXC,jump的PC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Greate AUK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值