Microcódigo - Microcode

No projeto do processador , o microcódigo é uma técnica que interpõe uma camada de organização do computador entre o hardware da CPU e a arquitetura do conjunto de instruções visível ao programador do computador. Microcódigo é uma camada de instruções de nível de hardware que implementa instruções de código de máquina de nível superior ou sequenciamento de máquina de estado interno em muitos elementos de processamento digital . O microcódigo é usado em unidades de processamento central de uso geral , embora nas atuais CPUs de desktop, seja apenas um caminho alternativo para casos que a unidade de controle com fio mais rápida não consegue lidar.

O microcódigo normalmente reside em uma memória especial de alta velocidade e traduz instruções de máquina, dados de máquina de estado ou outra entrada em sequências de operações detalhadas no nível do circuito. Ele separa as instruções da máquina dos componentes eletrônicos subjacentes para que as instruções possam ser projetadas e alteradas com mais liberdade. Também facilita a construção de instruções complexas de várias etapas, ao mesmo tempo que reduz a complexidade dos circuitos do computador. O microcódigo de escrita é freqüentemente chamado de microprogramação e o microcódigo em uma implementação de processador específica às vezes é chamado de microprograma .

Mais extensa microcoding permite que pequenas e simples microarquiteturas para emular arquiteturas mais poderosas com ampla extensão da palavra , mais unidades de execução e assim por diante, o que é uma maneira relativamente simples de se conseguir a compatibilidade de software entre diferentes produtos em uma família de processadores.

Alguns fornecedores de hardware, especialmente IBM , usam o termo microcódigo como sinônimo de firmware . Dessa forma, todo código em um dispositivo é denominado microcódigo, independentemente de ser microcódigo ou código de máquina ; por exemplo, diz-se que as unidades de disco rígido têm seu microcódigo atualizado, embora geralmente contenham microcódigo e firmware.

Visão geral

A camada mais baixa na pilha de software de um computador é, tradicionalmente, instruções de código de máquina brutas para o processador. Em processadores microcodificados, o microcódigo busca e executa essas instruções. Para evitar confusão, cada elemento relacionado ao microprograma é diferenciado pelo prefixo micro : microinstrução, microassembler, microprogrammer, microarquitetura , etc.

Os engenheiros normalmente escrevem o microcódigo durante a fase de design de um processador, armazenando-o em uma memória somente leitura (ROM) ou estrutura de matriz lógica programável (PLA), ou em uma combinação de ambas. No entanto, também existem máquinas que possuem alguns ou todos os microcódigos armazenados na SRAM ou na memória flash . Isso é tradicionalmente denotado como armazenamento de controle gravável no contexto de computadores, que pode ser somente leitura ou memória de leitura e gravação . Neste último caso, o processo de inicialização da CPU carrega microcódigo no armazenamento de controle a partir de outro meio de armazenamento, com a possibilidade de alterar o microcódigo para corrigir bugs no conjunto de instruções ou para implementar novas instruções de máquina.

Processadores digitais complexos também podem empregar mais de uma unidade de controle (possivelmente baseada em microcódigo) para delegar subtarefas que devem ser realizadas essencialmente de forma assíncrona em paralelo. Um programador de alto nível, ou mesmo um programador de montagem , normalmente não vê ou altera o microcódigo. Ao contrário do código de máquina, que geralmente retém alguma compatibilidade com versões anteriores entre diferentes processadores em uma família, o microcódigo só funciona no circuito eletrônico exato para o qual foi projetado, pois constitui uma parte inerente do próprio design do processador em particular.

Os microprogramas consistem em uma série de microinstruções, que controlam a CPU em um nível fundamental de circuito de hardware. Por exemplo, uma única microinstrução horizontal típica pode especificar as seguintes operações:

  • Conecte o registro 1 ao lado A da ALU
  • Conecte o registro 7 ao lado B da ALU
  • Defina a ALU realizar complemento de dois além
  • Defina a entrada de transporte da ALU para zero
  • Armazene o valor do resultado no registro 8
  • Atualize os códigos de condição dos sinalizadores de status da ALU ( negativo , zero , estouro e transporte )
  • Microjump to micro PC nnn para a próxima microinstrução

