• Nenhum resultado encontrado

Estudos Preliminares

2.2. Fluxo de síntese

A implementação de projetos em FPGA tem início a partir da descrição do comportamento do circuito desejado. Tipicamente, essa descrição se dá em nível de transferência de registradores (RTL). Cabe, então, à ferramenta de síntese converter a descrição em um conjunto de bits que será utilizado na programação do FPGA. A conversão se dá através de um fluxo de projeto implementado por ferramenta EDA que, por sua vez, é composto de cinco etapas: síntese lógica e otimização, mapeamento tecnológico, agrupamento, posicionamento e roteamento.

O fluxo de síntese típico é ilustrado na Figura 9. A partir da descrição do circuito, a fase de síntese lógica e otimização é responsável por traduzi-lo em uma netlist de portas lógicas e pela simplificação das funções lógicas do circuito. Essa simplificação se dá sem o uso de qualquer informação tecnológica, o que ocorre é que as redundâncias são removidas nesta etapa.

O mapeamento tecnológico é a etapa do fluxo que traduz a lógica otimizada para a arquitetura alvo. No caso específico dos FPGAs, o menor nível de granularidade da lógica são as LUTs (Look-Up Tables), que implementam toda a parte combinacional dos circuitos, e os flip-flops que proveem a parte sequencial. Desta forma, o mapeamento recebe a netlist de blocos lógicos otimizada e mapeia essa lógica em LUTs

e flip-flops, onde cada função lógica delimitada por K entradas é mapeada em uma K- LUT. Esse processo é tratado como um problema de cobertura. A fase de mapeamento entrega a implementação da lógica mapeada em LUTs e flip-flops.

O agrupamento é a etapa em que blocos básicos, blocos de menor granularidade, são agrupados formando blocos mais complexos, blocos de maior granularidade que podem ser mapeados em blocos lógicos físicos do FPGA. Como exemplo, conjuntos de LUTs e flip-flops que constituem elementos lógicos básicos são agrupados em blocos lógicos complexos (CLBs). A tarefa do algoritmo de agrupamento é determinar, a partir de objetivos pré-definidos, como será feita esta associação de blocos básicos. A maioria das ferramentas de agrupamento minimiza o número de blocos lógicos, o número de conexões entre esses blocos, e o retardo no caminho crítico. A ferramenta de agrupamento recebe como entrada a netlist de blocos básicos, produzida durante a fase de mapeamento, e produz uma netlist de blocos complexos que serão utilizados na próxima etapa do fluxo. Esta ferramenta deve considerar as limitações físicas do FPGA como, a capacidade máxima de LUTs em um bloco lógico e o número de sinais entradas e de sinais de relógio distintos que o bloco lógico possui.

No posicionamento é determinada a exata posição de cada bloco complexo no chip, ou seja, os blocos lógicos agrupados são distribuídos entre os blocos lógicos físicos no FPGA. A tarefa também é guiada por objetivos pré-definidos, e algumas restrições devem ser observadas como: dois blocos não podem ocupar a mesma posição; um bloco só pode ocupar uma posição destinada ao seu tipo específico. Os algoritmos de posicionamento tentam minimizar o retardo ao longo do caminho crítico e melhorar a roteabilidade do circuito. O posicionamento pode ser realizado a partir de uma abordagem baseada em simulated annealing (MARQUARDT, BETZ e ROSE, 2000), abordagem analítica (CHU, 2009) ou baseada em algoritmos de corte mínimo (min-cut) (DUNLOP e KERNIGHAN, 1985).

O roteamento atribui os recursos de roteamento disponíveis no FPGA para prover as diferentes conexões entre os blocos lógicos no projeto posicionado. São definidos quais canais serão utilizados para cada conexão e qual o exato caminho que o canal irá percorrer. O objetivo típico de um algoritmo de roteamento é minimizar o retardo ao longo do caminho crítico e evitar a congestão nos recursos de roteamento. O problema de roteamento é usualmente resolvido pelo uso de uma abordagem em dois estágios: roteamento global seguido de roteamento detalhado (HUANG-YU e YAO-

WEN, 2009). Onde, o roteador global considera somente a arquitetura do circuito, sem prestar atenção no número ou nos tipos de fios disponíveis, já o roteamento detalhado, atribui as conexões aos fios específicos no FPGA.

