如何知道 MIPS 指令生成什么控制信号?

How to know what control signals a MIPS instruction generates?

我正在用 Verilog 创建仿真。

我有一个内存模块,加载了像这样的 MIPS 指令...

20082000
200d2030
8dad0000
240a0001
ad0a0000
..
..
..

内存模块输出指令到一个"Control"模块的输入,这个模块有以下信号:

RegDst,Jump,Branch,MemRead,MemtoReg,ALUOp,MemWrite,ALUSrc,RegWrite

将为加载内存模块的受支持指令列表生成信号值。 add,addi等指令

我如何知道给定指令的信号是真还是假?

你必须分解每条指令的作用。

例如使用MIPS green card

所有 R 型指令共享某些控制信号,这些信号来自其基本指令格式——它们 source/read rs & rt,以及 target/write 到 rd,例如,表示:

  • RegDest为真(写的是rd,不是rt
  • RegWrite 为真(写了一些 reg)
  • ALUSrc 为真(第二个 alu 输入来自寄存器,而不是立即数)

I 型指令都有特定的共享控制信号模式:

  • RegDest为false(rt是写的,I-Types没有rd
  • RegWrite 为真(写了一些 reg)
  • ALUSrc 为假(第二个 alu 输入来自立即数,而不是来自寄存器)

除加载和存储外,没有指令接触内存,因此 MemReadMemWrite 对于所有其他指令都是错误的。 MemRead 仅适用于加载,MemWrite 仅适用于商店。

MemtoReg 对于加载是正确的,因为结果来自内存,但对于大多数其他指令是错误的,因为结果(如果有的话)来自 ALU。


对于许多指令,其中一些控制信号无关紧要,因此可以归类为 "don't care" 而不是 true 或 false(硬件都可以)。例如,由于存储指令将数据发送到内存,它不会更新 CPU 寄存器——因此,MemToReg 不在乎,因为无论如何都没有写入 reg(与分支机构,因为它们也没有 write/update 寄存器)。

RegWrite为false时,则MemtoReg无所谓(就是don't care)。


与其余大多数不同,ALUOp 是一个比单个布尔值更大的控制信号。所以 ALU 需要知道要执行什么操作,对于 R 型指令,这来自指令的 funct 字段,而对于 I 型指令,这来自操作码字段本身。

对于加载和存储,ALU(在单周期MIPS CPU)用于执行寻址模式计算,因此应该告诉ALU进行加法。

对于分支(在单周期 MIPS CPU 中),应告知 ALU 进行减法(即比较)。


高级:硬件是所有指令所需的所有组件的联合体。控制信号用于 "activate" 执行任何单个指令的适当硬件组件——但是,诀窍是这些信号实际上并不激活组件,而是选择是接受还是忽略它们的输出(s ) 在他们分别计算出有用或无用的东西之后,给定正在执行的指令。

这有点古怪,但是所有需要的硬件组件(对于每条可能的指令)的组合一直坐在那里做一些事情(除非使用非常先进的节能电路)。因此,控制信号所做的——而不是关闭对当前指令没有贡献的组件——是简单地忽略它们的计算结果,而是支持相关的东西。

例如,有效地,立即数硬件是对 I 型 16 位立即数进行符号扩展在每个指令的每个周期,但该计算值仅在指令实际上是一个 I 型,否则由于控制信号 (ALUSrc) 而被忽略。

虽然我们可能认为这是低效的,但并行性能值得赞赏,即预先计算不必要的东西,以防万一需要它们,并且只有在知道更多信息后才被抑制。