Para controlar simultaneamente todos os recursos do processador em um ciclo, a microinstrução costuma ser mais ampla do que 50 bits; por exemplo, 128 bits em um 360/85 com um recurso de emulador. Os microprogramas são cuidadosamente projetados e otimizados para a execução mais rápida possível, pois um microprograma lento resultaria em uma instrução de máquina lenta e desempenho degradado para programas de aplicativos relacionados que usam tais instruções.

Justificação

O microcódigo foi originalmente desenvolvido como um método mais simples de desenvolver a lógica de controle para um computador . Inicialmente, os conjuntos de instruções da CPU eram conectados . Cada etapa necessária para buscar, decodificar e executar as instruções da máquina (incluindo quaisquer cálculos , leituras e gravações de endereços de operandos ) foi controlada diretamente pela lógica combinacional e por circuitos de máquina de estado sequencial mínimo . Embora esses processadores conectados fossem muito eficientes, a necessidade de conjuntos de instruções poderosos com endereçamento de várias etapas e operações complexas ( veja abaixo ) dificultava o projeto e a depuração; instruções altamente codificadas e de comprimento variado também podem contribuir para isso, especialmente quando codificações muito irregulares são usadas.

O microcódigo simplificou o trabalho permitindo que muito do comportamento do processador e do modelo de programação fossem definidos por meio de rotinas de microprograma, em vez de circuitos dedicados. Mesmo mais tarde no processo de design, o microcódigo poderia ser facilmente alterado, enquanto os designs de CPU com fio eram muito difíceis de alterar. Portanto, isso facilitou muito o design da CPU.

Dos anos 1940 ao final dos anos 1970, uma grande parte da programação era feita em linguagem assembly ; instruções de nível superior significam maior produtividade do programador, portanto, uma vantagem importante do microcódigo era a relativa facilidade com que as instruções de máquina poderosas podem ser definidas. A extensão final disso são os designs de "Linguagem de alto nível executável diretamente", em que cada instrução de uma linguagem de alto nível como PL / I é inteiramente e diretamente executada por microcódigo, sem compilação. O projeto IBM Future Systems e o Data General Fountainhead Processor são exemplos disso. Durante a década de 1970, a velocidade da CPU cresceu mais rapidamente do que a velocidade da memória e várias técnicas, como transferência de bloco de memória , pré-busca de memória e caches de vários níveis, foram usadas para aliviar isso. As instruções de máquina de alto nível, possibilitadas pelo microcódigo, ajudaram ainda mais, pois menos instruções de máquina mais complexas requerem menos largura de banda de memória. Por exemplo, uma operação em uma string de caracteres pode ser feita como uma única instrução de máquina, evitando assim várias buscas de instruções.

As arquiteturas com conjuntos de instruções implementadas por microprogramas complexos incluíram o IBM System / 360 e a Digital Equipment Corporation VAX . A abordagem de conjuntos de instruções implementadas por microcódigo cada vez mais complexos foi posteriormente chamada de CISC . Uma abordagem alternativa, usada em muitos microprocessadores , é usar PLAs ou ROMs (em vez de lógica combinacional) principalmente para decodificação de instruções e deixar uma máquina de estado simples (sem muito ou nenhum microcódigo) fazer a maior parte do sequenciamento. O MOS Technology 6502 é um exemplo de um microprocessador que usa um PLA para decodificação e sequenciamento de instruções. O PLA é visível nas fotomicrografias do chip, e seu funcionamento pode ser visto na simulação em nível de transistor.

A microprogramação ainda é usada em designs modernos de CPU. Em alguns casos, depois que o microcódigo é depurado na simulação, as funções lógicas são substituídas pelo armazenamento de controle. As funções lógicas costumam ser mais rápidas e menos caras do que a memória de microprograma equivalente.

Benefícios