As etapas do fluxo de síntese são dependentes umas das outras. Os resultados de uma etapa tem influência nas etapas posteriores. Assim, as escolhas em uma fase podem afetar a roteabilidade, o desempenho, a distribuição de pontos quentes e o consumo de potência de um projeto. Por isso, a eficácia da ferramenta de síntese depende da eficácia de cada uma das etapas. O desafio dos desenvolvedores de algoritmos de síntese torna- se ainda maior quando se leva em conta o aspecto time-to-market, que exige a diminuição no tempo de execução destas tarefas, elevando o índice de eficiência. Além disso, associadas à demanda por eficiência e eficácia, soma-se o crescimento da complexidade dos projetos.

O escopo desta tese está na otimização das fases de mapeamento e agrupamento, desta forma, estas etapas serão detalhadas nas seções 2.2.1 e 2.2.2 respectivamente.

2.2.1. Conceitos Básicos do Mapeamento Tecnológico

O mapeamento tecnológico para FPGAs consiste na transformação de uma rede lógica, normalmente representada por um grafo acíclico dirigido (DAG), em uma rede de nós lógicos, com não mais do que K entradas. Cada nó da rede criada será mapeado em uma LUT de K entradas. Frequentemente, a rede lógica de entrada é composta por nós lógicos de até duas entradas, um exemplo clássico são as redes AIG (And-Inverter Graph) (CONG e WU, 1999). Os nós que não possuem conexões de entrada são chamados de PIs (entradas primarias), já os nós sem conexões de saída, são chamados de POs (saídas primárias). Na prática, uma PI é, ou a entrada física de um circuito ou a saída de um elemento sequencial (registrador). Já uma PO representa, ou a saída física de um circuito ou a entrada de um elemento sequencial. A Figura 10 ilustra uma pequena rede lógica representada como uma AIG. Para esta rede, os nós de a a f são ditos entradas primárias e o nó i é dito saída primária.

Uma vez que o circuito lógico é representado através do grafo, algumas definições tornam-se necessárias para o entendimento da etapa de mapeamento. Estas definições serão elucidadas no decorrer desta seção.

Figura 10. Exemplo de rede AIG

O fanin cone de um nó i é um subgrafo composto por i e todos os seus antecessores, com exceção das entradas primárias. A Figura 11 destaca o fanin cone do nó i. Um cone de um nó i é um subgrafo composto por i e alguns de seus antecessores. Um corte de um nó i é uma partição do fanin cone em duas regiões X e X’, tal que, X’ é um cone de i. A Figura 12 ilustra um possível corte para o nó i. No exemplo, X’ é o cone composto pelos nós i e s.

Figura 11. Fanin cone do nó i composto pelos nós {i,s,p,q,r,t,u}

Um cone C é dito K-feasible se o número de nós fora de C que alimentam as entradas das portas de C não excede K. Um K-feasible cone pode ser implementado por uma LUT de K entradas. Um corte é K-feasible se X’ é um K-feasible cone. O corte da Figura 12 é K-feasible, para qualquer K maior que 3, já que o número de conexões de entrada do cone não excede 3.

É possível verificar que mais de um K-feasible corte pode ser definido para um dado nó raiz i. E, para cada um desses cortes, algumas características podem ser observadas como: o número de conexões de entrada e o número de nós internos a X’. Essas e outras características refletirão nas medidas de área, desempenho e potência do mapeamento tecnológico.

O nível ou profundidade de um nó i é o número de nós no caminho mais longo que leva de qualquer entrada primária até o nó i. O nível de um nó PI é zero. A partir do conhecimento do nível de cada nó, pode-se determinar a profundidade da rede, que é caracterizada como o maior nível dentre todos os nós internos da rede. A atribuição do nível dos nós do exemplo é mostrada na Figura 13. Os nós de a a f são entradas primárias, portanto tem profundidade zero, os nós p, q, t e u tem profundidade 1, os nós s e r tem profundidade 2 e o nó i tem profundidade 3. Logo, a profundidade da rede, neste caso, é 3.

Figura 13. Atribuição do nível aos nós da rede

