Skip to content

Conjunto de Instruções Disponível

Diogo Valadares Reis dos Santos edited this page Aug 26, 2025 · 3 revisions

[English]

[← Página Anterior | Próxima Página →]

Conjunto de Instruções Base

A Arquitetura DRISC-V utiliza o RV32I como base, o que significa que opera com instruções de 32 bits e endereços de memória de 32 bits. Ela inclui 32 registradores de uso geral disponíveis para a maioria das operações.

A tabela a seguir lista os registradores disponíveis no processador. Embora cada registrador tenha um papel recomendado definido pela especificação ABI (Interface Binária de Aplicação) não pertencente à ISA — e esses papéis sejam seguidos em aplicações reais — iniciantes não precisam se preocupar com isso neste estágio. Este guia os apresenta gradualmente, com explicações mais profundas nas páginas seguintes.

Registradores RV32I

Registrador Nome ABI Descrição
x0 zero Valor constante 0
x1 ra Endereço de retorno
x2 sp Ponteiro de pilha
x3 gp Ponteiro global
x4 tp Ponteiro de thread
x5 t0 Registrador temporário
x6 t1 Registrador temporário
x7 t2 Registrador temporário
x8 s0/fp Registrador salvo / ponteiro de quadro
x9 s1 Registrador salvo
x10 a0 Argumento de função / valor de retorno
x11 a1 Argumento de função / valor de retorno
x12 a2 Argumento de função
x13 a3 Argumento de função
x14 a4 Argumento de função
x15 a5 Argumento de função
x16 a6 Argumento de função
x17 a7 Argumento de função
x18 s2 Registrador salvo
x19 s3 Registrador salvo
x20 s4 Registrador salvo
x21 s5 Registrador salvo
x22 s6 Registrador salvo
x23 s7 Registrador salvo
x24 s8 Registrador salvo
x25 s9 Registrador salvo
x26 s10 Registrador salvo
x27 s11 Registrador salvo
x28 t3 Registrador temporário
x29 t4 Registrador temporário
x30 t5 Registrador temporário
x31 t6 Registrador temporário

A tabela abaixo mostra todas as instruções disponíveis na Arquitetura DRISC-V. Embora apenas 5 bits sejam mostrados aqui, os opcodes RV32I utilizam 7 bits no total. Os dois primeiros bits ([1:0]) são sempre 11, indicando uma instrução de 32 bits. Embora o conjunto de instruções pareça mínimo, cada opcode possui múltiplas variantes e parâmetros que ampliam sua funcionalidade.

Nota: Um opcode (código de operação) é a parte de uma instrução de máquina que especifica a operação a ser realizada.

Opcodes DRISC-V

Bits [6:2] 000-- 001-- 010-- 011-- 100-- 101-- 110-- 111--
---00 LOAD OP-IMM STORE OP BRANCH SYSTEM
---01 AUIPC LUI JALR
---10
---11 JAL

As instruções são descritas com mais detalhes nas páginas seguintes desta wiki. Por ora, aqui está uma visão geral de suas funcionalidades:


Load e Store

Essas instruções lidam com a troca de dados entre a memória do sistema (RAM) e os registradores internos do processador. Como o RISC-V é uma arquitetura registrador-registrador, Load e Store são as únicas instruções que interagem diretamente com a memória. Todas as outras operam exclusivamente sobre registradores internos.


OP e OP-IMM

Abreviação de Operation e Operation-Immediate, essas instruções realizam operações aritméticas e lógicas na ULA (Unidade Lógica e Aritmética). As variantes imediatas permitem o uso de constantes embutidas em vez de registradores. Por exemplo, é possível somar o valor de um registrador com um imediato de 12 bits codificado diretamente na instrução. O tamanho dos imediatos varia entre as instruções, mas operações da ULA geralmente usam imediatos de 12 bits.


JAL e JALR