Os microprogramas de um processador operam em uma arquitetura mais primitiva, totalmente diferente e muito mais orientada para o hardware do que as instruções de montagem visíveis para os programadores normais. Em coordenação com o hardware, o microcódigo implementa a arquitetura visível ao programador. O hardware subjacente não precisa ter um relacionamento fixo com a arquitetura visível. Isso torna mais fácil implementar uma determinada arquitetura de conjunto de instruções em uma ampla variedade de micro-arquiteturas de hardware subjacentes.

O IBM System / 360 tem uma arquitetura de 32 bits com 16 registradores de uso geral, mas a maioria das implementações do System / 360 realmente usa hardware que implementou uma microarquitetura subjacente muito mais simples; por exemplo, o System / 360 Modelo 30 tem caminhos de dados de 8 bits para a unidade de lógica aritmética (ALU) e a memória principal e implementou os registros de uso geral em uma unidade especial de memória central de alta velocidade e o modelo System / 360 40 tem caminhos de dados de 8 bits para a ALU e caminhos de dados de 16 bits para a memória principal e também implementou os registros de uso geral em uma unidade especial de memória central de alta velocidade. O Modelo 50 possui caminhos de dados completos de 32 bits e implementa os registradores de uso geral em uma unidade especial de memória central de alta velocidade. Do Modelo 65 ao Modelo 195 têm caminhos de dados maiores e implementam os registradores de uso geral em circuitos de transistor mais rápidos. Dessa forma, a microprogramação permitiu que a IBM projetasse muitos modelos System / 360 com hardware substancialmente diferente e abrangendo uma ampla gama de custos e desempenho, ao mesmo tempo em que os tornava todos compatíveis com a arquitetura. Isso reduz drasticamente o número de programas de software de sistema exclusivos que devem ser escritos para cada modelo.

Uma abordagem semelhante foi usada pela Digital Equipment Corporation (DEC) em sua família de computadores VAX. Como resultado, diferentes processadores VAX usam diferentes microarquiteturas, mas a arquitetura visível ao programador não muda.

A microprogramação também reduz o custo das mudanças de campo para corrigir defeitos ( bugs ) no processador; um bug pode ser corrigido com a substituição de uma parte do microprograma, em vez de alterações feitas na lógica e na fiação do hardware .

História

Em 1947, o projeto do MIT Whirlwind introduziu o conceito de armazenamento de controle como uma forma de simplificar o projeto do computador e ir além dos métodos ad hoc . O armazenamento de controle é uma matriz de diodo : uma rede bidimensional, onde uma dimensão aceita "pulsos de tempo de controle" do relógio interno da CPU e a outra se conecta aos sinais de controle em portas e outros circuitos. Um "distribuidor de pulso" pega os pulsos gerados pelo relógio da CPU e os divide em oito pulsos de tempo separados, cada um dos quais ativa uma linha diferente da rede. Quando a linha é ativada, ela ativa os sinais de controle conectados a ela.

Descrito de outra forma, os sinais transmitidos pelo armazenamento de controle estão sendo tocados como um rolo de piano . Ou seja, eles são controlados por uma sequência de palavras muito amplas, construída com bits , e são "reproduzidos" sequencialmente. Em uma loja de controle, entretanto, a "música" é curta e repetida continuamente.

Em 1951, Maurice Wilkes aprimorou esse conceito adicionando a execução condicional , um conceito semelhante a uma condicional em software de computador. Sua implementação inicial consistia em um par de matrizes: a primeira gerava sinais na forma do armazenamento de controle Whirlwind, enquanto a segunda matriz selecionava qual linha de sinais (a palavra de instrução do microprograma, por assim dizer) invocar no próximo ciclo. As condicionais foram implementadas fornecendo uma maneira que uma única linha no armazenamento de controle poderia escolher entre alternativas na segunda matriz. Isso tornou os sinais de controle condicionais ao sinal interno detectado. Wilkes cunhou o termo microprogramação para descrever esse recurso e distingui-lo de um armazenamento de controle simples.