Em um circuito mapeado, alguns nós da rede original são encapsulados pelos cones (que posteriormente serão convertidos em LUTs) e a profundidade do circuito final é a medida utilizada para mensurar o retardo do caminho crítico. No lado esquerdo da Figura 14 é apresentado um exemplo de mapeamento. Pode-se observar que alguns cones encapsularam mais de um nó: o cone raiz do nó r que encapsulou os nós r, t e u e o cone raiz do nó i que encapsulou os nós i e s. Desta forma, o circuito mapeado (lado Figura 12. Exemplo de corte do nó dividindo o fanin cone em duas regiões, tal que X’ é um cone.

direito da Figura 14) possui profundidade 2. Isto significa que, no caminho entre qualquer entrada e saída primárias existem, no máximo, 2 LUTs.

Claramente a medida de nível não reflete precisamente o retardo do circuito, já que ignora o retardo nas conexões entre as LUTs. Entretanto, ela é justificada pela dificuldade em se definir estes retardos no nível de mapeamento.

O número de LUTs necessárias para implementar um circuito é definida como área do circuito mapeado. E ela é determinada pela escolha dos cortes para os nós da rede. Quando um corte é escolhido para um dado nó, dizemos que este é o corte representativo do nó. A quantidade de LUTs total de um circuito, por sua vez, impactará diretamente na quantidade de CLBs utilizada para implementação da lógica do mesmo. No exemplo da Figura 14, a escolha dos cortes foi tal que, a área final do circuito mapeado é de 4 LUTs.

A medida de quantidade de conexões de um corte diz quantas conexões serão criadas se este corte é escolhido para mapear o nó. Uma atenção especial deve ser dada às conexões entre LUTs porque estas, fisicamente, representarão conexões internas no CLB e também conexões entre CLBs (que utilizam o canal de roteamento). Isto representa um impacto negativo na roteabilidade, no comprimento total do fio, na largura do canal de roteamento e no consumo de potência. Na Figura 14, o número de conexões criadas foi 3 (conexões de entrada da LUT i). A conexão entre os nós encapsulados dentro de LUT não são contabilizadas, pois não farão parte do canal de roteamento.

Figura 14. Exemplo de mapeamento. As medidas de profundidade, área e quantidade de conexões (excluindo as conexões de entrada) são 2, 4 e 3 respectivamente.

Como a tarefa de mapeamento consiste em selecionar cortes para cada nó da rede, classicamente, a primeira etapa do mapeamento consiste na determinação de todos os K-feasible cortes de todos nós da rede. Esta tarefa pode ser feita através do método chamado de enumeração de cortes (cut enumeration (CONG e WU, 1999)). Neste método, a rede é percorrida em ordem topológica (das entradas primárias para as saída primárias) e o corte de um nó é determinado pela união dos cortes dos seus fanins.

Para conceituação formal do método, usaremos a nomenclatura descrita em (CONG e WU, 1999). Sejam A e B dois conjuntos de cortes, o operador A<>B corresponde ao conjunto de cortes gerados pela união entre cada corte u A e cada corte v B, cujo número de entradas não ultrapasse K. Desta forma, o operador A<>B é definido como:

{ } (2-6)

Se um nó i representa uma função “e” (and) e i1 e i2 são seus fanins, então, o

conjunto de cortes do nó i (denotado Φ(i)) é dado por:

