5. O somador do processador do CES

Este somador ( SM ) produz um resultado de 16 bits e um bit de "vai um". Ele emprega duas entradas também de 16 bits e uma entrada de "vem um".

O valor produzido como resultado pelo SM é usado como entrada pelo RP e pelo RD e tamém é enviado para uma das entradas do ME enquanto que o bit de "vai um" produzido pelo SM vai para a entrada de RC.

A entrada esquerda do SM recebe a saída do MD, a entrada direita recebe a saída do CD e a entrada de "vem um" recebe um sinal de controle denominado Mais1. Portanto, o valor produzido pelo somador depende:
- do valor presente na sua entrada esquerda, que é fornecido pelo MD, que por sua vez é controlado pelo sinal UltC;
- do valor presente na sua entrada direita, que é fornecido pelo CD, que por sua vez é controlado pelo sinal Zcomp;
- do valor presente na entrada de "vem um" que corresponde ao estado do sinal de controle Mais1.

A tabela apresentada a seguir mostra o resultado produzido pelo somador em cada uma das possíveis combinações dos estados dos sinais de controle UltC, Zcomp e Mais1.

UltC Zcomp Mais1 Resultado produzido pelo SM Situações nas quais é usado
Inativo Inativo InativoRP+RT\ = RP-RT-1---
AtivoRP+RT\+1 = RP-RT---
Ativo InativoRP---
AtivoRP+1 Primeiro ciclo de todas as instruções,
exceto se a instrução for T e o valor armazenado em RC for zero
Ativo Inativo InativoRD+RT\ = RD-RT-1---
AtivoRD+RT\+1 = RD-RTSegundo ciclo da instrução S
Ativo InativoRD Segundo ciclo da instrução L,
Único ciclo da instrução T, se o valor armazenado em RC for zero
AtivoRD+1---

O SM poderia ser implementado empregando 16 somadores completos ( "full adders" ). Cada somador completo pode ser implementado empregando duas portas do tipo ou exclusivo de duas entradas e três portas do tipo "NAND" de duas entradas. Como cada porta do tipo ou exclusivo de duas entradas pode ser implementada usando dez transistores e cada porta do tipo "NAND" de duas entradas pode ser implementada usano quatro transistores, esta implementação do SM empregaria 16 x ( 2 x 10 + 3 x 4 ) = 16 x 32 = 512 transistores. Essa implementação apresentaria, porém, um sério problema: O caminho crítico dessa rede lógica combinatória é aquele que vai da entrada de "vem um" para a saída de "vai um" e esse caminho crítico compreende uma série formada por 32 portas "NAND" de duas entradas. Ou seja, essa implementação do SM resultaria em um componente que seria bem lento.

Para evitar essa lentidão seria necessário empregar um somador que usasse um esquema de previsão de vai um. Nesse caso, os somadores completos devem ser substituídos por elementos somadores ( ES ) de um bit que ao invés de produzir um sinal de saída de "vai um" produzem um sinal de saída denominado "Gera vai um" ( G ) e também um sinal de saída denominado "Propaga vai um" ( P ).

O sinal G indica que as duas entradas principais do ES estão com valor um e portanto este ES gera um "vai um".

O sinal de saída P indica que pelo menos uma das entradas principais do ES está com valor um e portanto se esse ES receber um "vem um" esse "vem um" deve ser propagado para o próximo ES.

Os sinais G e P produzidos por todos os ES são usados como entrada pelo preditor de "vai um". Esse preditor de "vai um" usa esses sinais G e P para gerar os sinais de "vem um" que serão usados por todos os ES.

A figura 5. mostra um somador completo e o compara com o elemento somador de um bit que gera os sinais G e P. Observe que uma das portas "ou exclusivo" do somador completo é eliminada no ES.


Figura 5. Comparação entre um Somador Completo e um Elemento Somador de um bit com saídas G e P

O preditor de vai um gera os sinais de "vem um" que serão usados por cada um dos ES empregando a seguinte idéia: Um ES deve receber um "vem um" se acontecer pelo menos uma das seguintes situações:
- pelo menos um dos ES situados antes do ES que vai receber o "vem um" produzir sinal G ativo indicando que gera um "vai um" e todo os ES situados entre o ES que gerou o "vai um" e o ES que vai receber o "vem um" produzirem sinal P ativo indicando que podem propagar este "vem um" até o ES que vai receber o "vem um".
- o sinal de "vem um" recebido pelo somador todo estiver ativo e todos os ES que estiverem antes do ES que vai receber o "vem um" produzirem sinal P ativo indicando que podem propagar este "vem um" do somador todo até o ES que vai receber o "vem um";

Desta forma, o "vem um" do n-ésimo ES pode ser obtido através de um somatório lógico de n produtos lógicos:
- Cada um dos n-1 primeiros produtos tem como primeiro fator o sinal G produzido por um dos ES que tem número de ordem menor que n e como demais fatores os sinais P produzidos por todos os ES que tem número de ordem menor que n e maior que o número de ordem do ES que produziu o sinal G usado como primeiro fator;
- O último desses produtos envolve n fatores, sendo que o primeiro destes fatores é o "vem um" recebido pelo somador todo e os outros n-1 fatores correspondem aos sinais P produzidos por todos os ES cujos números de ordem sejam menores que n;

A tabela apresentada a seguir mostra as expressões lógicas que devem ser usadas por um preditor de "vai um" para produzir os sinais de "vem um" para os quatro ES que formam um somador de quatro bits.

Número do ES que recebe o "Vem um" Nome do sinal de "vem um" Expressão Lógica Implementação da Expressão Lógica
1VemUm0 VemUmVemUm0\ = NOT ( VemUm )
2VemUm1 G0 | ( VemUm & P0 )VemUm1\ = NOR2 ( G0, NOR2 ( VemUm\, P0\ ) )
2VemUm2 G1 | ( G0 & P1 ) |
( VemUm & P0 & P1 )
VemUm2\ = NOR3 (G1, NOR2 ( G0\, P1\ ),
NOR3 ( VemUm\, P0\, P1\ ) )
3VemUm3 G2 | ( G1 & P2 ) |
( G0 & P1 & P2 ) |
( VemUm & P0 & P1 & P2 )
VemUm3\ = NOR4 ( G2, NOR2 ( G1\, P2\ ),
NOR3 ( G0\, P1\, P2\ ),
NOR4* ( VemUm\, P0\, P1\, P2\ ) )
-VaiUm G3 | ( G2 & P3 ) |
( G1 & P2 & P3 ) |
( G0 & P1 & P2 & P3 ) |
( VemUm & P0 & P1 & P2 & P3 )
VaiUm = NAND2 (NOR4 (G3, NOR2 ( G2\, P3\ ),
NOR3 ( G1\, P2\, P3\ ),
NOR4 ( G0\, P1\, P2\, P3\ ) ),
NAND2 (NOT ( P3\ ),
NOR4* ( VemUm\, P0\, P1\, P2\ ) ) )
* O sinal produzido por essa porta é usado em duas expressões

A figura 6. mostra o esquema lógico do preditor de "vai um" construído a partir das expressões lógicas mostradas nesta tabela.


Figura 6. Preditor de "vai um" para um somador de 4 bits

É importante observar que o emprego de preditores de "vai um" permite implementar somadores de qualquer tamanho nos quais o caminho crítico é limitado em apenas quatro portas lógicas: um "NOR" de duas entradas, dois "NOR" de n entradas, onde n é o número de bits do somador e um "XOR" de duas entradas. Prém, no caso de somadores maiores, o emprego direto desse esquema de predição de "vai um" é limitado pela necessidade do uso de portas com um grande número de entradas, que só podem ser efetivamente implementadas em dois níveis: Em um somador de 16 bits seria necessário empregar portas de até 16 entradas no caminho crítico e as tecnologias CMOS usualmente só permitem implementar diretamente portas lógicas de até quatro entradas. Desta forma, as portas de 16 entradas precisam ser implementadas como duas portas de quatro entradas encadeadas e portanto o caminho crítico passa a ser efetivamente composto por seis portas lógicas: uma porta lógica de duas entradas, quatro portas lógicas de quatro entradas e um "XOR" de duas entradas.

Outro problema associado ao emprego direto do mecanismo de predição de "vai um" está relacionado ao número de transistores necessários para implementar as portas lógicas que compõe o preditor, porque esse número de transistores é proporcional ao cubo do número de bits do somador. Como em um somador de 16 bits muitas dessas portas teriam que ser efetivamente implementadas em dois níveis, é possível reaproveitar os sinais gerados por algumas delas diminuindo um pouco o número total de transistores, mas essa diminuição acaba não sendo muito significativa.