São instruções de salto incondicional. Quando executadas, alteram o contador de programa (PC) para um endereço de destino e salvam o endereço de retorno em um registrador.

  • JAL (Jump and Link) usa um imediato de 20 bits somado ao endereço atual.
  • JALR (Jump and Link Register) soma um valor de registrador com um imediato de 12 bits, permitindo saltos para posições absolutas de memória.

Branch

Instruções de Branch realizam saltos condicionais com base em comparações entre dois registradores. Se a condição for satisfeita, um pequeno imediato é somado ao endereço atual para determinar o destino do salto. Diferente de JAL e JALR, instruções de Branch não salvam o endereço de retorno.


LUI e AUIPC

Essas instruções carregam constantes de 20 bits em registradores.

  • LUI (Load Upper Immediate) coloca o valor nos 20 bits superiores de um registrador.
  • AUIPC (Add Upper Immediate to PC) soma o imediato ao contador de programa atual.
    São frequentemente usadas em conjunto com OP-IMM para construir constantes completas de 32 bits.

System

Instruções System fornecem acesso a operações privilegiadas e recursos arquiteturais especiais. Isso inclui chamadas de ambiente, acesso a registradores CSR (Control and Status Register) e outros mecanismos de controle. Mais detalhes estão disponíveis nas páginas seguintes desta wiki.

Extensões ISA

A arquitetura DRISC fornece 4 extensões ISA: U, Zmmul, Zicsr e Zicntr.

Extensão Zmmul

A extensão Zmmul habilita operações de multiplicação na ULA (Unidade Lógica e Aritmética). Seu nome pode parecer complexo, mas refere-se simplesmente a um subconjunto da extensão M, que também inclui operações de divisão e módulo.

A divisão foi intencionalmente excluída deste projeto para manter a implementação mais simples. Circuitos de divisão são significativamente mais complexos que os de multiplicação e, embora a lógica interna das operações matemáticas seja abstraída nas simulações, decidiu-se omitir a divisão por enquanto. No entanto, ela pode ser adicionada em versões futuras.

Todas as operações de multiplicação são tratadas por meio do formato de instrução OP e suportam operandos de 32 bits. O resultado da multiplicação pode ser acessado como os 32 bits inferiores ou superiores do resultado completo de 64 bits.

Atualmente, a implementação não inclui otimizações para instruções consecutivas que recuperam ambas as partes do resultado. Essa escolha simplifica o projeto e mantém a arquitetura limpa para fins educacionais e de prototipagem.

Extensão U

Com apenas o conjunto de instruções base, a arquitetura RISC-V opera exclusivamente no chamado modo Máquina (também conhecido como modo kernel em outras arquiteturas). Nesse modo, os programas têm acesso irrestrito a todos os recursos do sistema. Embora isso possa ser aceitável para certas aplicações, a computação moderna de uso geral exige um ambiente mais seguro e controlado — onde operações críticas são reservadas ao sistema operacional (SO), e aplicações de usuário têm acesso limitado.

O RISC-V define três níveis de privilégio, mas no DRISC-V apenas dois são relevantes: modo Máquina (M) e modo Usuário (U). A extensão U introduz suporte ao modo usuário ao definir registradores e sinais de controle que permitem a separação de privilégios. Isso permite que o processador distinga entre código confiável de nível de sistema e aplicações de usuário não confiáveis, estabelecendo as bases para multitarefa, proteção de memória e execução segura.

Extensão Zicsr

A extensão Zicsr introduz suporte aos Registradores de Controle e Status (CSRs) no RISC-V, juntamente com um conjunto de instruções de sistema que permitem sua manipulação. Essas instruções facilitam operações como chamadas de sistema, interrupções de ambiente e outras tarefas privilegiadas.

Os CSRs fornecem informações essenciais sobre o estado atual do processador. Isso inclui detalhes como versão do processador, conjuntos de instruções suportados, níveis de privilégio e configurações de interrupção. Sua implementação pode variar dependendo do projeto do processador e das extensões suportadas.

