如何知道 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 输入来自立即数,而不是来自寄存器)
除加载和存储外,没有指令接触内存,因此 MemRead
和 MemWrite
对于所有其他指令都是错误的。 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) 而被忽略。
虽然我们可能认为这是低效的,但并行性能值得赞赏,即预先计算不必要的东西,以防万一需要它们,并且只有在知道更多信息后才被抑制。
我正在用 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 输入来自立即数,而不是来自寄存器)
除加载和存储外,没有指令接触内存,因此 MemRead
和 MemWrite
对于所有其他指令都是错误的。 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) 而被忽略。
虽然我们可能认为这是低效的,但并行性能值得赞赏,即预先计算不必要的东西,以防万一需要它们,并且只有在知道更多信息后才被抑制。