RISC V tem 6 formatos de instruções diferentes para instruções de 32 bits. Todos os formatos compartilham o campo opcode, e o campo opcode é usado para determinar o tamanho da instrução e o formato da instrução.
Embora alguns dos outros campos sejam compartilhados entre dois ou mais formatos, nenhum outro campo está presente em todos os formatos.
Por exemplo, o campo funct7 está presente apenas em um dos seis formatos para instruções de 32 bits, ou seja, o formato de instrução register/register.
O campo funct3 está presente em 4 dos 6 formatos para instruções de 32 bits, mas não em todos os formatos.
Quero saber por que opcode, funct7 e funct3 não se juntam para formar um campo de 17 bits?
Como esses dois outros campos são essencialmente específicos apenas para um subconjunto de instruções/formatos de instruções, eles realmente não podem ser considerados parte do opcode no caso geral. Quando o formato é register/register, então todos esses três campos juntos determinam a operação a ser realizada.
Podemos extrair todos os três campos simultaneamente; no entanto, precisamos estar cientes de que tal extração só será aplicável quando a instrução estiver no formato correto.
Na verdade, é assim que o hardware geralmente funciona: ele começa a decodificar campos antes mesmo de saber quais campos são aplicáveis a essa instrução em particular. Depois que essa decodificação inicial, excessivamente ampla, acontece, outro hardware seleciona qual dos campos usar e como, ignorando outros cálculos que foram feitos apenas no caso de a instrução ser realmente diferente.
Por exemplo, o hardware provavelmente estará extraindo os campos de 5 bits rs2e rs1, usando-os como índices no arquivo de registradores para obter valores desses registradores e deixá-los prontos para computação, independentemente do formato de instrução real. Isso, então, é trabalho desperdiçado quando a instrução não tem esses campos, mas fazer esse trabalho antes de saber o opcode acelera as coisas quando esses campos são aplicáveis. Outras partes do hardware estão extraindo valores imediatos, e tudo isso é feito em paralelo para desempenho.
Aqui estão todos os formatos de 32 bits em uma imagem:
RISC V tem 6 formatos de instruções diferentes para instruções de 32 bits. Todos os formatos compartilham o campo opcode, e o campo opcode é usado para determinar o tamanho da instrução e o formato da instrução.
Embora alguns dos outros campos sejam compartilhados entre dois ou mais formatos, nenhum outro campo está presente em todos os formatos.
Por exemplo, o campo funct7 está presente apenas em um dos seis formatos para instruções de 32 bits, ou seja, o formato de instrução register/register.
O campo funct3 está presente em 4 dos 6 formatos para instruções de 32 bits, mas não em todos os formatos.
Como esses dois outros campos são essencialmente específicos apenas para um subconjunto de instruções/formatos de instruções, eles realmente não podem ser considerados parte do opcode no caso geral. Quando o formato é register/register, então todos esses três campos juntos determinam a operação a ser realizada.
Podemos extrair todos os três campos simultaneamente; no entanto, precisamos estar cientes de que tal extração só será aplicável quando a instrução estiver no formato correto.
Na verdade, é assim que o hardware geralmente funciona: ele começa a decodificar campos antes mesmo de saber quais campos são aplicáveis a essa instrução em particular. Depois que essa decodificação inicial, excessivamente ampla, acontece, outro hardware seleciona qual dos campos usar e como, ignorando outros cálculos que foram feitos apenas no caso de a instrução ser realmente diferente.
Por exemplo, o hardware provavelmente estará extraindo os campos de 5 bits
rs2
ers1
, usando-os como índices no arquivo de registradores para obter valores desses registradores e deixá-los prontos para computação, independentemente do formato de instrução real. Isso, então, é trabalho desperdiçado quando a instrução não tem esses campos, mas fazer esse trabalho antes de saber o opcode acelera as coisas quando esses campos são aplicáveis. Outras partes do hardware estão extraindo valores imediatos, e tudo isso é feito em paralelo para desempenho.Aqui estão todos os formatos de 32 bits em uma imagem: