为什么是';操作码';字段和';函数';MIPS中的字段分隔?

为什么是';操作码';字段和';函数';MIPS中的字段分隔?,mips,hardware,cpu-architecture,instruction-set,opcode,Mips,Hardware,Cpu Architecture,Instruction Set,Opcode,MIPS ISA有一条R类型指令,R指令的前6位有一个opcode字段,最后6位有一个funct字段。那么为什么ISA设计成这样呢?将它们合并成12位字段如何?如果将它们合并成12位字段如何? 由于操作码与MIPS中的某些操作是相同的,如果您改变了函数>代码>,就不能区分指令的操作,例如考虑以下添加(R,0,32) Addio>代码>有操作码 0 < /代码>和函数> /代码>代码> 32 < /代码> BR> 并认为(R,0,36)和也有操作码 0 但不同的函数在这种情况下 36 这意味着它和

MIPS ISA有一条
R
类型指令,
R
指令的前6位有一个
opcode
字段,最后6位有一个
funct
字段。那么为什么ISA设计成这样呢?将它们合并成12位字段如何?

如果将它们合并成12位字段如何?

由于操作码与MIPS中的某些操作是相同的,如果您改变了<代码>函数>代码>,就不能区分指令的操作,例如考虑以下添加(R,0,32)<代码> Addio>代码>有操作码<代码> 0 < /代码>和<代码>函数> /代码>代码> 32 < /代码> BR> 并认为(R,0,36)<代码>和也有操作码<代码> 0 但不同的<代码>函数在这种情况下<代码> 36 <代码>这意味着它和<代码>和< /代码>操作。

检查MIPS参考表。


我的想法是这三种指令共享一个6位操作码前缀。对于R和I类型,接下来的5位决定源寄存器。如果我们将R指令的操作码和funct组合在一起,则R和I之间的指令格式不太一致,这可能会使处理器的设计变得复杂。

为什么要将它们组合成12位?因为所有指令都必须从一个公共点开始解码。一个12位的操作码会对其他非R类型的操作码占用太多的位,而非R类型的操作码会将它们用于其他用途。(例如,
j
jal
指令使用剩余的位指定地址(即无功能字段)。解码操作码后,每条指令可以任意解释剩余的26位。立即指令(例如,
ori
)使用最后6个作为16位立即操作数的一部分。我想您可以将
funct
放在
opcode
旁边,然后移动其他字段。但这需要对I-type的立即数进行拆分。RISC-V确实将某些指令格式的立即数拆分,RISC-V手册解释了一些设计动机,以减少解码所需的多路复用,并通过算术右移简化软件符号扩展,将立即数的顶部位放在指令的最左侧。