Exemplos

  • O EMIDEC 1100 supostamente usa um armazenamento de controle com fio que consiste em fios enfiados através de núcleos de ferrite, conhecidos como "os laços".
  • A maioria dos modelos da série IBM System / 360 são microprogramados:
    • O Modelo 25 é único entre os modelos System / 360 por usar os 16 K bytes principais de armazenamento central para manter o armazenamento de controle para o microprograma. O 2025 usa uma microarquitetura de 16 bits com sete palavras de controle (ou microinstruções). Após a manutenção do sistema ou ao alterar o modo de operação, o microcódigo é carregado do leitor de cartão, fita ou outro dispositivo. A emulação IBM 1410 para este modelo é carregada dessa maneira.
    • O Modelo 30 usa uma microarquitetura de 8 bits com apenas alguns registros de hardware; tudo o que o programador viu é emulado pelo microprograma. O microcódigo deste modelo também é mantido em cartões perfurados especiais, que são armazenados dentro da máquina em um leitor dedicado por cartão, denominado unidades “CROS” (Capacitor Read-Only Storage). Uma unidade CROS adicional é adicionada para máquinas solicitadas com emulação 1401/1440/1460 e para máquinas solicitadas com emulação 1620.
    • O Modelo 40 usa palavras de controle de 56 bits. A caixa 2040 implementa o processador principal System / 360 e o canal multiplex (o processador de E / S). Este modelo usa leitores dedicados "TROS" semelhantes às unidades "CROS", mas com um captador indutivo (Transformer Read-only Store).
    • O Modelo 50 possui dois caminhos de dados internos que operam em paralelo: um caminho de dados de 32 bits usado para operações aritméticas e um caminho de dados de 8 bits usado em algumas operações lógicas. O armazenamento de controle usa microinstruções de 90 bits.
    • O Modelo 85 tem busca de instrução separada (unidade I) e execução (unidade E) para fornecer alto desempenho. A unidade I é controlada por hardware. A unidade E é microprogramada; as palavras de controle têm 108 bits de largura em um 360/85 básico e mais amplo se um recurso de emulador estiver instalado.
  • O NCR 315 é microprogramado com núcleos de ferrite ligados à mão ( ROM ) pulsados ​​por um sequenciador com execução condicional. Os fios roteados pelos núcleos são habilitados para vários dados e elementos lógicos no processador.
  • Os processadores PDP-11 da Digital Equipment Corporation , com exceção do PDP-11/20, são microprogramados.
  • A maioria dos minicomputadores Data General Eclipse são microprogramados. A tarefa de escrever microcódigo para o Eclipse MV / 8000 é detalhada no livro vencedor do Prêmio Pulitzer intitulado The Soul of a New Machine .
  • Muitos sistemas da Burroughs são microprogramados:
  • O "microprocessador" do B700 executa opcodes em nível de aplicativo usando sequências de microinstruções de 16 bits armazenadas na memória principal; cada um deles é uma operação de carregamento de registro ou mapeado para uma única instrução "nanocódigo" de 56 bits armazenada na memória somente leitura. Isso permite que um hardware comparativamente simples atue como um controlador periférico de mainframe ou seja empacotado como um computador independente.
  • O B1700 é implementado com hardware radicalmente diferente, incluindo memória principal endereçável por bits, mas tem uma organização multicamadas semelhante. O sistema operacional pré-carrega o intérprete para qualquer idioma necessário. Esses intérpretes apresentam diferentes máquinas virtuais para COBOL , Fortran , etc.
  • Microdados produzidos em computadores nos quais o microcódigo é acessível ao usuário; isso permite a criação de instruções personalizadas de nível de montador. O design do sistema operacional Reality da Microdata faz uso extensivo desse recurso.
  • A estação de trabalho Xerox Alto usava um design microcodificado, mas, ao contrário de muitos computadores, o mecanismo de microcódigo não fica oculto do programador em um design em camadas. Os aplicativos aproveitam isso para acelerar o desempenho.
  • O Nintendo 64 's Reality coprocessador (RCP), que serve como do console unidade de processamento gráfico e processador de áudio, utiliza microcódigo; é possível implementar novos efeitos ou ajustar o processador para obter a saída desejada. Alguns exemplos notáveis de microcódigo RCP personalizado incluem os gráficos de alta resolução, motores de partículas, e distâncias empate ilimitadas encontrados em Factor 5 de Indiana Jones and the Machine Infernal , Star Wars: Rogue Squadron , e Star Wars: Battle for Naboo ; e a reprodução de vídeo full motion encontrada em Resident Evil 2 do Angel Studios .
  • As unidades de vetor VU0 e VU1 no Sony PlayStation 2 são microprogramáveis; na verdade, VU1 só é acessível via microcódigo para as primeiras gerações do SDK.
  • Os Laboratórios MicroCore MCL86 , MCL51 e MCL65 são exemplos de implementações de microsequenciador "vertical" altamente codificado do Intel 8086/8088, 8051 e MOS 6502.
  • O sistema de computador da Digital Scientific Corp. Meta 4 Series 16 era um sistema micro-programável de usuário disponível pela primeira vez em 1970. O microcódigo tinha um estilo principalmente vertical com microinstruções de 32 bits. As instruções foram armazenadas em placas de programa substituíveis com uma grade de posições de bits. Um (1) bits foram representados por pequenos quadrados de metal que foram detectados por amplificadores, zero (0) bits pela ausência dos quadrados. O sistema pode ser configurado com até 4 K palavras de 16 bits de microstore. Um dos produtos da Digital Scientific era um emulador para o IBM 1130 .
  • Os processadores x86 anteriores são totalmente microcodificados; começando com o Intel 80486 , instruções menos complicadas são implementadas diretamente no hardware. Processadores x86 implementaram microcódigo com patches (patch por BIOS ou sistema operacional ) desde a microarquitetura Intel P6 e microarquitetura AMD K7 .
  • Algumas placas de vídeo , controladores de interface de rede sem fio implementaram microcódigo com patch (patch por sistema operacional).

