• Nenhum resultado encontrado

2 Síntese Comportamental

2.2 A Síntese Comportamental segundo Lee

Lee, em [24], apresenta um fluxo de atividades para realização de síntese Comportamental, para ferramentas que automatizam esse processo de síntese.

A entrada desse processo é uma descrição do comportamento do circuito. Esse comporta- mento pode ser especificado em uma linguagem de descrição de hardware de alto nível. Em uma especificação comportamental um bloco básico é definido como uma seqüência de atribuições que não contém testes nem desvios, exceto o teste de condição de parada. Desta descrição pode- se derivar um grafo de fluxo de dados (em inglês, data flow graph ou DFG) do bloco básico, onde cada vértice está associado a uma operação e cada aresta a uma variável. As dependências de dados estão implícitas nas direções das arestas do grafo.

As variáveis em um DFG podem ser classificadas em três subconjuntos: entradas primárias (VI), saídas primárias (VO) e variáveis intermediárias (VM). O fluxo de dados em um DFG é

denotado por v1 O1

−→ v2 O2

−→ ... On−1

Figura 2 – Fluxo de síntese comportamental, baseado em [24].

VI ∪ VO∪ VM, e Oj associado a cada −→, 1 ≤ j ≤ n, é uma operação com vj como operando

e vj+1como resultado. Ainda, se v1e v2representam o mesmo vértice, o DFG é cíclico e v1ou

v2 são chamadas variáveis limitadas. Um DFG cíclico é inferido de construções de linguagem

do tipo laço, como comandos for e while.

Para cada operação O associada com um nó em um DFG, O.earliest denota o ciclo mais cedo em que a operação pode executar e O.latest denota o ciclo mais tardio em que a opera- ção pode executar sem violar a dependência de dados expressa no DFG. A folga (do inglês,

slack) de O é definida pelo intervalo [O.earliest, O.latest], e a mobilidade de O é definida como O.latest − O.earliest. A seqüência de operações com mobilidade igual a zero é cha- mada caminho crítico. Folgas em mobilidade podem ser utilizadas para indicar a liberdade de escalonamento para uma operação.

A tarefa de escalonamento atribui um tempo de execução, ou passo de controle, para cada operação da especificação comportamental. O DFG obtido após o escalonamento é chamado

DFG Escalonado (em inglês scheduled data flow graph ou SDFG). Segundo Lee, os algoritmos de escalonamento podem ser classificados como de transformação ou iterativos/construtivos. Os escalonamentos com transformação partem de uma solução inicial e tentam realizar trans- formações, preservando o comportamento, para obter uma melhoria da estrutura inicial. A abordagem iterativa/construtiva escalona a operações de forma construtiva a partir da junção de componentes um a um. Algoritmos que partem dessa abordagem são o escalonamento as-

soon-as-possible (ASAP), as-late-as-possible (ALAP), escalonamento do caminho crítico, etc.

ASAP e ALAP são tipos simples de algoritmos construtivos. Para cada operação O do DFG, o algoritmo ASAP escalona para o ciclo corrente O.earliest, enquanto ALAP escalona O.latest. Esses algoritmos são mais rápidos, porém não consideram o caminho crítico e alocam mais recursos do que os necessários. O algoritmo de escalonamento do caminho crítico escalona primeiramente as operações do caminho crítico do DFG. As operações restantes são escalonadas de acordo com sua mobilidade.

Dado um SDFG, a tarefa de alocação de recursos atribui elementos de hardware para re- alizar operações e produzir uma micro-arquitetura RTL. Para definir formalmente a tarefa de alocação de recursos é preciso definir o conceito de tempo de vida de uma variável. Segundo Lee, em um SDFG acíclico, o instante de nascimento de uma variável v, denotado por v.birth é o ciclo em que ela é definida; o instante de morte de v, denotado por v.death, é o último ciclo em que a variável é utilizada. O tempo de vida de v é definido pelo intervalo [v.birth, v.death]. A alocação de recursos é dividida em alocação de registradores, de módulos de processa- mento e de interconexões [24]. A alocação de registradores, denotada por R, pode ser consi- derada como o problema de encontrar uma partição {R1, R2, ..., Rr} de VI∪ VO∪ VM tal que

para quaisquer duas variáveis vi e vj em Rk, 1 ≤ k ≤ r, seus tempos de vida não se sobrepõe.

Similarmente, a alocação de módulos de processamento, denotada por M, pode ser considerada como o problema de encontrar uma partição {M1, M2, ..., Mm} de O tal que quaisquer duas

operações oi e oj em Mk, 1 ≤ k ≤ m, não tenham tempos de execução conflitantes. A partir

de um SDFG é derivado um grafo não dirigido, chamado grafo de alocação de módulos (em inglês, module allocation graph ou MAG), em que cada nodo corresponde a uma operação do SDFG e cada aresta corresponde à capacidade de compartilhamento de um mesmo módulo en- tre dois nodos conectados. O grau de capacidade de compartilhamento pode ser diferenciado atribuindo pesos às arestas. A Figura 3 apresenta um SDFG e o MAG com pesos corresponden- tes, supondo que dois somadores sejam reservados, e que o peso de compartilhamento entre +a

e +b é −1 e entre +ae +c, 3. Como o peso entre +ae +c é maior que aquele entre +ae +b, um

somador será compartilhado entre +ae +c e outro (+b) será dedicado.

A alocação de interconexões associa fios a sinais de vai-um e variáveis entre registradores e módulos. Dois sinais podem ser associados para o mesmo fio, desde que seus tempos de vida não se sobreponham.

A Figura 4 (a) mostra um exemplo de especificação comportamental, onde cada variável representa um nome de sinal e cada operação representa uma computação que será realizada.

Figura 3 – Exemplo de um MAG, retirado de [24]: (b) com pesos; (a) derivado do SDFG.

A Figura 4(b) apresenta um DFG que pode ser derivado da especificação inicial. A Figura 4(c) apresenta uma possibilidade de arquitetura para o comportamento descrito no algoritmo inicial. Nessa arquitetura, três registradores são alocados pela síntese de alto nível para armazenar os valores das variáveis: R1 para a e d, R2 para b e R3 para c e k. Um multiplicador e um somador são mapeados para realizar as operações especificadas. O tempo de execução de cada operação também é escalonado pela síntese de alto nível. No primeiro ciclo, O multiplicador gera o produto em R1 a partir dos operandos de R1 e R2 (a e b). No segundo ciclo, o somador adiciona os operandos de R1 e R3 (c e d) e armazena o produto k em R3.

Figura 4 – Derivação da especificação comportamental até a arquitetura RT, retirada de [24]: (a) exemplo de especificação comportamental; (b) um possível DFG da descrição; (c) uma possibilidade de arquite- tura RT.