Low-power 2/3: arquitetura

17zhswf3uasrj.jpg

(Um PDA da Nokia com acesso à internet, 1995. Fonte: gizmodo.com)

5 Abordagens low power no nível arquitetural

Penso que desenhar a arquitetura de um projeto é, para todos os efeitos, definir como cada módulo do sistema se comunica com os outros módulos para trabalharem em conjunto, e através de análises, seja pela experiência do projetista ou por resultados de modelos, elaborar a melhor forma de construí-los. Abaixo seguem algumas abordagens utilizadas na indústria para elaborar arquiteturas eficientes em consumo.

5.1 Redução dinâmica da tensão de alimentação e frequência (DVFS)

Apesar dos avanços, o problema entre o poder computacional disponível e o tempo de bateria ainda são os principais desafios da indústria. O seu smartphone aguenta 1 único de dia de uso pesado com navegação, músicas, redes sociais e sinal intermitente? O meu não.

Mas como disse, uso pesado. Quer dizer, o seu smartphone sabe quando mais e quando menos energia serão necessárias para aplicação, reduzindo ou aumentado a tensão e/ou a frequência fornecidas dinamicamente para os periféricos do microprocessador.

Os próprios microprocessadores em geral são especificados de forma que a frequência de operação máxima depende da tensão fornecida. Assim quando a performance não estiver crítica a tensão (e a frequência) podem ser reduzidas. Infelizmente isto não vale para sistemas de tempo real cujo principal requisito é atender aos deadline. Existem soluções que incorporam DVFS entre o escalonador e o disparador do RTOS.

5.2 Múltiplas tensões

Projetar um chip utilizando uma única tensão de alimentação é comum e também tem a penalidade de que os piores caminhos de tempo a serem cumpridos terão a mesma força de drive dos demais. Ou seja, haverá slack times bastante altos para poder compensar os caminhos críticos. Claro que um bom projeto e uma boa ferramenta tentam encontrar um compromisso.

O ponto chave é que se todos os caminhos forem críticos, o consumo global vai ser o menor possível. A forma mais simples é: operar todos os caminhos que não são críticos em tensão mais baixa, e os críticos em tensão mais alta. A penalidade se dará principalmente em área pela adição de layers para comunicar blocos em diferentes tensões.

Formas mais eficientes adicionam inteligência nas ferramentas de projeto para escolher as tensões de cada caminhos. Falando de forma muito simplificada, um algoritmo calcula o slack de uma célula, e decide se ela pode ou não ser substituída por uma célula low voltage. Caso os demais caminhos continuem positivos esta célula é então substituída. Se não, será preciso sacrificar o consumo em detrimento da performance naquela célula.

Ainda, alguns autores sugerem que o caminho crítico de um circuito não é o caminho mais longo, mas sim o caminho mais longo e mais demandado na operação – uma variável a mais. Esta técnica demonstrou alguns ganhos em relação a anterior, e é chamada de PVCS (path-oriented clustered voltage scaling).

É preciso dizer que os layers adicionados para comunicar módulos em diferentes tensões também consumirão energia tanto estática quanto dinâmica. Existem pesquisas com as mais diversas soluções para a utilização de múltiplas tensões, inclusive com técnicas livres de conversores de nível de tensão.

5.3 Clock-gating

Em primeiro lugar é importante dizer que a árvore de clock consome aproximadamente 50% da energia em um circuito integrado digital. Depois, cada vez que um gate é chaveado, energia dinâmica será consumida. Se o dado a ser disponibilizado após o chaveamento é o mesmo que lá está, por que então consumir esta energia? Condições para habilitar ou não o clock são as técnicas chamadas de clock gating.

Está apresentada aqui em nível arquitetural pois, assim como as outras técnicas neste nível, é implementada no projeto através das diretivas de síntese que o projetista lança e das células disponíveis no PDK (Process Design Kit). Entretanto o código em que o hardware é descrito também tem forte influência no que a ferramenta vai conseguir fazer, pois é a partir desta descrição que as melhores ‘condições’ para habilitar ou não o clock serão inferidas.

A forma mais comum de clock-gating, simplesmente compara se a entrada D de um banco de registradores é igual ou não à saída Q.

clockcombinacional

Figura 1: Clock gating combinacional (figura retirada de Mohit Arora)

Na figura acima, uma condição de enable permite ou não que aquele registrador seja ‘clockado’, e o dado segue adiante na pipeline. (perceba que o segundo registrador não tem uma lógica de clock gating representada, e muitos menos relacionada com a primeira)Estima-se que 5-10% de energia dinâmica é salva com essa técnica se implementada combinacionalmente.

Pensando num pipeline onde lógicas são encadeadas entre um banco de registro e outros podemos também reduzir o chaveamento redundante na porção do circuito que está conectada à saída banco de registradores que estão sob clock gating, se toda a cadeia subsequente da pipeline for chaveada levando em conta as condições de enable da anterior. Na literatura costumam chamar esta técnica de “clock-gating avançado”.

clocksequencial

Figura 2: Clock gating sequencial (de Morit Ahora)

5.4 Power gating