Por essa razão, em um somador de 16 bits o preditor completo de "vai um" implementado diretamente resultaria em uma rede que de portas lógicas que empregaria um número muito grande de transistores. Desta forma, é conveniente procurar uma solução de compromisso, que pode ser obtida empregando um somador com preditor de "vai um" implementado em dois níveis: O somador de 16 bits é dividido em quatro somadores de quatro bits com preditores de "vai um" modificados para produzirem saídas de geração e propagação de "vai um". A figura 7 apresenta um esquema que poderia ser usado para implementar esse preditor de "vai um" para um somador de quatro bits modificado para gerar os sinais P e G.


Figura 7. Preditor de "vai um" para somador de 4 bits modificado para gerar os sinais G e P

Empregando um destes preditores de "vai um" modificado em cada um dos quatro somadores de quatro bits, cada um desses quatro somadores de quatro bits receberá como entrada dois grupos de quatro bits correspondentes das duas parcelas e um "vem um". O preditor de "vai um" modificado correspondente a cada um destes quatro somadores produz os sinais de "vem um" para cada um dos quatro ES que formam o somador de quatro bits e também os sinais G e P do grupo de quatro bits. Para obter os sinais de "vem um" para cada um dos quatro somadores de quatro bits é suficiente ligar os sinais G e P produzidos pelos quatro preditores de "vai um" modificados às entradas de um preditor de "vai um" original para quatro algarismos. A figura 8. mostra este esquema de interligação.


Figura 8. Somador de 16 bits com preditor de "vai um" de dois níveis, implementado usando 16 elementos somadores de um bit, quatro preditores de "vai um" para somadores de quatro bits modificados para gerar os sinais P e G e um preditor de "vai um" para um somador de quatro algarismos

Desta forma, o somador de 16 bits pode ser construído empregando 16 elementos somadores de um bit, 4 preditores de "vai um" para somadores de quatro bits modificados para gerar os sinais P e G e um preditor de "vai um" para somadores de quatro algarismos. Como cada ES pode ser implementado usando 24 transistores, cada preditor de "vai um" modificado pode ser implementado empregando 88 transistores e o preditor de vai um para somadores de quatro algarismos pode ser implementado usando 92 transistores, o somador de 16 bits pode ser implementado empregando 16 x 24 + 4 x 88 + 86 = 822 transistores.

Usando esse esquema de previsão de "vai um" em dois níveis, o caminho crítico do somador de 16 bits passará a ter oito portas lógicas: Um "NOR" de duas entradas, seis "NOR" de quatro entradas ( duas para gerar os sinal G no preditor do primeiro somador de quatro bits, duas no preditor do segundo nível e mais duas no preditor do último somador de quatro bits ) e um "XOR" de duas entradas, o que significa um aumento efetivo de dois "NOR" de quatro entradas em relação ao caminho crítico da solução que emprega apenas um nível no preditor de "vai um". Esse aumento do número de portas no caminho crítico deve causar um aumento de menos de um terço no tempo necessário para que o somador complete sua operação.

Por outro lado, a solução que emprega um preditor de "vai um" com dois níveis usa um número de transistores substancialmente menor que a solução que emprega um preditor de "vai um" em apenas um nível: Na solução com dois níveis são necessários apenas cerca de 5/64 ( cerca de 7.8% ) dos transistores que seriam necessários na implementação direta da solução com apenas um nível.

Também é interessante comparar a solução que emprega um preditor de "vai um" em dois níveis com a solução que não empega nenhum preditor de "vai um". Como na solução que não emprega previsão de "vai um" o caminho crítico incluía 32 portas "NAND" de duas entradas e a na solução que emprega o preditor de "vai um" em dois níveis esse caminho crítico é formado por apenas 8 portas lógicas, sendo que uma dessas portas é um "NAND" de duas entradas, outra é um "XOR" de duas entradas e as outras seis remanescentes são "NOR" de quatro entradas. Considerando que portas "XOR" e portas de quatro entradas são mais lentas que portas "NAND" de duas entradas, deve-se esperar que o somador com preditor de "vai um" seja cerca de 3 vezes mais rápido que o somador que não emprega previsão de "vai um". Por outro lado, o somador que não usa preditor de "vai um" pode ser implementado empregando 512 transistores enquanto que o somador que emprega o preditor de "vai um" com dois níveis pode ser implementado usando 822 transistores, ou seja, o uso do preditor de vai um causa um aumento de cerca de 60% no número de transistores necessários para implementar o somador.