{{{ }} {{ }}

(2-7)

Para o grafo da Figura 13, o nó r, por exemplo, tem como entradas os nós t e u. Os nós t e u são entradas primárias, desta forma, seus cortes são {{t}} e {{u}} respectivamente Assim, de acordo com a equação (2-7), os possíveis cortes do nó r (∅ (r)) são definidos como {{r}} U ∅(t) ∅ u . Já que, de acordo com a equação (2-6). ∅(t) ∅ u corresponde a {{t}}, {{u}}, {{t,u}}. Pode-se, finalmente, definir os elementos do conjunto ∅(r) como {r}, {r} U {t} = {r, t}, {r} U {u} = {r,u} e {r} U {t} U {u}= {r, t, u}. Este processo pode ser repetido para todos os nós da rede.

Durante a enumeração dos cortes, podem ser atribuídas as medidas de nível, número de LUTs e quantidade de conexões para cada corte criado. Uma vez que todos os cortes foram gerados, a segunda etapa do mapeamento clássico é a seleção do melhor corte de cada nó obedecendo a alguma medida (por exemplo, melhor desempenho, ou seja, menor nível). A terceira etapa é a correção ou reparação de área (area recovery ) (JANG, CHAN, et al., 2009), onde o melhor corte de cada nó é atualizado no intuito de economia de área. Esta etapa corrige um problema chamado de duplicação de área, em que um nó da rede é coberto por mais de um corte, o que ocasiona um aumento na

quantidade de LUTs do circuito. A Figura 15 mostra duas opções de mapeamento para um circuito, as opções (a) e (b) tem a mesma profundidade 2, mas a opção (a) tem área 4 enquanto a opção (b) tem área 3. Isto ocorre devido ao fato do nó q na abordagem (a) ter sido coberto por mais de um corte.

Para correção do problema de duplicação, tradicionalmente é usada uma heurística de visão global. O fluxo de área ou área efetiva (MANOHARARAJAH, BROWN e VRANESIC, 2006) é uma extensão da noção de área, uma vez que ela estima a quantidade de LUTs utilizada no circuito. A definição de fluxo de área (AreaFlow) de um nó n é mostrada na equação (2-8).

(2-8)

Na equação (2-8), Area(n) é o custo de área da LUT usada para mapear o nó n. Este custo vale 0 para as PIs e 1 para os demais casos. Entradai(n) representa cada uma

das entradas do corte atribuído ao nó n e NFanouts(n) é o número de conexões de saída (fanouts) do nó n no mapeamento atual. O uso do número de fanouts no denominador é fundamental para a redução da duplicação, já que, leva em conta o compartilhamento e favorece a escolha de nós de maior número de fanouts para fazerem parte do mapeamento. A Tabela 1 mostra a distribuição do fluxo de área dos nós selecionados para fazer parte do mapeamento no exemplo da Figura 15. Observa-se que, enquanto na opção (a), o fluxo de área do corte que produz as saídas x e y é 2, na opção b, este custo

(a) (b)

Figura 15. (a) Mapeamento de profundidade 2 e área 4 devido a duplicação do nó q. (b) Mapeamento sem duplicação de profundidade 2 e área 3.

é 1,5. Assim, escolher cortes com menor fluxo de área, significa, na prática, produzir uma solução com menor área de circuito mapeado.

Tabela 1. Distribuição do fluxo de área dos nós selecionados para mapeamento

A quarta etapa é a determinação dos nós que farão parte do mapeamento final (tendo em vista que muitos nós serão encapsulados nos cortes). Nesta etapa a rede é percorrida em ordem topológica reversa, ou seja, dos POs para os PIs. No exemplo da Figura 15 (b) os nós x, q e y são os nós que farão parte do mapeamento.

2.2.2. Conceitos Básicos do Agrupamento

O agrupamento (clustering) é uma etapa do fluxo de síntese intermediária entre o mapeamento tecnológico e o posicionamento. Esta etapa é responsável pela transformação de uma netlist de células lógicas em uma netlist de clusters lógicos. Como exemplificado na Figura 16.

Durante este documento, a palavra cluster será utilizada de forma sinônima à palavra CLB (bloco lógico configurável). Um CLB, por sua vez, comportará um número de N elementos lógicos básicos (BLEs) com I entradas.

As técnicas de agrupamento podem ser classificadas como top-down (HAGEN e KAHNG, 1997) (HUANG e KAHNG, 1995) ou bottom-up (MARQUARDT, BETZ e ROSE, 1999) (CONG, HAGEN e KAHNG, 1991) (CONG e LIM, 2000). A estratégia top-down é baseada em particionamento iterativo onde o circuito é representado como um hipergrafo cujas células lógicas constituem os nós e as transições representam as redes. O circuito é iterativamente particionado de forma que, em um mesmo grupo, sejam mantidos os nós fortemente conectados. A estratégia bottom-up, por sua vez, inicia com uma célula básica, denominada de semente, e constrói o cluster em torno da célula semente, até que as restrições do número de blocos máximo do cluster, ou do número de entradas sejam alcançadas. Para a operação da estratégia bottom-up, duas

Opção (a) Opção (b)

Mapeado