Desabilitar completamente um módulo quando ele não está em uso, é consideravelmente importante nas atuais tecnologias onde a componente de consumo estático é dominante. Os módulos são habilitados ou desabilitados conforme a necessidade da aplicação. As chaves utilizadas para habilitar ou desabilitar passagem de corrente para o módulo são comumente chamadas de sleep transistors. As chaves conectadas entre Vdd e o módulo são os chamados ‘headers’ e entre o módulo de Vss são os ‘footers’. A inserção destes sleep transistors insere agora dois grandes domínios de tensão no sistema: um permanente, conectado à fonte de alimentação, e um virtual que é o visto pelo módulo de fato. O maior desafio é projetar uma chave que permita que o domínio de tensão real e virtual sejam muito similares em todas as suas características.

header-footer-swithces


Figura 3: Diagrama de blocos de dois circuitos utilizando sleep transitors, (a) header e (b) footer. (de Mohit Arora)

Não é difícil imaginar que o tamanho do sleep transistor seja bastante considerável (no dedão: ~3x a capacitância a ser driveada). Devido ao seu tamanho, ligar ou desligar um módulo através do seu chaveamento leva um tempo. Assim, não parece uma boa política adicionar estas chaves a módulos que ficarão pouco tempo em idle na operação típica do sistema. Assim, ou fazemos um sistema de power gating de baixa granularidade ou alta granularidade.

No modo fine-grain (alta granularidade) cada módulo tem um sleep transistors que são construídos como parte do PDK e adicionados durante a síntese, o que traz imensas vantagens na facilidade de projeto. A economia de corrente de leakage pode chegar a 10X.

No sistema de baixa granularidade, menos sleep-transitors são disponibilizados na forma de ‘grid’ que ligam ou desligam os domínios de módulos conforme a aplicação. Isto implica em menor overhead de área (e por consequência, menor variação de processo). Nesta abordagem os sleep-transistors são de fato parte das linhas de alimentação do circuito, não células adicionadas na síntese lógica, e portanto mais próximos do projetista de back-end.

Por outro lado, nesta abordagem de grid, com menos sleep-transistors chaveando mais circuitos, teremos mais domínios de power, com maiores variações de IR entre eles, maiores correntes de pico de power-up, que podem, entre outros problemas, ocasionar transições indesejadas em módulos vizinhos, o que vai exigir contra-medidas no back-end. Além de é claro, fritar um circuito cujas linhas foram subdimensionadas.

coarsepower

Figura 4: Representação de um esquema de power-gating de baixa granularidade com sleep transistor do tipo footer (de Mohit Arora)

Na prática não existe uma linha bem definida entre fine-grain e power-grain, e um misto de ambos é utilizado em um projeto real.

5.5 Sub-threshold/near-threshold design

A diminuição da tensão de alimentação (mantendo uma tensão de threshold fixa) resulta na diminuição quadrática do consumo dinâmico, às custas de performance, o que a depender da área de aplicação (sensores biomédicos, para dar um único exemplo) não é um problema.

Indo um pouco além, podemos pensar em utilizar o que seria a corrente de leakage desperdiçada para de fato implementar a lógica do sistema, o que é atingido quando se reduz a tensão de alimentação para um valor menor ou muito próximo de Vth. A corrente de sub-threshold é exponencialmente dependente da tensão no gate. A literatura demonstra algumas reduções de até 20X quando comparados com circuitos operando com (super)-Vth.

O grande problema? A pequeníssima diferença na corrente de um transistor ligado e um desligado, faz com que as variações de processo sejam muito impactantes no circuito construído. As contra medidas partem da arquitetura do sistema e chegam ao nível de transistor.

* * *

A próxima e última publicação vai falar das técnicas em nivel RTL.

O texto desta publicação é original. As seguintes fontes foram consultadas: The Art of Hardware Architecture, Mohit Ahora Ultra-Low Power Integrated Circuit Design, Niaxiong Nick Tan et al.

[blog] O Amplificador Diferencial

Comentários básicos sobre este workhorse em eletrônica. O conceito de amplificador diferencial é elemento-chave em uma infinidade de aplicações analógicas: buffers, filtros, osciladores, reguladores de tensão, referências de tensão/corrente, processamento de sinais, PLLs, etc., devido às suas características. As figuras foram retiradas do livro CMOS Circuit, Design, Layout and Simulation (Baker).

Figura retirada de analog.com

O Par diferencial

O conceito de diferencial é comum em engenharia e consiste na ideia de que determinado fluxo de energia é distribuído entre dois ramos ‘complementares’ de um dispositivo (no automóvel, isto permite que uma roda gire mais rápido que a oposta para que possamos fazer uma curva – cada uma das rodas vai percorrer diferentes comprimentos de arco no mesmo tempo). Em eletrônica o par diferencial nos permite principalmente eliminar ruídos de modo-comum (neste caso especificamente aqueles provindos de uma mesma fonte DC que alimenta os circuitos que geram os sinais AC de entrada, e possivelmente o amp-op).

O Amplificador Diferencial

A apresentação clássica do amplificador diferencial é assim:

Vout = (V+ – V)*Ganho [V]