Nota: Nem todos os CSRs definidos na especificação RISC-V precisam ser implementados. Além disso, alguns CSRs implementados podem não suportar todos os bits especificados. Certos CSRs são introduzidos por outras extensões, que serão discutidas em seções posteriores.

CSRs e Contadores em Nível de Máquina

Registrador Descrição Observações
mvendorid Identifica o fornecedor Valor fixo: 0x00af001d
marchid Identifica a arquitetura Valor fixo: 0x00000000
mimpid ID da implementação Único por revisão da arquitetura
mhartid ID do núcleo de hardware Valor fixo: 0x00000000 (núcleo único)
mstatus Flags de status do processador Implementa: Privilégio anterior (PP), Interrupção habilitada (IE), IE anterior (PIE)
misa Extensões ISA suportadas Extensões: E, I, M (sem divisão), U; desativação não suportada
mie Bits de habilitação de interrupção Suporta interrupções de software, temporizador e externas em nível máquina
mtvec Endereço base do tratador de exceções Padrão: 0x80000001 → base 0x80000000, modo vetorizado
mstatush Bits superiores de mstatus Bit relevante: endianess do modo usuário (fixado em 0)
mscratch Armazenamento temporário para tratamento de exceções Usado durante execução de exceções
mepc Contador de programa para exceções Armazena o último endereço acessado antes da exceção
mcause Causa da exceção Inclui interrupções e exceções (ex.: endereço desalinhado, instrução ilegal)
mtval Valor da exceção Contém a instrução ou endereço que causou a exceção
mip Flags de interrupções pendentes Controlado por dispositivos externos; espelha os bits de mie
cycle Contador de ciclos Incrementa a cada ciclo de clock; cada estágio do pipeline leva 2 ciclos
time Contador de tempo Dispara um carregamento de memória ao ser lido
instret Contador de instruções aposentadas Incrementa por instrução (a cada 2 ciclos); não incrementa durante exceções
cycleh 32 bits superiores de cycle
timeh 32 bits superiores de time
instreth 32 bits superiores de instret

Cada registrador possui seu próprio formato, nível mínimo de privilégio para acesso e pode conter campos somente leitura. Informações detalhadas sobre essas características podem ser encontradas na Especificação Privilegiada do RISC-V. A tabela acima resume a implementação de cada CSR, indicando quais bits são implementados e se são somente leitura.

Extensão Zicntr

Resumo da Extensão Zicntr

A extensão Zicntr define três contadores essenciais de leitura no RISC-V: cycle, time e instret. Esses contadores rastreiam o número de ciclos de clock executados, o tempo real decorrido e as instruções aposentadas, respectivamente. Zicntr depende da extensão Zicsr para acesso aos CSRs.

Esses contadores são fundamentais para análise de desempenho, otimização dinâmica e aplicações em tempo real. Cada contador possui 64 bits, mas como os CSRs são limitados a 32 bits em sistemas como o DRISC-V, as partes inferior e superior de cada contador são acessadas separadamente por meio de diferentes CSRs.

Embora os contadores sejam padronizados, seu comportamento pode variar ligeiramente dependendo do ambiente de execução. Por exemplo, a taxa de incremento de cycle depende do clock do processador, e time reflete o tempo de parede com precisão específica da plataforma. A aposentadoria de instruções exclui operações que geram exceções síncronas, como ECALL e EBREAK.

No DRISC-V, o contador instret aumenta uma vez a cada dois ciclos de clock, o que corresponde à duração de cada estágio do pipeline e, consequentemente, ao tempo necessário para completar cada instrução. Embora time seja projetado para usar um relógio de tempo real, seu valor é simulado nos ambientes DRISC-V. Mais detalhes sobre essa simulação serão fornecidos nas páginas correspondentes da documentação.

Clone this wiki locally