Implementação

Cada microinstrução em um microprograma fornece os bits que controlam os elementos funcionais que compõem internamente uma CPU. A vantagem sobre uma CPU com fio é que o controle interno da CPU se torna uma forma especializada de um programa de computador. Microcode, portanto, transforma um desafio complexo de design eletrônico (o controle de uma CPU) em um desafio de programação menos complexo. Para tirar proveito disso, uma CPU é dividida em várias partes:

  • Uma I-unit pode descodificar instruções em hardware e determinar o endereço do microcódigo para processar a instrução em paralelo com a E-unit .
  • Um microsequencer escolhe a próxima palavra do armazenamento de controle. Um sequenciador é principalmente um contador, mas geralmente também tem alguma maneira de pular para uma parte diferente do armazenamento de controle dependendo de alguns dados, geralmente dados do registro de instrução e sempre alguma parte do armazenamento de controle. O sequenciador mais simples é apenas um registro carregado de alguns bits do armazenamento de controle.
  • Um conjunto de registros é uma memória rápida que contém os dados da unidade central de processamento. Pode incluir o contador do programa e o ponteiro da pilha , e também pode incluir outros registros que não são facilmente acessíveis ao programador do aplicativo. Freqüentemente, o conjunto de registros é um arquivo de registro de porta tripla ; ou seja, dois registradores podem ser lidos e um terceiro escrito ao mesmo tempo.
  • Uma unidade aritmética e lógica realiza cálculos, geralmente adição, negação lógica, deslocamento à direita e AND lógico. Freqüentemente, também executa outras funções.

Também pode haver um registro de endereço de memória e um registro de dados de memória , usado para acessar o armazenamento principal do computador . Juntos, esses elementos formam uma " unidade de execução ". A maioria das CPUs modernas possui várias unidades de execução. Mesmo os computadores simples geralmente têm uma unidade para ler e escrever na memória e outra para executar o código do usuário. Esses elementos muitas vezes podem ser reunidos como um único chip. Este chip vem em uma largura fixa que formaria uma "fatia" através da unidade de execução. Eles são conhecidos como chips " bit slice ". A família AMD Am2900 é um dos exemplos mais conhecidos de elementos de bit slice. As partes das unidades de execução e as próprias unidades de execução são interconectadas por um feixe de fios chamado barramento .