Também sempre é dito que idealmente temos:

  • impedância de entrada infinita
  • impedância de saída nula
  • ganho infinito em malha aberta
  • rejeição de modo comum infinita

Vou tentar mostrar aqui porque estas características são importantes, utilizando circuitos analógicos CMOS básicos e análises intuitivas.

Talvez a primeira coisa que vem à mente de quem é introduzido ao assunto é que se o ganho é muito grande (como deve ser), a tensão Vout vai explodir. Primeiramente, esta equação está em malha aberta, sem a realimentação negativa, quando parte do sinal de saída é subtraído do sinal de entrada. Depois, na maior parte das vezes estamos interessados em trabalhar em pequenos sinais AC – centésimos ou milésimos de Vdd (v+, v-). Cabe ainda dizer que ganho mede-se em V/V (é um número sem dimensão), e independente do seu tamanho a máxima tensão alcançada será sempre Vdd.

Os pequenos sinais (v+,- v-) variam em torno da polarização DC (V+, V-). Polarizar significa determinar um ponto de operação do circuito, de cada transistor na verdade (em elementos semicondutores, as características elétricas variam conforme às tensões elétricas a que o dispositivo é submetido).  Na figura acima o ganho de malha aberta (open-loop) é mostrado como função da frequência do sinal de entrada. Uma topologia clássica do circuito amplificador diferencial em CMOS é assim:

(PS: transistores NMOS estarão em região linear se VGS >= Vth, e PMOS com VSG >= Vth. IDS = f(VDS,VGS), assume formas distintas a depender da região de operação)

A corrente Iss é resultado da tensão de gate em M6, que estará com a corrente estável em um range de tensão dreno-fonte. Supondo uma tensão Vn, de modo comum aplicada aos gates de M1 e M2, a corrente drenada por M6 seja um valor Iss = Id1 + Id2.

Se extrairmos a tensão de saída no dreno de cada um dos transistores M1 e M2, Vout1,2= Id1,2*RCarga1,2. Isto basicamente diz que o ganho Av=Vout/Vin é proporcional à transcondutância do transistor em determinado ponto de polarização multiplicado pela carga, pois ID/Vin = Gm = 1/(Rds).

A saída Vout diferencial é VD1-VD2 ou ao contrário, a depender do que estabelecermos como saída positiva e negativa. Com a topologia acima é impossível dizer qualquer coisa sobre qual será a entrada positiva e qual será a negativa. Só podemos dizer isto quando definirmos qual a entrada que aumenta a tensão de saída, e a entrada que a diminui.

Para tanto, completa-se o par diferencial com uma carga espelho de corrente do tipo PMOS, uma carga ativa.

Se a tensão do gate M1 aumenta, mais corrente é drenada, maior a tensão VSG de M3 e M4 (ou menor a tensão VGS, se preferir). Se ambos M1 e M2 tiverem a mesma tensão de gate, a corrente no sentido dreno-fonte de cada elemento do par será ID1 = ID2 = Iss/2 [A]. Se tensão de gate em M1 aumenta em relação à tensão de gate M2, menos corrente é drenada por M2 e portanto menor a queda dreno-fonte em M2. Se M2 continuar no ponto de operação desejável, sua (trans)condutância é constante. Se a condutância de M2 mantém-se constante, mas sua corrente diminui, a tensão Vout = VDD – VSD4 obrigatoriamente aumenta. Então VG1 = V+. O raciocínio inverso vale para V: quanto maior a corrente drenada em M2, menor a tensão Vout. É este balanço na entrada que nos permite reduzir drasticamente o ruído de modo comum, se comparado a um amplificador de entrada única. Se adicionarmos mais um estágio de amplificação teremos ganho suficiente para chamá-lo de amplificador operacional. Tradicionalmente, o próximo estágio seria um amplificador PMOS, dreno-comum, com carga NMOS.

Ainda nesta topologia de só um estágio, a curva de transferência assume o seguinte, sendo o eixo horizontal a tensão de modo comum Vin nos gates do par diferencial, e no eixo vertical, Vout a tensão medida nos drenos de M2 e M4.

A derivada no ponto de polarização é o ganho do amplificador quando polarizado com a tensão correspondente Vin. Um bom ponto de polarização é aquela cuja derivada em relação ao pequeno sinal vin mantenha o maior intervalo em vout sem perturbar a transcondutância de M2 // M4. Idealmente é um ponto com derivada infinita. Pois para o sinal vout não remover M2 e M4 do ponto de operação desejável, as correntes drenadas não podem causar quedas de tensão que retire os transistores do ponto de operação, o que no limite significa impedância nula no nodo vout. Para a impedância de entrada ser infinita, a variação da tensão vgs de M1 e M2, não deve causar variação de tensão vgs + Vgs que retire o transistor da região de operação desejada. Se for saturado na região linear, a tensão dreno-fonte precisa manter-se em Vds >= tensão de overdrive (Vgs – Vth). A rejeição de modo comum será tão boa quanto a precisão do espelhamento de corrente – o mais iguais o módulo das correntes de dreno de M3 e M4, mais ruídos do sinal de tensão de modo-comum Vin estarão subtraídos no nodo Vout = Iout*RLout.