confreg(配置寄存器)
- 功能概述
- 在这个 SoC(片上系统)设计中,
confreg
是用于存储系统配置信息的寄存器模块。它通过 AXI(Advanced eXtensible Interface)接口与其他模块进行通信,接收和发送配置相关的数据
- 在这个 SoC(片上系统)设计中,
R 型指令:
- 常见指令:
add $rd,$rs,$rt
(加法)、sub $rd,$rs,$rt
(减法)、and $rd,$rs,$rt
(逻辑与)、or $rd,$rs,$rt
(逻辑或)等。 - 五级流水线运行过程:
- 取指阶段(IF):从指令存储器中取出指令,同时程序计数器(PC)的值递增,指向下一条指令的地址。
- 译码阶段(ID):对取出的指令进行解码,从寄存器堆中读出
rs
和rt
指定的寄存器中的值。 - 执行阶段(EX):ALU 根据指令的功能码(funct)确定要执行的操作,对从寄存器堆读出的
rs
和rt
的值进行相应运算。 - 访存阶段(MEM):R 型指令一般不涉及内存访问,此阶段直接跳过。
- 写回阶段(WB):将 ALU 运算的结果写回到寄存器堆中
rd
指定的寄存器
I 型指令:
- 常见指令:包括立即数操作指令和分支指令,如
addi $rt,$rs,immediate
(立即数加法)、lw $rt,offset($rs)
(从内存加载字到寄存器)、sw $rt,offset($rs)
(将寄存器中的字存储到内存)、beq $rs,$rt,label
(相等则跳转)、bne $rs,$rt,label
(不相等则跳转)等。
- 数据处理速度匹配:寄存器是 CPU 内部的高速存储单元,其读写速度极快,能与 CPU 的运算速度相匹配。而内存的读写速度相对较慢,如果 CPU 直接从内存获取数据进行运算,会因内存读写速度的限制而大大降低 CPU 的运算效率。例如,在执行一条简单的加法指令时,如果操作数在寄存器中,CPU 可以在一个时钟周期内完成读取和运算;但如果操作数在内存中,可能需要多个时钟周期才能完成数据的读取,这会严重影响整体的运算速度1。
- 指令集架构设计:MIPS 是一种精简指令集计算机(RISC)架构,其指令集设计强调寄存器的使用。大多数 MIPS 指令都被设计为对寄存器中的数据进行操作。例如,加法指令
add $t0, $t1, $t2
是将寄存器$t1
和$t2
中的值相加,结果存放在寄存器$t0
中,这种设计方式使得指令的执行更加高效和简洁。
内存和 CPU 中的寄存器存在以下关系:
- 数据存储的不同层次:寄存器是内存层次结构中的最顶端,是系统获得操作资料的最快速途径。内存则处于存储层次的较低层,容量通常比寄存器大得多,但速度比寄存器慢。可以将寄存器看作是 CPU 与内存之间的高速缓冲,用于暂存 CPU 即将使用或刚刚处理完的数据,以减少 CPU 访问内存的次数,提高系统性能1。
- 数据传输与交互:CPU 在需要处理数据时,会首先将内存中的数据加载到寄存器中,运算完成后,再将寄存器中的结果写回到内存中。例如,当程序需要读取一个变量的值进行计算时,CPU 会发出内存读取指令,将变量从内存中读取到寄存器中,然后在寄存器中进行计算,计算结束后再将结果写回内存中对应的存储位置。
- 功能上的协作:寄存器和内存共同为 CPU 的运算和指令执行提供支持。寄存器用于临时存储数据和指令,方便 CPU 快速访问和操作;内存则用于长期存储程序和数据,为 CPU 提供数据来源和结果存储的空间。它们在计算机系统中相互配合,使得计算机能够高效地运行各种程序和任务
op
:操作码,用于确定指令类型,如加载 / 存储(lw
、sw
)、立即数运算(addi
等)、分支(beq
、bne
)等操作。rs
:源寄存器。rt
:目的寄存器(对于加载 / 存储操作,rt
是源 / 目的寄存器;对于立即数运算,rt
是目的寄存器;对于分支操作,rt
和rs
用于比较)。immediate
:立即数,在加载 / 存储操作中是偏移量,在立即数运算中是操作数,在分支操作中是相对偏移量。
-
J 型指令格式
- 格式:
op(6 bits)
+address(26 bits)
- 解释:
op
:操作码,用于确定跳转操作类型,如j
(无条件跳转)、jal
(跳转并链接)等。address
:跳转目标地址的低 26 位,高 4 位由 PC + 4 的高 4 位补充得到跳转目标地址。
- 例如,
j address
指令,其机器码为000010 address
- 格式:
- 主要任务
- 根据译码阶段确定的指令类型和操作数进行相应的运算或操作。对于算术逻辑指令(如加法、减法、逻辑与 / 或等),使用算术逻辑单元(ALU)对操作数进行计算。例如,对于加法指令,ALU 会将两个操作数相加。
- 在一些指令(如分支指令和加载 / 存储指令)中,执行阶段还需要计算分支目标地址或内存访问地址。例如,对于分支指令 “beq $t1, ,需要判断t1和$t2 是否相等,如果相等,则计算分支目标地址(通常是 PC + offset);对于加载 / 存储指令 “lw t1)”,需要计算内存访问地址($t1 的值 + offset)。
-
写回(Write Back,WB)阶段
- 主要任务
- 将访存阶段得到的数据或者执行阶段的运算结果写回到目的寄存器中。对于加载指令,将从内存读取的数据写入指定的目的寄存器;对于算术逻辑指令,将 ALU 的运算结果写入目的寄存器。这样,寄存器中的数据就得到了更新,可以被后续的指令使用。
- 举例说明
- 对于 “lw t1)” 指令,将访存阶段读取到的 0x00000010 写回到$t0寄存器。对于“add $t0, $t1, 指令,将执行阶段计算得到的写回到t0寄存器。之后,如果有指令需要使用$t0 寄存器中的数据,就可以获取到更新后的值。
- 主要任务
执行阶段的主要任务包括 ALU 运算,但不限于此
- 算术逻辑运算(ALU)
- 核心运算部分:在执行阶段,ALU 运算确实是非常重要的部分。对于算术指令(如加法、减法、乘法、除法)和逻辑指令(如与、或、非、异或),ALU 会根据指令译码阶段确定的操作类型,对操作数进行相应的计算。例如,对于加法指令 “add $t0, $t1, ,会将t1 和寄存器中的值相加,得到的结果将用于后续阶段(如写回阶段存入t0 寄存器)。
- 运算依据:ALU 的操作类型是由指令的操作码(Opcode)以及可能的功能码(Funct)决定的。在译码阶段识别出这些代码后,控制信号会引导 ALU 执行正确的运算。例如,在 MIPS 指令集中,不同的操作码和功能码组合可以指定 ALU 执行不同的算术或逻辑操作。
- 地址计算
- 分支指令相关地址计算:对于分支指令(如 “beq $t1, $t2, offset”),执行阶段需要计算分支目标地址。这通常涉及到将当前程序计数器(PC)的值与指令中的偏移量(offset)相加。例如,如果 PC 当前值为 0x00400000,偏移量为 0x00000010(指令中编码的立即数),那么分支目标地址为 0x00400010。这个计算出的地址将用于判断是否进行分支跳转。
- 加载 / 存储指令相关地址计算:在加载(如 “lw t1)”)和存储(如 “sw t2)”)指令中,需要计算内存访问地址。这个地址是由基地址寄存器(如或t2)的值和指令中的偏移量(offset)相加得到的。例如,$t1 的值为 0x1000,偏移量为 0x0010,那么内存访问地址为 0x1010。
- 指令的特殊操作执行
- 移位操作:有些指令可能涉及移位操作,如左移(“sll”)或右移(“srl”)指令。在执行阶段,需要对操作数进行相应的移位处理。例如,对于 “sll $t0, 指令,会将t1寄存器中的值左移2位,结果存入$t0 寄存器。这种移位操作虽然可以看作是一种特殊的算术操作,但它不是典型的 ALU 加法或减法运算。
- 特殊指令的执行逻辑:一些特殊指令,如系统调用指令(用于请求操作系统服务)或协处理器指令(用于与特定的协处理器交互),在执行阶段也有其特定的操作。这些操作可能不涉及传统的 ALU 运算,而是通过触发特定的硬件机制或与其他硬件模块协作来完成任务。例如,系统调用指令可能会暂停当前程序的执行,将控制权转移到操作系统内核的特定处理程序