Os programadores desenvolvem microprogramas, usando ferramentas básicas de software. Um microassembler permite que um programador defina a tabela de bits simbolicamente. Por causa de seu relacionamento próximo com a arquitetura subjacente, "o microcódigo tem várias propriedades que dificultam a geração usando um compilador." Um programa simulador destina-se a executar os bits da mesma forma que a eletrônica e permite muito mais liberdade para depurar o microprograma. Depois que o microprograma é finalizado e amplamente testado, às vezes é usado como entrada para um programa de computador que constrói a lógica para produzir os mesmos dados. Este programa é semelhante aos usados ​​para otimizar um array lógico programável . Mesmo sem uma lógica totalmente otimizada, a lógica otimizada heuristicamente pode reduzir enormemente o número de transistores do número necessário para um armazenamento de controle ROM. Isso reduz o custo de produção e a eletricidade consumida por uma CPU.

O microcódigo pode ser caracterizado como horizontal ou vertical , referindo-se principalmente a se cada microinstrução controla os elementos da CPU com pouca ou nenhuma decodificação (microcódigo horizontal) ou requer extensa decodificação por lógica combinatória antes de fazer isso (microcódigo vertical). Consequentemente, cada microinstrução horizontal é mais ampla (contém mais bits) e ocupa mais espaço de armazenamento do que uma microinstrução vertical.

Microcódigo horizontal

"O microcódigo horizontal possui várias microoperações discretas que são combinadas em uma única microinstrução para operação simultânea." O microcódigo horizontal está normalmente contido em um armazenamento de controle bastante amplo; não é incomum que cada palavra tenha 108 bits ou mais. Em cada tick de um relógio do sequenciador, uma palavra de microcódigo é lida, decodificada e usada para controlar os elementos funcionais que compõem a CPU.

Em uma implementação típica, uma palavra de microprograma horizontal compreende grupos de bits bem definidos. Por exemplo, um arranjo simples pode ser:

Registrar fonte A Registrar fonte B Registro de destino Operação da unidade aritmética e lógica Tipo de salto Endereço de salto

Para que esse tipo de micro-máquina implemente uma instrução JUMP com o endereço após o opcode, o microcódigo pode exigir dois tiques de relógio. O engenheiro que o projeta escreveria o código-fonte do microassembler parecido com isto:

  # Any line starting with a number-sign is a comment
  # This is just a label, the ordinary way assemblers symbolically represent a 
  # memory address.
InstructionJUMP:
      # To prepare for the next instruction, the instruction-decode microcode has already
      # moved the program counter to the memory address register. This instruction fetches
      # the target address of the jump instruction from the memory word following the
      # jump opcode, by copying from the memory data register to the memory address register.
      # This gives the memory system two clock ticks to fetch the next 
      # instruction to the memory data register for use by the instruction decode.
      # The sequencer instruction "next" means just add 1 to the control word address.
   MDR, NONE, MAR, COPY, NEXT, NONE
      # This places the address of the next instruction into the PC.
      # This gives the memory system a clock tick to finish the fetch started on the
      # previous microinstruction.
      # The sequencer instruction is to jump to the start of the instruction decode.
   MAR, 1, PC, ADD, JMP, InstructionDecode
      # The instruction decode is not shown, because it is usually a mess, very particular
      # to the exact processor being emulated. Even this example is simplified.
      # Many CPUs have several ways to calculate the address, rather than just fetching
      # it from the word following the op-code. Therefore, rather than just one
      # jump instruction, those CPUs have a family of related jump instructions.

Para cada tick, é comum descobrir que apenas algumas partes da CPU são usadas, com os grupos de bits restantes na microinstrução sendo autônomos. Com um projeto cuidadoso de hardware e microcódigo, essa propriedade pode ser explorada para paralelizar operações que usam diferentes áreas da CPU; por exemplo, no caso acima, a ALU não é necessária durante o primeiro tique, portanto, poderia ser usada para completar uma instrução aritmética anterior.

Microcódigo vertical

No microcódigo vertical, cada microinstrução é significativamente codificada - ou seja, os campos de bits geralmente passam pela lógica combinatória intermediária que, por sua vez, gera os sinais reais de controle e sequenciamento para elementos internos da CPU (ALU, registros, etc.). Isso está em contraste com o microcódigo horizontal, no qual os próprios campos de bits produzem diretamente os sinais de controle e sequenciamento ou são codificados apenas minimamente. Consequentemente, o microcódigo vertical requer comprimentos de instrução menores e menos armazenamento, mas requer mais tempo para decodificar, resultando em um clock de CPU mais lento.

