Pré-visualização parcial do texto
Baixe Tanenbaum Cap4 - PROCESSADORES e outras Notas de estudo em PDF para Engenharia Elétrica, somente na Docsity!
4 O NÍVEL DE MICROPROGRAMAÇÃO O limite entre hardware e software não é bem definido e, além disso, está constantemente se alterando. Os primeiros computadores tinham instruções para operações aritméticas, booleanas, deslocamentos, comparações, loops, entre outras, que eram executadas diretamente pelo hardware. Para cada instrução, um circuito específico de hardware estava presente para executá-la. Poder-se-ia, pelo menos em princípio, desparafusar o painel traseiro e apontar os componentes eletrônicos usados pela instrução de divisão. Num computador multinível moderno, não é mais possível isolar os circuitos de divisão, porque não existem circuitos de divisão. Todas as instruções disponíveis no nível de máquina convencional (por exemplo, instruções aritméticas, booleanas, deslocamentos, comparações e loops) são executadas passo a passo por um interpretador executado no nível de microprogramação. O equivalente atual de olhar para os circuitos de divisão é obter uma listagem do microprograma e procurar pela parte que interpreta as instruções de divisão. Embora programas em qualquer nível possam ser executados por um software interpretador, e embora este interpretador possa, também, ser executado por outro interpretador, essa hierarquia não pode prosseguir indefinidamente. No nível mais baixo, deve existir fisicamente uma máquina em hardware, com circuitos integrados, fontes de alimentação e objetos “sólidos” similares. Estes itens foram o tema do capítulo anterior. Neste capítulo, iremos estudar como os componentes eletrônicos são controlados pelo microprograma e como o microprograma interpreta o nível de máquina convencional. No capítulo 8, estudaremos uma classe de máquinas que não são micropro- gramadas (máquinas RISC). Como a arquitetura do nível de microprogramação, chamada de microarquitetura, é definida pelo hardware, ela é normalmente primitiva e difícil de programar. As considerações de tempo são, por exemplo, frequentemente importantes. Estas considerações levaram Rosin (1974) a definir microprogramação como “a implementação de sistemas esperançosamente razoáveis através da interpretação em máquinas não-razoáveis”. O nível de microprogramação tem uma função específica: executar interpretadores para outras máquinas virtuais (esperançosamente mais razoáveis). Esta meta de projeto leva naturalmente a uma organização altamente otimizada no sentido de buscar, examinar e executar instruções de máquina convencional e, em alguns casos, instruções mais sofisticadas. Os problemas e compro- missos envolvidos na organização e projeto deste nível serão examinados neste capítulo. Começaremos nosso estudo do nível de microprogramação revendo brevemente os blocos construtores básicos discutidos no capítulo 3, porque eles são parte da arquitetura do nível de microprogramação, e portanto de interesse para o microprogramador. (Um “microprogramador” é alguém que escreve microprogramas, e não um programador pequeno.) A seguir, chegamos ao âmago da questão: como instruções mais complexas podem ser construídas a partir de sequências de instruções primitivas. Este tópico será discutido em detalhes e ilustrado por um extenso exemplo. Posteriormente, examinaremos os vários fatores que devem ser considerados ao se projetar o nível de microprogramação de um computador, para melhor compreender por que ele é do jeito que é. Olharemos também para as maneiras de melhorar o desempenho do computador. Final- 128 mente, examinaremos o nível de microprogramação de nossos dois exemplos correntes, as famílias Intel e Motorola. 4.1 REVISÃO DO NÍVEL DE LÓGICA DIGITAL O trabalho do microprogramador é escrever um programa para controlar os registradores da máquina, seus barramentos, ALUs, memórias e outros componentes de hardware. Nós estuda- mos esses dispositivos no capítulo anterior; agora iremos apenas revisá-los brevemente para colo- cá-los em perspectiva. Após a revisão, também falaremos um pouco dos diferentes modos concei- tuais de encapsulamento dos componentes. 4.1.1 Registradores Um registrador é um dispositivo capaz de armazenar informações. O nível de micropro- gramação sempre tem alguns registradores disponíveis para conter as informações necessárias para o processamento da instrução que está sendo correntemente interpretada. Conceitualmente, os registradores são o mesmo que memória principal, a diferença é que os registradores estão fisicamente localizados dentro do próprio processador, de modo que eles podem ser lidos e escritos mais rapidamente do que palavras na memória principal, que usualmente estão em pastilhas isoladas. Máquinas maiores e mais caras normalmente possuem mais registradores do que as menores e mais baratas, que precisam usar a memória principal para armazenar resultados interme- diários. Em alguns computadores, um grupo de registradores, numerados 0, 1, 2, ..., n-1, é disponível ao nível de microprogramação, e é chamado armazenamento local ou memória de rascunho. Um registrador pode ser caracterizado por um único número: quantos bits ele pode armazenar. A Fig. 4.1 mostra um registrador de 16 bits com a convenção de numeração de bits utilizada neste livro. A informação colocada num registrador permanece lá até que outra informação a substitua. O processo de ler a informação de um registrador não afeta o conteúdo do mesmo. Em outras palavras, quando um registrador é lido, uma cópia de seu conteúdo é feita e o original é deixado intacto no registrador. 4.1.2 Barramentos Um barramento é uma coleção de fios usados para transmitir sinais em paralelo. Tipicamente, os barramentos são usados para permitir que o conteúdo de um registrador possa ser copiado. para outro. Diferente dos barramentos de sistema que estudamos no capítulo 3, esses barramentos apenas conectam dois dispositivos e, portanto, não há necessidade de linhas de endereço e linhas de controle extensivo. As n linhas de dados e uma ou duas linhas de controle geralmente são suficientes. Barramentos são usados porque a transferência paralela de todos os bits de uma vez é muito mais rápida do que a transferência serial bit a bit. Um barramento pode ser unidirecional ou bidirecional. Um barramento unidirecional só pode transferir dados em um sentido, enquanto que um barramento bidirecional pode transferir dados nos dois sentidos, mas não em ambos simultaneamente. Barramentos unidirecionais são tipicamente utilizados para conectar dois registradores, um dos quais é sempre a origem e o outro é sempre o destino. Barramentos bidirecionais são tipicamente utilizados quando qualquer um de um conjunto de registradores pode ser a origem c qualquer outro pode ser o destino. Muitos dispositivos são capazes de se conectarem e de se desconectarem eletricamente dos barramentos aos quais estão fisicamente ligados. Estas conexões podem ser feitas ou desfeitas em nanossegundos. Um barramento cujos dispositivos possuem essa propriedade é chamado de Númerodobit 1514131211109 87 6543210 ojolojo/17/1/0j0|1/0/1/1]0/0|1/0 Fig. 4.1 Um registrador de 16 bits pode conter 16 bits de informação. 129 Quando CK está desativado, o conteúdo do registrador não é afetado pelos sinais do barra- mento. Quando CK é ativado, o registrador é carregado a partir do barramento de entrada. Quando OE é desativado, o registrador é desconectado do barramento de saída e efetivamente deixa de existir em relação aos outros registradores do barramento. Quando OE é ativado, o conteúdo do registrador é colocado no barramento de saída. Se outro registrador, R, tiver sua entrada conectada ao barramento de saída deste registrador, é possível transferir informação deste registrador para R. Para fazê-lo, OE deve ser ativado e mantido ativo por tempo suficiente para que a saída do barramento se torne estável. Então, a linha CK do registrador R deve ser ativada, carregando R a partir do barramento. A operação de habilitar a saída de um registrador em um barramento para que outro registrador possa obter o seu valor ocorre frequentemente no nível de microprogramação, como veremos em breve. Como um segundo exemplo de registradores e barramentos, a Fig. 4.2(b) mostra um registrador de 16 bits com dois barramentos de saída, cada um controlado por um sinal OE diferente. 4.1.3 Multiplexadores e Decodificadores Os circuitos que possuem uma ou mais linhas de entrada e calculam um ou mais valores de saída que são determinados unicamente pelas entradas atuais são chamados circuitos combina- tórios. Dois dos mais importantes são os multiplexadores c os decodificadores. Um multiplexador tem 2” entradas de dados (linhas individuais ou barramentos), uma saída de dados da mesma largura que as entradas e uma entrada de controle de n bits que seleciona uma das entradas e a direciona para a saída. A Fig. 4.3(a) mostra um multiplexador com dois barramentos como entrada. O sinal de controle de 1 bit seleciona A ou B como saída. A Fig. 3.12 mostra o circuito para um multiplexador de oito entradas. O inverso de um multiplexador é um demultiplexador, que direciona sua entrada única para uma de suas 2” saídas, dependendo do valor dc suas n linhas de controle. Outro importante circuito combinatório é o decodificador, que possui n linhas de entrada e 2” linhas de saída, numeradas de O a 2” — 1. Se o número binário nas linhas de entrada é k, então a linha de saída k será 1 e todas as outras linhas de saída serão 0. Um decodificador sempre tem exatamente uma linha de saída em 1, com as restantes em 0. A Fig. 4.3(b) ilustra simbolicamente um decodificador de 4-para-16; a Fig. 3.14 mostra o circuito para um decodificador 3-para-8. . O inverso de um decodificador é um codificador, que possui 2” entradas e n saídas. Somente uma linha de entrada pode estar em 1, e seu número, em binário, aparece na saída. Entrada A B Entrada Controle — Multiplexador 2-para-1 Decodificador 4-para-16 | Saída Saída (a) tb) Fig. 4.3 (a) Um multiplexador 2-para-1. (b) Um decodificador 4-para-16 131 4.1.4 ALUs e Deslocadores “Todo computador precisa, de alguma maneira, realizar operações aritméticas. O circuito mais simples é apenas um somador, que pega duas entradas de n bits e produz sua soma como saída. Um circuito aritmético mais geral é a ALU (Arithmetic Logical Unit), ou Unidade Lógica e Aritmética. Ela também possui duas entradas de dados e uma saída de dados, mas também possui algumas entradas e saídas de controle. A ALU da Fig. 4.4(a) tem dois bits de função, F, e F,, que determinam qual a função que a ALU deve realizar. A ALU que usaremos em nosso exemplo pode calcular 4 + B, A AND B, 4 e também 4. As duas primeiras funções são auto-explicativas; a terceira simplesmente copia A para a saída; a quarta produz o inverso de 4. A terceira função pode parecer inútil, mas veremos mais tarde para que ela é usada. A Fig. 3.20 mostra uma ALU de quatro funções que opera em um bit de dado. Repetindo este circuito n vezes e alimentando o vai-i do bit i para o bit i + 1, podemos fazer um ALU de n bits que calcula AND, OR, NOT e adição. Uma ALU pode também ter saídas de controle. Saídas típicas são linhas que estão em 1 quando a saída da ALU é negativa, quando é zero, quando existe um vai-l do bit de mais alta ordem, ou quando ocorreu overflow. O exemplo da Fig. 4.4(a) tem duas saídas de controle: N, que indica que a saída da ALU é negativa, e Z, que indica que a saída da ALU é zero. O bit N é apenas uma cópia do bit de mais alta ordem da saída. O bit Z é o NOR de todos os bits de saída da ALU. Embora algumas ALUs possam também realizar operações de deslocamento, na maioria das vezes é necessário ter uma unidade de deslocamento separada. Este circuito pode deslocar uma entrada multibit de 1 bit para a esquerda ou direita, ou, ainda, não realizar nenhum desloca- mento. A Fig. 4.4(b) é o símbolo que usaremos para um deslocador; um circuito deslocador pode ser encontrado na Fig. 3.17. 4.1.5 Relógios (Clocks) Os circuitos de computadores são normalmente acionados por um relógio, um dispositivo que emite uma sequência periódica de pulsos. Estes pulsos definem os ciclos de máquina. Durante cada ciclo de máquina, ocorre alguma atividade básica, tal como a execução de uma microinstrução. É frequentemente útil dividir o ciclo em subciclos, de modo que diferentes partes da microinstrução possam ser realizadas em uma ordem bem definida. Por exemplo, as entradas para a ALU devem ser colocadas disponíveis e se tornarem estáveis antes que a saída possa ser armazenada. A Fig. 4.5(a) mostra um relógio simbólico com quatro saídas. A de cima é a saída primária; as outras três são derivadas dela pela inserção de diversos atrasos nas linhas de saída. O relógio primário mostrado na Fig. 4.5(b) (linha superior) tem uma largura de pulso igual a um quarto do período do ciclo. As outras três saídas são obtidas por atraso de uma, duas e três vezes Fo N Ss, > E Doslocador HA, B) (a) tb) Fig. 4.4 (a) Uma ALU. (b) Um deslocador. 132 CPU Barramento - Barramento Endereço de endereço MAR E Controle ———— Barramento "Saída de dados . | Entrada de dados MBR = Controle — Sinal RD Sinal WR Fig. 4.6 Os registradores usados para acionar os barramentos de endereço e dados. 4.1.7 Encapsulamento de Componentes Nas seções anteriores revimos vários circuitos que podem ser combinados para formar um computador. Estes circuitos são comercialmente disponíveis em várias formas conceitualmente diferentes. A maneira mais direta é em encapsulamento MSI (Medium Scale Integration, ou integra- ção em média escala), com cada pastilha contendo um componente: por exemplo, um registrador, uma ALU ou um deslocador. Esta abordagem é ilustrada na Fig. 4.7(a). Os componentes são, então, interligados para formar o computador. Como existe uma grande variedade de pastilhas MSI de alta velocidade e de baixo custo disponíveis, muitos computadores foram construídos desse modo. O principal inconveniente de construir um computador a partir de componentes MSI é o grande número de pastilhas necessárias que ocupam muitas placas, consomem muita energia e dissipam uma quantidade de calor significativa. Outra técnica é utilizar pastilhas bit-slice. Cada pastilha bit-slice tem, por exemplo, 1 bit para os registradores, ALU e outros componentes. A Fig. 3.20 mostra como uma ALU bit-slice de 1 bit é por dentro. Poderíamos facilmente estender esse projeto para adicionar, por exemplo, 16 registradores de 1 bit, um deslocador de 1 bit e outros componentes com largura de 1 bit. Pegando, digamos, 32 pastilhas desse tipo e colocando-as lado a lado, obtemos uma máquina com 16 registradores de 32 bits, uma ALU de 32 bits, um deslocador de 32 bits, e assim por diante. Alternativamente, com apenas 16 pastilhas poderíamos construir uma máquina de 16 bits. A técnica de bit-slice fornece ao projetista a capacidade de compor facilmente uma máquina com qualquer largura de palavra. São amplamente disponíveis pastilhas hit-slice de 2 ou mesmo 4 bits. A Fig. 4.7(b) mostra uma máquina de 8 bits construída a partir de quatro unidades bir-slice de 2 bits. Em geral, a abordagem bit-slice requer menos pastilhas e muito menos tempo de projeto que a abordagem MSI, mas usualmente produz máquinas mais lentas. Uma terceira técnica para combinar os componentes é colocar um processador completo em uma única pastilha [veja a Fig. 4.7(c)]. Enquanto isto obviamente reduz drasticamente o número de pastilhas (para uma pastilha), também tem algumas desvantagens. Para começar, a tecnologia necessária para encapsular grande número de componentes em uma pastilha é diferente da utilizada para pastilhas MSI ou bit-slice e normalmente produz máquinas mais lentas. Além disso, as tecnologias tanto de projeto quanto de fabricação são excessivamente complicadas e caras. Ao contrário, qualquer engenheiro eletrônico competente pode projetar um computador simples usando pastilhas MSI ou bit-slice sem muitos problemas. Do ponto de vista de um fabricante de computador que espera construir computadores por vários anos, provavelmente vale a pena dominar as tecnologias necessárias para a fabricação de processadores em uma única pastilha; para uma companhia que precisa apenas de uma máquina de uso específico, provavelmente não. 134 Registradores ED) [O I ] E ] E E É Es Deslocador AAA rá x ER VA ANNAN ta) tb) (c) E BÉDEa COR E Fig. 4.7 Três formas de construir um computador. (a) Pastilhas MSI. (b) Bit-slice. (c) Pastilhas LSI. Surgem as opções: usar um processador disponível comercialmente, contratar alguém para projetar e fabricar uma pastilha de uso específico, ou construí-la a partir de componentes MSI ou bit-slice. 4.2 UM EXEMPLO DE MICROARQUITETURA Agora que já revisamos todos os componentes básicos com os quais se constrói o nível de microprogramação, é o momento de vermos como eles são conectados. Como, nesta área, os princípios gerais são poucos e dispersos, introduziremos o assunto através de um exemplo detalhado. 4.2.1 As Vias de Dados As vias de dados de nossa microarquitetura exemplo estão mostradas na Fig. 4.8. (As vias de dados correspondem àquela parte da CPU que contém a ALU, suas entradas c suas saídas.) Elas possuem 16 registradores idênticos de 16 bits, denominados PC, AC, SP, e assim por diante, que formam uma memória de rascunho acessível apenas ao nível de microprogramação. Os registra- dores rotulados 0, +1 e —1 serão usados para armazenar as constantes indicadas; o significado dos nomes dos outros registradores será explicado mais tarde. (Na realidade, O não foi utilizado em nossos exemplos simples, mas provavelmente o seria em uma máquina mais complicada; de qualquer forma, foi incluído porque temos mais registradores do que podemos usar.) Cada registrador pode dar saída de seu conteúdo em um ou nos dois barramentos internos, o barramento A e o barramento B, e cada um pode ser carregado a partir de um terceiro barramento interno, o barramento €C, como mostra a figura. Os barramentos A e B alimentam uma ALU de largura de 16 bits, que pode realizar quatro funções: A + B, À AND B, Ae NOTA. A função a ser executada é especificada pelas duas linhas de controle da ALU, F,e F,. A ALU gera dois bits de status, com base na saída corrente 135 da ALU: N, que é ligado quando a saída da ALU é negativa, e Z, que é ligado quando a saída da ALU é zero. A saída da ALU entra em um deslocador, que pode deslocá-la de 1 bit em qualquer direção, ou nenhuma. É possível executar um deslocamento de 2 bits à esquerda do conteúdo de um registrador, R, calculando R + R na ALU (que é um deslocamento de 1 bit para a esquerda) e então deslocando a soma de outro bit à esquerda utilizando o deslocador. Nem o barramento A, nem o barramento B, alimenta a ALU diretamente. Em vez disso, cada um alimenta um latch (isto é, um registrador) que, por sua vez, alimenta a ALU. Os latches são necessários porque a ALU é um circuito combinatório -— ela calcula continuamente a saída a partir das entradas correntes e do código de função. Esta organização pode causar problemas ao calcular, por exemplo, A := A + B. Como A está sendo armazenado, o valor nao barramento A começa a se modificar, fazendo com que a saída da ALU, e portanto também o barramento C, se modifiquem. Consequentemente, um valor errado pode ser armazenado em A. Em outras palavras, na atribuição A := A + B,o A do lado direito é o valor original de A, e não alguma mistura bit a bit dos valores velho e novo. Inserindo latches nos barramentos A e B, podemos congelar lá os valores originais de A e B no início do ciclo, de modo que a ALU fica protegida de mudanças nos barramentos enquanto um novo valor está sendo armazenado na memória de rascunho (scratchpad). A carga dos latches é controlada por Lo e L,. Vale a pena notar que nossa solução para este problema (isto é, a inserção de latches na frente da ALU) não é a única. Se todos os registradores fossem flip-flops em vez de latches, então um projeto de dois barramentos seria também possível, carregando os operandos nos barra- mentos A e B no início do ciclo e lendo o resultado de um dos barramentos mais tarde, no ciclo. Os compromissos entre os projetos de dois e três barramentos envolvem complexidade, paralelismo e quantidade de ligações. Um tratamento mais detalhado dessas considerações está fora do escopo deste livro. Para a comunicação com a memória, incluímos um MAR e um MBR na microarquitetura. O MAR pode ser carregado a partir do latch B, em paralelo com a operação da ALU. A linha Ma controla a carga do MAR. Nas escritas, o MBR pode ser carregado com a saída do deslocador, em paralelo, ou no lugar de uma escrita na memória dc rascunho. M, controla a carga de MBR a partir da saída do deslocador. M, e M; controlam leituras e escritas da memória. Nas leituras, o dado lido da memória pode chegar à entrada esquerda da ALU através do multiplexador A, indicado por Amux na Fig. 4.8. A linha de controle, Aç, determina se é o latch A ou o MBR que deve alimentar a ALU. A microarquitetura da Fig. 4.8 é similar a vários bit-slices disponíveis comercialmente. 4.2.2 Microinstruções Para controlar as vias de dados da Fig. 4.8, precisamos de 61 sinais. Estes podem ser divididos em nove grupos funcionais, como descrito abaixo. 16 sinais para controlar a carga do barramento A a partir da memória de rascunho 16 sinais para controlar a carga do barramento B a partir da memória de rascunho 16 sinais para controlar a carga da memória de rascunho a partir do barramento C sinais para controlar os latches A c B sinais para controlar a função da ALU sinais para controlar o deslocador sinais para controlar o MAR e o MBR sinais para indicar leitura da memória e escrita na memória sinal para controlar o Amux O ERNIV / Dados os valores dos 61 sinais, podemos realizar um ciclo nas vias de dados. Um ciclo consiste em colocar valores nos barramentos A e B, armazená-los nos dois laiches de barramento, passar os valores através da ALU e do deslocador e, finalmente, armazenar o resultado na memória de rascunho e/ou MBR. Além disso, o MAR pode também ser carregado, e um ciclo de memória iniciado. Como uma primeira aproximação, podemos ter um registrador de controle de 61 bits, com um bit para cada sinal de controle. Um bit em 1 significa que o sinal está ativado, e em 137 O significa que ele está desativado. Entretanto, pelo preço de um pequeno aumento na circuitaria, podemos reduzir considera- velmente o número de bits necessário para controlar as vias de dados. Para começar, temos - 16 bits para controlar a entrada do barramento A, o que permite 2!º combinações de registradores fonte. Apenas 16 dessas combinações são permitidas — ou seja, apenas um dos 16 registradores de cada vez. Portanto, podemos codificar a informação sobre o barramento A em 4 bits e usar um decodificador para gerar os 16 sinais de controle. O mesmo se aplica ao barramento B. A situação é ligeiramente diferente para o barramento C. Em princípio, são possíveis armazena- mentos simultâneos múltiplos na memória de rascunho, mas este aspecto virtualmente nunca é utilizado na prática, e a maioria das implementações não o provê. Assim, também codificaremos o controle do barramento C em 4 bits. Tendo economizado 3 x 12 = 36 bits, precisamos agora de 25 bits de controle para acionar as vias de dados. Ly e L, sempre são necessários em instantes bastante determinados, de forma que são supridos pelo relógio, deixando-nos com 23 bits de controle. Um sinal adicional que não é estritamente necessário, mas que é frequentemente útil, é um para habilitar/inibir o armazenamento do valor existente no barramento C na memória de rascunho. Em algumas situações, deseja-se meramente executar uma operação da ALU para gerar os sinais N e Z., mas não se quer armazenar o resultado. Com este bit extra, que denomi- naremos ENC (ENable C, ou habilita C), podemos indicar se o barramento C deve ser armazenado (ENC = 1) ou não (ENC = 0). Neste ponto, podemos controlar as vias de dados com um número de 24 bits. Notemos agora que RD e WR podem ser utilizados para controlar a carga de MBR a partir do barramento de dados do sistema e para habilitar a saída de MBR para o barramento de dados do sistema, respectivamente. Esta observação reduz o número de sinais de controle independentes de 24 para 22. O próximo passo no projeto da microarquitetura é inventar um formato de microinstrução contendo 22 bits. A Fig. 4.9 mostra um formato desse tipo, com dois campos adicionais, COND e ADDR, que serão descritos em breve. A microinstrução contém 13 campos, 11 dos quais são os seguintes: . Au 2x f AMUX — controla a entrada esquerda da ALU: O — latch A, 1 = MBR?* E ALU — função da ALU:0 = A +B,1=AANDB,2=A,3=A e: sH — função do deslocador: O = nenhum deslocamento, 1 = à direita, 2 = à esquerda MBR — carrega MBR a partir do deslocador: O = não carrega, 1 = carrega MBR$:25 (/ MAR | — carrega MAR a partir do latch B: O = não carrega, 1 = carrega MAR o RD — requisita leitura de memória: O = nenhuma leitura, 1 = carrega MBR a partir da memória S WR — requisita escrita na memória: O = nenhuma escrita, 1 = escreve o conteúdo de MBR na memória ENC — controla armazenamento na memória de rascunho: O = não armazena, 1 = arma- zena (e — seleciona registrador para armazenamento se ENC = 1:0 = PC,1 = AC, etc. B — seleciona fonte do barramento B: O = PC, 1 = AC, etc. A — seleciona fonte do barramento A: 0 = PC,1 = AC, etc. Bits 1 2 2 21141411 4 4 4 8 AjC MIM E MO Jacu sH|glalRMN| B A ADDR | u| N RIR|D|R x, P e a E) a Rs GE Lo AD O oa E AMUX COND ALU sH MBR, MAR, RD, WR, ENC 0 = latch A O = não desvie 0-=4-B O = não desloque 0 =não 1=MBR 1=desvieseN= 1 1=AANDB 1 = cesloque 1 bit à esq. 1=sim 2=desveseZ= 1 2=A 2 = desloque 1 bit à dir. 3 = desvie sempre 3-A 3 = (não usado) Fig. 4.9 O layout da microinstrução para controlar as vias de dados da Fig. 4.8. 138 16 Decodifi- cador c E" a] 4 ft Ho essa 1 8 | 4 16 Decodif ) cador A f 4 l A da SS | pda) bi e I [na Subeielos 1 I do relógio | -S l 16 regis- CE) túdores Incrementador KZ] MPC 7 E Memória de controle 256 x 32 MIR AIC Als |mlulay E tomo IS |BlalBla|N|c [8 | [apor UNju | rjp/PJRjc T Logica do micras- sequncia- mento Fig. 4.10 O diagrama de blocos completo da nossa microarquitetura exemplo. + 1, preparando a carga da próxima microinstrução da sequência durante o ciclo seguinte. Sobre- pondo estas duas operações, a execução de instrução pode ser acelerada. No terceiro subciclo, dá-se tempo à ALU e ao deslocador para a produção de resultados válidos. O campo AMUX da microinstrução determina a entrada esquerda da ALU; a entrada da direita é sempre o latch B. Embora a ALU seja um circuito combinatório, o tempo que ela gasta para calcular uma soma é determinado pelo tempo de propagação de vai-l, e não pelo atraso normal das portas. O tempo de propagação de vai-l é proporcional ao número de bits da palavra. Enquanto a ALU e o deslocador estão calculando, o MAR é carregado a partir do barramento B, se o campo MAR da microinstrução for 1. Durante o quarto e último subciclo, o valor existente no barramento C pode ser armazenado de volta na memória de rascunho e-no MBR, dependendo de ENC e MBR. O bloco rotulado “decodificador C” pega ENC, a quarta linha do relógio, e o campo C da microinstrução como entradas e gera os 16 sinais de controle. Internamente, ele realiza uma decodificação de 4-para-16 do campo C e então faz um AND de cada um destes sinais com um sinal derivado do AND da linha do subciclo 4 com ENC. Assim, um registrador da memória de rascunho somente é carregado se prevalecerem três condições: 140 1. ENC=1. 2. E o subciclo 4. 3. O registrador foi selecionado pelo campo C. O MBR também é carregado durante o subciclo 4 se MBR = 1. Os dois sinais que controlam a memória, RD e WR, são ativados se estiverem presentes em MIR. Na verdade, os campos correspondentes em MIR agem com laiches. 4.2.4 Seguúenciamento de Microinstruções A única consideração pendente é como a próxima microinstrução é escolhida. Embora algum tempo seja suficiente para buscar a próxima microinstrução da sequência, algum mecanismo é necessário para permitir desvios condicionais no microprograma, para possibilitar que ele tome decisões. Por esta razão, deixamos dois campos em cada microinstrução: ADDR, que é o endereço da sucessora potencial da microinstrução corrente, e COND, que determina se a próxima microins- trução será buscada de MPC + 1 ou de ADDR. Toda microinstrução contém potencialmente um desvio condicional. Esta decisão foi tomada porque desvios condicionais são muito comuns em microprogramas, e, ao permitir que toda microinstrução tenha duas sucessoras possíveis, tornamo-las de cxecução mais rápida do que a alternativa de estabelecer alguma condição em uma microinstrução e depois testá-la na próxima. A maioria das microarquiteturas existentes usam nossa estratégia de uma forma ou outra. A escolha da próxima microinstrução é determinada pelo bloco rotulado “Lógica de microsse- quenciamento” durante o subciclo 4, quando os sinais N e Z da saída da ALU são válidos. A saída deste bloco controla o multiplexador M (Mmux), que roteia MPC + 1 ou ADDR para MPC, de onde será buscada a próxima microinstrução. Fornecemos ao microprogramador quatro escolhas quanto à seleção da próxima microinstrução. A escolha é indicada fazendo o campo COND igual a: Não desvie; a próxima microinstrução será tomada de MPC + 1 Desvie para ADDR se N = 1 = Desvie para ADDR se Z = 1 Desvie para ADDR incondicionalmente wLNHO mo H A lógica de microssequenciamento combina os dois bits da ALU, N e Z, e os dois bits de COND, L (Left) e R (Right), isto é, esquerda e direita, para gerar uma saída. O sinal correto é Mmux = LRN + LRZ + LR = RN + LZ + LR onde + significa INCLUSIVE OR. Em palavras, o sinal de controle para Mmux é 1 (roteando ADDR para MPC) se LR é 01,e N = 1, ou LR é 10, e Z = 1, ou LR é 11,. Caso contrário, ele é 0, e a próxima microinstrução na sequência é buscada. O circuito para a geração do sinal Mmux pode ser construído a partir de componentes SSI, como na Fig. 3.3(b), ou ser parte de uma PLA, como na Fig. 3.16. Para tornar nossa máquina exemplo ligeiramente mais real, vamos assumir que um ciclo de memória principal tome mais tempo que uma microinstrução. Em particular, se uma microins- trução inicia uma leitura à memória principal, fazendo RD = 1, ela também deve ter RD = 1 na próxima microinstrução executada (que pode ou não estar localizada no próximo endereço da memória de controle). O dado torna-se disponível duas microinstruções após a leitura ter sido iniciada. Se o microprograma não tem nada mais útil a fazer na microinstrução seguinte à que iniciou a leitura de memória, a microinstrução simplesmente tem RD = 1 e é efetivamente desperdiçada. Do mesmo modo, uma escrita na memória também gasta dois tempos de microins- trução para completar. 141