-
Notifications
You must be signed in to change notification settings - Fork 0
Conjunto de Instruções Disponível
[English]
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.
| 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.
| 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:
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.
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.
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.
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.
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.
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.
A arquitetura DRISC fornece 4 extensões ISA: U, Zmmul, Zicsr e Zicntr.
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.
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.
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.
| 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.
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.
-
- 1.1 Introduction
- 1.2 RISC-V Implementation
- 1.2.1 Available Instruction Set
- 1.2.2 Available Non-ISA Features
-
- 2.1 ALU
- 2.2 Register File
- 2.3 Program Counter
- 2.4 Input Buffer
- 2.5 RAM
- 2.6 Operation Controller
- 2.7 CSR Controller
-
- 3.1 Input Devices
- 3.1.1 Keyboard
- 3.1.2 Switches and Joystick
- 3.1.3 Random Number Generator
- 3.1.4 Real-Time Device
- 3.2 Output Devices
- 3.2.1 Screen
- 3.2.2 Terminal
- 3.2.3 Software Interrupt Register
- 3.1 Input Devices