Algum microcódigo vertical é apenas a linguagem de montagem de um computador convencional simples que está emulando um computador mais complexo. Alguns processadores, como os processadores DEC Alpha e os microprocessadores CMOS em mainframes IBM System / 390 e mainframes z / Architecture , usam código de máquina, executando em um modo especial que dá acesso a instruções especiais, registros especiais e outros recursos de hardware não disponível para código de máquina regular, para implementar algumas instruções e outras funções, como passeios de tabela de página em processadores Alpha. Isso é chamado de PALcode em processadores Alpha e millicode em processadores de mainframe IBM.

Outra forma de microcódigo vertical possui dois campos:

Seleção de campo Valor do campo

O campo select seleciona qual parte da CPU será controlada por esta palavra do armazenamento de controle. O valor do campo realmente controla essa parte da CPU. Com esse tipo de microcódigo, um projetista escolhe explicitamente fazer uma CPU mais lenta para economizar dinheiro, reduzindo os bits não usados ​​no armazenamento de controle; no entanto, a complexidade reduzida pode aumentar a frequência do clock da CPU, o que diminui o efeito de um número maior de ciclos por instrução.

À medida que os transistores se tornaram mais baratos, o microcódigo horizontal passou a dominar o projeto de CPUs que usam microcódigo, com o microcódigo vertical sendo usado com menos frequência.

Quando microcódigo vertical e horizontal são usados, o microcódigo horizontal pode ser referido como nanocódigo ou picocódigo .

Armazenamento de controle gravável

Alguns computadores foram construídos usando "microcódigo gravável". Neste projeto, em vez de armazenar o microcódigo em ROM ou lógica com fio, o microcódigo é armazenado em uma RAM chamada armazenamento de controle gravável ou WCS . Esse computador é às vezes chamado de computador com conjunto de instruções graváveis ou WISC .

Muitos protótipos de computadores experimentais usam armazenamentos de controle graváveis; também existem máquinas comerciais que usam microcódigo gravável, como o Burroughs Small Systems , as primeiras estações de trabalho da Xerox , a família DEC VAX 8800 ("Nautilus"), as máquinas L e G da Symbolics , vários IBM System / 360 e System / 370 implementações, algumas máquinas DEC PDP-10 e o Data General Eclipse MV / 8000 .

Muitos mais máquinas oferecem controle armazena gravável programáveis pelo usuário como uma opção, incluindo o HP 2100 , a DEC PDP-11/60 e Varian Dados Machines V-70 da série minicomputadores . O IBM System / 370 inclui um recurso denominado Initial-Microprogram Load ( IML ou IMPL ) que pode ser invocado a partir do console, como parte do power-on reset ( POR ) ou de outro processador em um complexo de multiprocessador fortemente acoplado .

Algumas máquinas comerciais, por exemplo IBM 360/85, têm um armazenamento somente leitura e um armazenamento de controle gravável para microcódigo.

O WCS oferece várias vantagens, incluindo a facilidade de corrigir o microprograma e, para certas gerações de hardware, acesso mais rápido do que os ROMs podem fornecer. O WCS programável pelo usuário permite que o usuário otimize a máquina para fins específicos.

Começando com o Pentium Pro em 1995, várias CPUs x86 possuem Intel Microcode gravável . Isso, por exemplo, permitiu que bugs nos microcódigos Intel Core 2 e Intel Xeon fossem corrigidos corrigindo seus microprogramas, em vez de exigir que todos os chips fossem substituídos. Um segundo exemplo proeminente é o conjunto de patches de microcódigo que a Intel ofereceu para algumas de suas arquiteturas de processador de até 10 anos de idade, em uma tentativa de combater as vulnerabilidades de segurança descobertas em seus projetos - Spectre e Meltdown - que se tornaram públicos no início de 2018. Uma atualização de microcódigo pode ser instalada pelo Linux, FreeBSD , Microsoft Windows ou pelo BIOS da placa-mãe.

Comparação com VLIW e RISC

A tendência de design para processadores altamente microcodificados com instruções complexas começou no início dos anos 1960 e continuou até meados dos anos 1980. Nesse ponto, a filosofia de design RISC começou a se tornar mais proeminente.

Uma CPU que usa microcódigo geralmente leva vários ciclos de clock para executar uma única instrução, um ciclo de clock para cada etapa do microprograma dessa instrução. Alguns processadores CISC incluem instruções que podem levar muito tempo para serem executadas. Essas variações interferem na latência de interrupção e, o que é muito mais importante nos sistemas modernos, no pipelining .

Ao projetar um novo processador, um RISC de controle com fio tem as seguintes vantagens sobre o CISC microcodificado:

  • A programação se afastou em grande parte do nível de montagem, portanto, não vale mais a pena fornecer instruções complexas por motivos de produtividade.
  • Conjuntos de instruções mais simples permitem a execução direta por hardware, evitando a penalidade de desempenho da execução microcodificada.
  • A análise mostra que instruções complexas raramente são usadas, portanto, os recursos da máquina dedicados a elas são amplamente desperdiçados.
  • Os recursos da máquina dedicados a instruções complexas raramente usadas são melhor usados ​​para agilizar o desempenho de instruções mais simples e comumente usadas.
  • Instruções complexas microcodificadas podem exigir muitos ciclos de clock que variam e são difíceis de pipeline para melhor desempenho.

Também existem contrapontos:

  • As instruções complexas em implementações altamente microcodificadas podem não consumir muitos recursos extras da máquina, exceto para o espaço do microcódigo. Por exemplo, a mesma ALU é freqüentemente usada para calcular um endereço efetivo, bem como calcular o resultado dos operandos reais (por exemplo, o Z80 original , 8086 e outros).
  • As instruções não RISC mais simples (ou seja, envolvendo operandos de memória direta ) são freqüentemente usadas por compiladores modernos. Mesmo operações aritméticas imediatas para empilhar (ou seja, resultado de memória) são comumente empregadas. Embora essas operações de memória, muitas vezes com codificações de comprimento variável, sejam mais difíceis de canalizar, ainda é totalmente viável fazê-lo - claramente exemplificado pelo i486 , AMD K5 , Cyrix 6x86 , Motorola 68040 , etc.
  • Instruções não RISC inerentemente executam mais trabalho por instrução (em média) e também são normalmente altamente codificadas, portanto, permitem um tamanho geral menor do mesmo programa e, portanto, melhor uso de memórias cache limitadas.

Muitos processadores RISC e VLIW são projetados para executar todas as instruções (desde que estejam no cache) em um único ciclo. Isso é muito semelhante à maneira como as CPUs com microcódigo executam uma microinstrução por ciclo. Os processadores VLIW têm instruções que se comportam de forma semelhante a um microcódigo horizontal muito amplo, embora normalmente sem o controle refinado sobre o hardware fornecido pelo microcódigo. As instruções RISC às vezes são semelhantes ao microcódigo vertical estreito.

A microcodificação tem sido popular em processadores específicos de aplicativos, como processadores de rede , microcontroladores , processadores de sinal digital , controladores de canal , controladores de disco , controladores de interface de rede , unidades de processamento gráfico e em outro hardware.

Micro Ops

Implementações modernos CISC, tais como o x86 família, instruções para descodificar tamponadas dinamicamente micro-operações ( "μops") com uma instrução que codifica semelhante ao RISC ou microcódigo tradicional. Uma unidade de decodificação de instrução com fio emite diretamente μops para instruções x86 comuns, mas recorre a uma ROM de microcódigo mais tradicional para instruções mais complexas ou raramente usadas.

Por exemplo, um x86 pode procurar μops do microcódigo para lidar com operações complexas de várias etapas, como instruções de loop ou string, funções transcendentais de unidade de ponto flutuante ou valores incomuns, como números denormais , e instruções para fins especiais, como CPUID .

Veja também

Notas

Referências

Leitura adicional

links externos