Você está na página 1de 22

Tradutor de C para VHDL C2VHDL

FELIPE WALCARENGHI MARRA VICTOR EMERSON MACIEL COELHO LUIZA DE MACEDO MOURELLE* NADIA NEDJAH* UERJ Universidade do Estado do Rio de Janeiro FEN Faculdade de Engenharia DESC Departamento de Engenharia de Sistemas e Computao Rua So Francisco Xavier, 524, 5 o. andar, sala 5022-D, Maracan, CEP 20550-900, Rio de Janeiro, RJ {ldmm,nadia}@eng.uerj.br

Resumo: A busca por solues que visem otimizao de sistemas computacionais passa, principalmente, por pesquisas nos campos de multiprogramao, processamento paralelo e especulativo, pastilhas especialistas, entre outros. Procura-se no s aumentar a velocidade do hardware e otimizar a programao do software, mas tambm melhorar a maneira como ambos interagem. Um programa sendo executado por um microprocessador pode possuir trechos que demandam mais tempo de execuo que outros. O limite entre hardware e software muito tnue, isto , tudo que implementado em software pode ser implementado em hardware e vice-versa. Seguindo esse raciocnio, podemos utilizar pastilhas especialistas que implementem trechos de um programa que comprometem o desempenho da aplicao, otimizando a utilizao do processador. A partir da identificao dos pontos de estragulamento, pode-se, ento, obter um modelo de circuito equivalente ao referido cdigo. Palavras Chave: Hardware, software, VHDL, FPGA, compilador, tradutor. 1 Introduo A engenharia da computao vem se deparando com as questes de tempo de resposta e tempo de processamento de sistemas computacionais. Essas questes envolvem o desempenho de software e hardware. Existem vrias solues que buscam a melhor utilizao dos recursos do sistema computacional e sua conseqente melhora de desempenho. Os sistemas multiprogramveis so um exemplo e foram desenvolvidos justamente para otimizar a utilizao desses recursos. O conceito de multiprogramao est no fato de existirem vrios programas sendo executados concorrentemente por uma nica Unidade Central de Processamento (CPU), ou seja, vrios programas residentes em memria disputam a sua utilizao. A CPU pode trocar o programa em execuo em tempos determinados ou quando forem solicitadas operaes de entrada/sada (E/S), que possuem um tempo de processamento elevado em compara o velocidade do processamento da CPU. Nesse caso, a CPU permanece menos tempo ociosa. [Machado, 1992]. Outros conceitos, como programao paralela, so utilizados para melhoria de desempenho na execuo de um programa. Nesse caso, tem-se vrias instrues sendo executadas simultaneamente por um ou mais processadores . No caso de um nico processador, o paralelismo pode ser atingido atravs de mquinas pipeline que implementam o processador em mdulos, de modo que no seja necessrio terminar o proce ssamento completo de uma instruo para que se busque outra. [Tanembaum, 1992]. Tanto o conceito de multiprogramao como o de paralelismo, propem solues integradas entre hardware e software. Assim, a busca por solues que visem otimizao de sistemas computacionais passa, principalmente, por pesquisas nos campos de multiprogramao, processamento paralelo e especulativo, pastilhas especialistas, entre outros. Procura-se no s aumentar a velocidade do hardware e otimizar a programao do software, mas tambm melhorar a maneira como ambos se relacionam.
*

Orientador da pesquisa.

Um programa sendo executado por um microprocessador pode possuir trechos que demandam mais tempo de execuo que outros [Machado, 1992]. Imaginemos uma situao onde 10% do cdigo utilize 90% de todo tempo de execuo. Esses trechos podem ser considerados pontos de estrangulamento na execuo do software ou regies crticas. O limite entre hardware e software muito tnue, isto , tudo que implementado em software pode ser implementado em hardware e vice-versa [Tanembaum, 1992]. Seguindo esse raciocnio, podemos utilizar pastilhas especialistas que implementem esses trechos, otimizando uso da CPU. Uma vez identificados os pontos de estrangulamento no programa, deve-se, ento, chegar a um modelo de circuito equivalente ao referido cdigo. Temos, ento, um projeto com uma maior amplitude, composto de trs sub projetos que se integram: identificao dos pontos de estrangulamento (regies crticas), traduo do cdigo para uma linguagem de especificao de hardware e finalmente, sntese do modelo em pastilhas especialistas. Nosso projeto concentra-se na segunda etapa. Sendo a linguagem C extremamente difundida, poderosa e, ainda, amplamente utilizada no meio acadmico, ela foi definida como linguagem objeto do projeto. Dentre as linguagens de especificao de hardware [Chang, 1987] , escolheu-se VHDL, visto que possui uma estrutura de linguagem de programao extremamente familiar, havendo vrias ferramentas para simulao do modelo e sntese do circuito [Lipsett, 1989]. Neste ponto temos um quadro definido do projeto, que pode ser visualizado no diagrama exposto na figura 1.1.

Figura 1.1: O diagrama do tradutor

A seo 2 mostra a estrutura da linguagem VHDL de uma maneira bastante simples e objetiva, e a forma de se trabalhar com ela. Esta seo enfoca as principais etapas de descrio e simulao de hardware em VHDL, explicando as etapas de modelagem estrutural e modelagem comportamental do circuito descrito. A seo 3 descreve uma breve teoria sobre tradutores e compiladores. Nele so mostrados um modelo terico de tradutor, suas partes e ferramentas para sua construo. A seo 4 descreve o modelo do tradutor e discute todo o mecanismo de traduo. Nesta seo a soluo encontrada para implementao do projeto detalhada, tomando por base a teoria proposta na seo 3. A seo 5 discute todas as questes relevantes ao processo de traduo. O formato VHDL que deve ser gerado, como o tradutor trata os tipos de dados primitivos e derivados, isto , como vetores, registros e enumeraes, a forma como so definidas as portas e como so tratadas as funes e bibliotecas. A seo 6 trata a questo da validao do cdigo gerado pelo tradutor. Nesta seo d -se enfoque ao simulador VHDL utilizado no projeto e nos vrios exemplos que foram utilizados. Esses exemplos permitem validar a traduo realizada. A seo 7 conclui o trabalho, apresentando propostas para futuros trabalhos. Essas propostas permitem ampliar a utilizao do tradutor, tornando-o mais abrangente no escopo de cdigo que capaz de traduzir. 2 A linguagem VHDL Nesta seo descrita a linguagem VHDL, sua funo, seus modelos e a sintaxe de suas principais estruturas. Aps um breve histrico da criao da linguagem so mostrados os possveis modelos de programao em VHDL e por fim a sintaxe das estruturas utilizadas no projeto. Esta seo tem a funo de criar uma referncia da linguagem para o entendimento da seqncia do projeto. 2.1 Um breve histrico Em 1980, o Governo dos Estados Unidos desenvolveu o projeto Very High Speed Integrated Circuits (VHSIC ) ou, em portugus, circuitos integrados de muito alta velocidade, para realar a descrio de projetos eletrnicos, alavancando o desenvolvimento de vrios circuitos e processos tecnolgicos. Em conseqncia surgiu VHSIC Hardware Description Language (VHDL Linguagem de Descrio de Hardware VHSIC), sendo apoiada pelo Institute of Electrical and Electronic Engineering (IEEE) em 1986, numa primeira tentativa de padronizao. Em dezembro de 1987, o padro IEEE 1076.1 para VHDL foi aprovado, com uma subseqente atualizao em 1993.

2.2 VHDL como uma linguagem de programao Esse item apresenta as facilidades com que se pode utilizar a linguagem VHDL, pelo fato de ser estruturada de forma bastante similar s linguagens de programao conhecidas. Sero mostrados seus elementos lxicos, tipos de dados, objetos, expresses, operadores e sentenas lgicas. 2.2.1 Elementos lxicos Vamos apresentar os elementos lxicos existentes em VHDL, como comentrios, identificadores, nmeros, caracteres e strings, em uma breve apresentao. As linhas de comentrios so definidas com dois hfens (--) adjacentes. Os identificadores so palavras reservadas ou nomes definidos pelo programador. VHDL no case sensitive, ou seja, no faz distino entre palavras formadas pela combinao de maisculas e/ou minsculas. Os nmeros podem ser expressos nos formato decimal inteiro, decimal exponencial e bases definidas entre 2 e 16. Caso o nmero contenha um ponto, ser um valor real, caso contrrio ser um valor inteiro. Os caracteres utilizados em VHDL correspondem aos caracteres da tabela ASCII e strings so concatenaes desses caracteres. Um outro padro existente em VHDL bit strings, que so convenes para definio de valores em diferentes bases de numerao. Por conveno, para cada base tem-se uma letra que a identifica no incio. B para binrio, O para octal e X para hexadecimal. Assim a indicao O126 seria o valor 126 na base 8 [Ashenden, 1990]. 2.2.2 Tipos de dados VHDL possui tipos primitivos e permite a construo de tipos derivados. Entre os tipos primitivos temos os inteiros (integer), com uma faixa entre 2147483647 a +2147483647, os de ponto flutuantes ( real), que variam entre 1E38 a +1E38 e os tipos fsicos que so tipos numricos representativos de algumas grandezas fsicas, como massa, comprimento, tempo ou tenso eltrica [Ashenden, 1990]. Entre os tipos derivados, temos o tipo enumerado, que so conjuntos ordenados de identificadores ou caracteres, arrays, que so conjuntos indexados de elementos de algum tipo primitivo e os records que so conjuntos de tipos de dados primitivos distintos descritos na figura 2.1. Existem ainda, outros tipos de dados derivados, como os subtypes e os attributes [Ashenden, 1990]. TYPE octal_digit IS (0,1,2,3,4,5,6,7); TYPE word IS ARRAY (31 downto 0) OF BIT TYPE instruction IS RECORD opcode: processor_op; address_mode: mode; operand1: INTEGER RANGE 0 TO 15; operand2: INTEGER RANGE 0 TO 15; END RECORD;
Figura 2.1: Declarao de um tipo enumerado, vetor e registro

2.2.3. Objetos Um objeto um item nomeado na descrio VHDL que assume um valor de acordo com o tipo de dado a que foi associado. Existem trs tipos de classes de objetos, as constantes as variveis (figura 2.2) e os sinais que sero abordados no item 2.3 [Ashenden, 1990]. CONSTANT real:= 2.71828; VARIABLE count: INTEGER:=0;
Figura 2.2: Declarao de uma constante e varivel

2.2.4. Expresses e Operadores Expresses em VHDL so como expresses em outras linguagens de programao. Uma Expresso uma combinao de tipos primrios e operadores. Tipos primrios incluem nome de objetos, literais, chamadas a funes e expresses entre parnteses [Ashenden, 1990]. Os operadores so listados na tabela 2.1.
OPERADORES

Lgicos Relacionais Aritmticos

And, Or, Nand, Nor, Xor, Not =, /=, <, <=, >, >= +, -, *, /, **

Tabela 2.1: Operadores em VHDL

2.2.5. Sentenas VHDL contm vrias facilidades para modificao do estado dos objetos e para controle do fluxo de execuo dos modelos. Sentenas em VHDL so como sentenas em outras linguagens de programao. As estruturas sintticas das principais sentenas utilizadas em VHDL so mostradas abaixo na figura 2.3.[Ashenden, 1990]. IF condio THEN seqncia de sentenas {ELSEIF condio THEN seqncia de sentenas} [ELSE seqncia de sentenas] END IF; CASE alternativa OF WHEN opo => seqncia de sentenas END CASE; [loop_label:][ WHILE condio|FOR identificador IN faixa] LOOP seqncia de sentenas END LOOP [loop_label];
Figura 2.3: A estruturas sintticas das principais sentenas utilizadas em VHDL

2.3 Estrutura da linguagem Podemos dividir uma especificao VHDL em duas partes fundamentais. A primeira define a interface e a segunda, o seu comportamento. A interface definida atravs da declarao entity, onde se declaram o nome do componente e suas portas de entrada e sada. O componente XOR, de duas entradas, teria a declarao entity conforme a figura 2.4: ENTITY XOR IS PORT( I1, I2 : IN BIT; O : OUT BIT;) END XOR;
Figura 2.4: A entidade de uma porta XOR de 2 entradas

O comportamento definido atravs da declarao architecture, onde se escreve o programa VHDL que ir descrever o funcionamento do circuito. Nela definimos as relaes entre entrada e sada por meio algortmico. Utilizando o mesmo exemplo acima (figura 2.4), teramos a arquitetura correspondente conforme a figura 2.5: ARCHITECTURE porta_XOR of XOR IS BEGIN O <= I1 XOR I2; END porta_XOR;
Figura 2.5: A arquitetura de um porta XOR

O corpo de uma arquitetura tambm pode fazer uso de outras entidades descritas separadamente. Para isto, a arquitetura deve declarar componentes que podem ser descritos como modelos que definem entidades virtuais que podem ser instanciados [Ashenden, 1990]. A figura 2.6 demonstra a declarao de um componente. COMPONENT And2; PORT (In1, In2 Ou END COMPONENT; : IN BIT; : OUT BIT;);

Figura 2.6: Declarao de um componente

Em VHDL , para realizarmos a conexo dos componentes de uma estrutura, utilizamos o objeto signal. Veremos adiante, ainda neste item, a utilizao de sinais na execuo e simulao de programas VHDL. A figura 2.7 mostra uma declarao do objeto signal. SIGNAL A: BIT := 0;
Figura 2.7 - Declarao de um signal

A unidade primria de descrio do comportamento de um circuito o processo ( process). Um processo uma seqncia de cdigos que podem ser ativados em resposta mudana de estados. Quando mais de um processo ativado, eles executam concorrentemente. Existem dois estados possveis para um processo: suspenso e ativo. Todos os processos do modelo podem ficar ativos em qualquer instante [Lipsett, 1989]. O process declarado em uma architecture. A figura 2.8 mostra a declarao de um processo. PROCESS BEGIN WAIT ON A, B UNTIL Enable = 1; T <= A AND B; END PROCESS;
Figura 2.8: Declarao de um processo

A mudana entre os estados de um processo controlada por uma sentena chamada wait. Quando o processo executa a sentena wait ele suspenso e as condies para sua reativao so ajustadas. Existem algumas formas de utilizao da sentena wait, conforme mostrado na figura 2.9. WAIT; WAIT ON signal-list; WAIT UNTIL condition; WAIT FOR time-expression;
Figura 2.9: Utilizao da sentena wait

A primeira forma faz com que o processo fique suspenso indefinidamente. Depois da execuo da sentena, o processo no ir ser ativado novamente durante a simulao. A segunda forma suspende o processo, definindo uma lista de sinais que devero ser sensibilizados para sua reativao. A terceira forma especifica uma condio, que quando verdadeira, reativa o processo. E finalmente, a ltima forma determina um tempo que o processo deve permanecer suspenso, para, ento, ser reativado. Essas formas podem ser combinadas em formas mais complexas, como podemos ver na figura 2.10 [Lipsett, 1989]. Uma outra questo importante na estrutura dos programas VHDL a temporizao para que os valores sejam atribudos aos respectivos sinais. A determinao de tempos pode ser controlada pela sentena after. A figura 2.10 demonstra esse efeito. SIGNAL S: INTEGER := 0; P1: PROCESS BEGIN S <= 1 AFTER 1 ns; S <= 2 AFTER 2 ns; WAIT; END PROCESS;
Figura 2.10 - Utilizao da sentena after

2.4 A modelagem de hardware VHDL uma linguagem genrica para descrever sistemas digitais de hardware. Ela no faz aluso cerca da tecnologia ou da metodologia usada para descrever o sistema. Ao invs disso, uma abstrao dos sistemas digitais de hardware usada como um dos principais fundamentos da linguagem. Esta abstrao inclui comportamento, temporizao e caractersticas estruturais dos sistemas digitais. Essas caractersticas integram uma linguagem singular que permite uma ampla faixa de opes para descrio e esquematizao. O modelo geral em que VHDL se baseia consiste em dois modelos interdependentes: o modelo comportamental e o modelo estrutural. O comportamental se divide em fluxo de dados e algortmico. O modelo estrutural define um circuito atravs de seus componentes e a ligao entre eles. O modelo comportamental de fluxo de dados define claramente a relao E/S atravs de funes booleanas e por fim, o modelo comportamental algortmico modela um circuito atravs da escrita de um programa que defina o seu comportamento. A linguagem VHDL permite a descrio de hardware em um dos modelos ou at em uma combinao de ambos, o que d linguagem VHDL poder e aplicabilidade.

2.4.1. O modelo comportamental Comportamento pode ser definido como a interpretao funcional de um sistema particular. Isto no implica na existncia de modelos estruturais puros ou modelos comportamentais puros. Todos os modelos possuem estrutura e comportamento. Em algumas linguagens e sistemas para automao de projetos, o comportamento no acessvel para o projetista a no ser atravs do uso pr-definido de bibliotecas. Em VHDL, entretanto, comportamento diretamente integrado na linguagem e o projetista tem a opo de misturar estrutura e comportamento em qualquer instncia do modelo. Um sistema digital um sistema discreto, isto , transforma valores discretos de entrada em valores discretos de sada [Lipsett, 1989]. Ele trabalha aplicando um nmero de operaes ou transformaes nos valores de entrada. Os resultados dessas operaes so passados a outras operaes e finalmente para os valores de sada. Uma representao grfica desse conceito mostrada na figura 2.11.

Figura 2.11: Representao de sistemas discretos

Como exemplo, consideremos um sistema discreto P cujo comportamento descrito atravs de uma funo lgica XOR. A funo XOR chamada de ou-exclusivo ou exclusive-or, pois essa funo origina-se do fato que o valor da funo igual a 1 quando uma das variveis, na excluso da outra, tiver valor lgico 1 [Taub, 1994]. Esse sistema tem duas entradas, I1 e I2, e uma sada OUT. O sistema discreto mostrado na figura 2.12.

Figura 2.12: Sistema discreto com duas entradas e uma sada

Os sistemas discretos podem ser definidos de formas muito simples formas muito complexas. Como exemplo, consideraremos o sistema discreto P mostrado anteriormente na figura. 2.12. A figura 2.13 mostra a representao desse sistema ilustrando o processo interno de implementao. O sistema pode reagir toda vez q ue a entrada muda.

Figura 2.13: Implementao interna de uma porta XOR com uma nica operao Em muitos sistemas discretos, possvel decompor o comportamento em vrias operaes. Por exemplo, esse mesmo sistema pode ser representado por um sistema discreto equivalente Q que possui trs operaes. Esse novo sistema mostrado na figura 2.14. O sistema discreto Q tem trs operaes que, funcionalmente, so equivalentes ao sistema P, descrito anteriormente em uma nica operao. 2.4.2. O modelo estrutural Quando um modelo de sistema digital requer mais do que algumas operaes, a representao do sistema discreto associado pode se tornar difcil de gerenciar. Muitos sistemas digitais so desenhados pela combinao de vrios subsistemas unidos. Um sistema digital que usa esse sistema um novo sistema discreto incorporando cada um dos subsistemas.

Figura 2.14 - Implementao interna de uma porta XOR com trs operaes

Como exemplo, voltemos ao sistema discreto Q mostrado anteriormente na figura 2.14. Esse sistema requer trs operaes, que podem ser quebradas em duas sees funcionais: estgio 1 e estgio 2, como mostrado na figura 2.15. As sees funcionais so blocos das operaes que elas contm. Olhando para as sees como blocos possvel ignorar as reais implementaes das operaes.

Figura 2.15: Esquema estrutural do sistema Q

3 Tcnica de traduo Tradutores so programas especficos que convertem um programa escrito em uma linguagem fonte para um programa escrito em uma linguagem alvo. Temos nos tradutores a singularidade de que os programas em linguagem fonte e linguagem alvo so equivalentes [Machado, 1992]. 3.1 O conceito de compilao Podemos encarar o computador como uma mquina de nveis ou camadas, onde cada camada representa uma abstrao da camada inferior, ou seja, ao trabalhar em uma camada, no se faz necessrio o conhecimento das camadas inferiores. Esta viso modular e abstrata chamada mquina virtual [Machado, 1992]. Na realidade, um computador possui tantos nveis quantos forem necessrios para adequar o usurio s suas diversas aplicaes. Quando o usurio est trabalhando em um desses nveis, no necessita saber da existncia das outras camadas, acima ou abaixo de sua mquina virtual. A maioria dos computadores modernos possui dois ou mais nveis. As mquinas de seis nveis so muito comuns, como est mostrado na figura 3.1. O nvel 0 o hardware verdadeiro da mquina. Seus circuitos executam os programas em linguagem de mquina de nvel 1 [Tanembaum, 1992].

5 4 3 2 1 0

Aplicativos Linguagem de montagem Sistema Operacional Mquina convencional Microprogramao Lgica digital Figura 3.1: Mquina de nveis

Quando os programas em linguagem fonte e linguagem alvo esto em diferentes nveis, o tradutor chamado de compilador [Machado, 1992]. H ainda, um tipo mais especfico de compilador, chamado de montador, que realiza a traduo de programas escritos em linguagem de montagem (nvel 4) para a linguagem de mquina (nvel 2) [Tanembaum, 1992]. O tradutor converte programas em linguagem fonte para programas em linguagem alvo, sem que haja mudana de nvel [Machado, 1992]. O processo de traduo composto de duas etapas fundamentais, a anlise e a sntese. Durante a anlise, o programa fonte dividido nas suas partes constituintes e criada uma representao intermediria para o mesmo. A sntese cria, a partir da representao intermediria criada na anlise, o cdigo alvo desejado [1, 13]. O processo de anlise registra as operaes implicadas pelo programa fonte, em uma estrutura hierrquica, chamada rvore. usual que seja criada uma rvore sinttica, na qual cada n representa uma operao e o filho de um n representa o argumento da operao [Aho, 1995], como exemplifica a figura 3.2.

Figura 3.2: rvore abstrata

3.2 Os processos de anlise Em compiladores, o processo de anlise dividido em trs fases distintas, a anlise lxica ou linear, a anlise sinttica ou hierrquica e a anlise semntica [Aho, 1995]. Na anlise lxica um conjunto de caracteres lido da esquerda para a direita e agrupados em tokens, que so seqncias de caracteres que possuem um significado coletivo. Na anlise sinttica, os caracteres ou tokens so agrupados hierarquicamente em colees aninhadas com significado coletivo. E finalmente, a anlise semntica realiza certas verificaes, a fim de se assegurar que os componentes de um programa se combinam de forma significativa [Aho, 1995]. Como exemplificao de anlise lxica, podemos tomar os caracteres da linha de comando de atribuio mostrada na figura 3.3. montante := deposito + taxa_de_juros * 60
Figura 3.3: Linha de comando de atribuio

Os caracteres da linha de comando da figura 3.3. poderiam ser agrupados nos seguintes tokens: o identificador montante; o smbolo de atribuio (:=); o identificador deposito; o sinal de adio (+); o identificador taxa_juros; o sinal de multiplicao (*) e a constante 60. Assim, a anlise lxica agrupa os caracteres, identificando a qual grupo cada conjunto de caracteres pertence. Os espaos que separam os caracteres so automaticamente descartados pelo analisador lxico [Aho, 1995]. Na anlise sinttica, os tokens do programa fonte so agrupados em frases gramaticais, que so utilizadas pelo compilador, a fim de sintetizar a sada [Aho, 1995]. A fase de anlise semntica verifica os erros semnticos no programa fonte e captura as informaes de tipo para a fase subseqente de gerao de cdigo. Utiliza a estrutura hierrquica determinada pela fase de anlise sinttica,

afim de identificar os operadores e operandos das expresses e enunciados. Um importante componente da anlise semntica a verificao de tipos. Nela o compilador checa se cada operador recebe os operandos que so permitidos pela especificao da linguagem fonte [Aho, 1995]. 3.3 Fases de um compilador Podemos entender o funcionamento de um compilador considerando que ele seja composto por vrias fases, onde cada uma realiza uma transformao do programa fonte, de uma representao para a outra. Na prtica, algumas das fases podem ser agrupadas e a representao intermediria entre as mesmas no precisa ser explicitamente construda [Aho, 1995]. As fases de um compilador so mostradas na figura 3.4. As fases de anlise lxica, sinttica e semntica foram explicadas no item anterior. Em alguns compiladores, gerada uma representao intermediria explcita do programa fonte, aps as anlises sinttica e semntica. Essa representao deveria possuir duas propriedades importantes: ser fcil de produzir e fcil de trad uzir no programa alvo. Esse o objetivo da fase de gerao de cdigo intermedirio. A fase de otimizao tenta melhorar o cdigo intermedirio, de tal forma que venha resultar um cdigo de mquina mais rpido em tempo de execuo. A fase final do compilador a gerao do cdigo alvo. Na figura 3.4 temos um esquema que mostra todas as fases do compilador. Programa fonte Anlise lxica Anlise Sinttica Anlise Semntica Gerao de cdigo intermedirio Otimizao de cdigo Gerao de cdigo Programa alvo
Figura 3.4: Esquema de um compilador

3.4 Ferramentas automticas de construo de analisadores Esse item tem o objetivo de mostrar algumas ferramentas de gerao automtica de analisadores lxicos e sintticos. O sistema operacional UNIX vem acompanhado o LEX [Kowaltowski, 1983] que permite o desenvolvimento de analisadores lxicos e o YACC [Kowaltowski, 1983] que permite o desenvolvimento de analisadores sintticos. Atravs de uma linguagem chamada Lex de mesmo nome dado a ferramenta, esta baseada em padres especificados por expresses regulares, podemos gerar um autmato finito que reconhea essas expresses regulares e execute aes. 3.4.1. O gerador de analisadores lxicos LEX O programa LEX constitudo de trs partes, separadas por uma linha com %%, como mostra a figura 3.5. A seo de declaraes inclui declaraes de variveis, de constantes manifestas e de definies regulares. Nas regras de traduo, so enunciadas expresses regulares que descrevero padres chamados lexemas e a estes associadas aes escritas em C [7, 14]. A terceira seo contm quaisquer procedimentos auxiliares [Aho, 1995]. A figura 3.6 um programa Lex que conta linhas representada pelo padro \n e caracteres pelo padro .. declaraes %% regras de traduo %% cdigo de usurio
Figura 3.5: Esquema de um programa LEX ou YACC

int num_lines = 0, num_chars = 0; %% \n ++num_lines; ++num_chars; . ++num_chars; %% main() { yylex(); }


Figura 3.6: Programa LEX

3.4.2. O gerador de analisadores sintticos YACC Um programa Yacc tambm possui trs partes como na fig 3.7. sendo que a seo de regras, consiste numa produo gramatical e da ao semntica associada. Uma ao semntica uma seqncia de enunciados em C [Aho, 1995]. %token NAME NUMBER %% statement: NAME '=' expression |expression{printf("= %s\n", $1);}; expression: expression'+'NUMBER{ $$= $1+$3 } | expression '-' NUMBER{ $$= $1+$3 } | NUMBER { $$ = $1 } %% yyerror(s){}
Figura 3.7: Programa YACC

Lex foi projetado para produzir analisadores lxicos que poderiam ser usados com Yacc. O analisador lxico foi desenvolvido com o auxlio da ferramenta FLEX [Monmouth, 2001] existente no LINUX, sendo esta anloga ao LEX existente no UNIX. De modo similar, o analisador sinttico foi desenvolvido com o auxlio da ferramenta BISON existente no LINUX, sendo esta anloga ao YACC existente no UNIX. Explicaes mais detalhadas sobre os uso dessas ferramentas tomando como base o projeto em desenvolvimento sero descritas no item 4.3 4 O Tradutor Nesta seo ser definida toda a implementao do tradutor, como seu modelo e o funcionamento de cada uma das partes. O tradutor segue um modelo simplificado do modelo proposto na figura 3.5. Veremos que o tradutor composto de 3 mdulos distintos, o selecionador, o analisador e o conversor. As anlises lxica e sinttica explicadas no item 4.3 so implementadas no mdulo analisador, no contendo, no entanto, uma anlise semntica. A figura 3.5 prope uma converso de cdigo em duas etapas, sendo uma gerao de cdigo intermediria e uma otimizao de cdigo. No tradutor, a gerao de cdigo ser realizada em uma nica etapa, pelo mdulo conversor, no existindo a etapa de otimizao. 4.1 O modelo do tradutor O modelo do tradutor implementado no projeto composto por trs mdulos integrados, cada qual com sua funo especfica, representada pelo diagrama esquemtico da figura 4.1. O primeiro mdulo chamado de selecionador e tem a funo de permitir ao usurio optar pela sub-rotina que deve ser traduzida, j que o tradutor se destina traduo de sub-rotinas e no de programas completos. O segundo mdulo chamado analisador, sendo composto pelos analisadores lxico e sinttico, de modo a realizar a verificao do cdigo, acusando eventuais erros ou validando-o para o prximo mdulo. O terceiro mdulo chama-se conversor e realiza a converso de cdigo C para VHDL. A implementao e o funcionamento detalhado de cada um dos mdulos citados est descrito nos itens subseqentes. 4.2 Mdulo 1 O Selecionador O primeiro mdulo do tradutor pede ao usurio que selecione a sub-rotina desejada. Caso o programa em C tenha apenas uma nica rotina, esse mdulo automaticamente ignorado e passa-se para o mdulo analisador. Seu esquema est representado na figura 4.2.

Figura 4.1: O modelo do tradutor

Figura 4.2: Mdulo 1 - SELECIONADOR

Esse mdulo faz uma primeira varredura no programa buscando as sub-rotinas existentes. A identificao de cada sub-rotina se d pelo reconhecimento sinttico da declarao que a define. Um exemplo da declarao de uma sub-rotina pode ser visto na figura 4.3, onde podem ser observados os componentes sintticos. int soma (int valor1, int valor2)
Figura 4.3: Declarao de uma funo em C

Ao identificar as sub-rotinas pelo processo de leitura linha por linha do cdigo C e reconhecimento do padro sinttico, o selecionador as separa e pergunta ao usurio qual delas a subrotina desejada. Um arquivo de sada com a sub-rotina selecionada ento criado, o qual ser a entrada do mdulo 2 do tradutor, onde sero realizadas as anlises lxica e sinttica. O algoritmo apresentado faz um lao de repetio, que realiza a leitura de cada linha e busca o caracter ) seguido do caracter {, o que sintaticamente, seria a definio de uma sub-rotina. A seguir, testado se a linha contm algum dos comandos FOR, WHILE ou IF, para garantir que o token { refere-se a uma sub-rotina. Confirmando-se tratar-se de uma sub-rotina, a posio da linha registrada. Um controle de contagem de chaves implementado, de modo a garantir que se tenha um mesmo nmero de chaves abertas e fechadas. Por fim, as linhas registradas so exibidas e o usurio pode escolher entre uma delas.

Mdulo 2 O analisador O mdulo analisador do tradutor composto pelos analisadores lxico e sinttico. A finalidade destes dois analisadores validar sintaticamente o cdigo C da rotina selecionada. O analisador lxico foi desenvolvido com o auxlio da ferramenta FLEX [Monmouth, 2001] existente no LINUX, sendo esta anloga ao LEX [Monmouth, 2001] existente no UNIX. O FLEX uma ferramenta capaz de gerar, a partir de um arquivo de entrada, um scanner, ou seja, um programa capaz de reconhecer padres lxicos em um dado texto. O arquivo de entrada, denominado lexico.l, deve conter a especificao da linguagem atravs de suas expresses regulares. No projeto, o arquivo lexico.l define, ento, as expresses regulares da linguagem C. Uma vez escrito o arquivo lexico.l dentro dos padres sintticos exigidos pela ferramenta LEX, deve-se execut-lo atravs da chamada FLEX lexico.l. Essa chamada gera o cdigo do scanner, escrito em linguagem C, para o arquivo de sada lex.yy.c. De modo similar, o analisador sinttico foi desenvolvido com o auxlio da ferramenta BISON [Monmouth, 2001] existente no LINUX, sendo esta anloga ao YACC [Monmouth, 2001] existente no UNIX. O BISON uma ferramenta capaz de gerar, a partir de um arquivo de entrada, um parser, ou seja, um analisador sinttico. O arquivo de entrada denominado sintatico.y, deve conter a descrio de uma gramtica livre de contexto (LALR). No projeto, o arquivo sintatico.y define a gramtica da linguagem C [Lysator, 2001]. Uma vez escrito o arquivo sintatico.y, dentro dos padres sintticos exigidos pela ferramenta BISON, deve-se execut-lo atravs da chamada BISON sintatico.y. Essa chamada gera o cdigo do parser escrito em linguagem C, no arquivo de sada y.tab.c.[Monmouth, 2001] Na implementao do arquivo sintatico.y foi inserida a declarao #include <lex.yy.c>, de modo que o parser pudesse realizar uma chamada ao scanner. O programa principal possui a declarao #include <y.tab.h> o que possibilita que ele realize uma chamada ao parser. Desse modo, o programa principal inicia o processo de anlise fazendo uma chamada ao parser atravs da funo yyparse(). Ao ser executado, o parser, antes de fazer a anlise sinttica, chama o scanner atravs da funo yylex()[Monmouth, 2001]. Feita a anlise lxica, os tokens so passados ao parser para a anlise sinttica, que pede o prximo token ao scanner e assim sucessivamente, conforme a figura 4.5. Ao terminar sua tarefa, caso no haja a ocorrncia de erros, o mdulo analisador garante a validade do arquivo C a ser traduzido. O mdulo conversor ento acionado para realizar a converso de cdigo propriamente dita.

4.3

Figura 4.5: Mdulo 2 - analisador

4.4 Mdulo 3 O conversor O terceiro mdulo do tradutor responsvel pela converso da sub-rotina em C para um cdigo VHDL. Esta subrotina foi obtida pelo selecionador e validada pelo analisador. A estrutura de funcionamento do conversor segue dois princpios bsicos: a identificao sinttica e a consulta tabela de smbolos. Semelhante ao funcionamento do analisador, esse mdulo faz a leitura do arquivo de entrada e identifica no conjunto de lexemas a sua formao sinttica. Uma vez identificada a formao atravs de todos os seus termos, pode-se escrever um arquivo de sada conforme a estrutura da linguagem VHDL. Um fato importante a citar que o conversor realiza a leitura dos lexemas linha por linha e, automaticamente, escreve linha por linha o arquivo de sada. Considere o trecho de instruo C mostrado na figura 4.6. Uma vez identificada a estrutura for, o conversor escreve a estrutura for correspondente em VHDL. Cdigo C: for (a=0;a<=10;a++) Cdigo VHDL: for a in 0 to 10
Figura 4.6: Traduo de uma estrutura FOR

Um outro exemplo pode ser visto para o caso da declarao de uma varivel como na figura 4.7. Cdigo C: int a=0; Cdigo VHDL: variable a: integer :=0;
Figura 4.7: Traduo de uma declarao de varivel com atribuio de um valor

Durante o processo de anlise, o analisador lxico realiza uma pr-converso. No caso dos smbolos utilizados pela linguagem, o analisador recorre utilizao de uma tabela de smbolos que guarda a relao de todos os smbolos utilizados em C com os utilizados em VHDL. Quando, por exemplo, encontra-se o operador lgico && em C, o scanner o substitui automaticamente pelo operador and em VHDL. Uma ltima considerao a ser feita a linguagem de programao em que est implementado o tradutor. O Linux a plataforma utilizada no Laboratrio de Computao do Departamento de Engenharia de Sistemas e Computao da Universidade do Estado do Rio de Janeiro. O compilador Pascal disponvel. A linguagem Pascal de ampla utilizao e extremamente difundida. Por estas razes, a linguagem Pascal foi escolhida para escrita do tradutor. 5 Questes relevantes traduo Devemos analisar todas as questes que envolvem a construo do tradutor, principalmente aquelas ligadas ao que se admite como entrada e o que se espera na sada. preciso definir claramente o conjunto da linguagem C que deve ser considerado na traduo. Qualquer estrutura ou funo deve ser avaliada de modo a integrar ou no esse conjunto. O tradutor implementa o cdigo VHDL voltado para o modelo comportamental, como d escrito no item 1.2. 5.1 O formato VHDL desejvel Discute-se nessa seo o formato do cdigo VHDL que ser gerado pelo tradutor. Nossa tarefa transformar a subrotina C em uma especificao VHDL de modo que haja uma correspondncia direta entre a tarefa realizada pela sub-rotina e a tarefa realizada pela pastilha especialista. importante ressaltar que, dentre os possveis modelos de descrio de hardware em VHDL, ser utilizado o modelo comportamental algortmico, visto que realizada uma traduo de uma rotina de um programa. Esse modelo torna a relao entre os cdigos mais direta. Para descrever a interface de uma pastilha em VHDL, cria-se uma entity, definindo suas portas de entrada e sada, que devem corresponder aos parmetros de entrada e sada da subrotina. O cdigo da sub-rotina, que define as tarefas realizadas por ela, deve estar descrito na architecture da entidade criada anteriormente. Dessa forma, conseguimos criar uma relao direta entre o objeto de entrada (a sub-rotina em C) e a correspondente descrio da entidade e sua arquitetura escritas em VHDL. Vejamos a figura 5.1. Podemos observar que a sub-rotina recebe parmetros de entrada e retorna um valor como sada. Esses parmetros passados como variveis em linguagem C correspondem s portas definidas na entity no cdigo VHDL (ver item 5.3), conforme a figura 5.2. int Soma (int Num1, int Num2) { return Num1 + Num2 }
Figura 5.1: Sub-rotina C

O exemplo acima, nos d uma definio de como o formato do cdigo VHDL de sada. Todos o s parmetros de entrada da sub-rotina correspondem s portas de entrada da entidade. Caso algum parmetro de entrada seja alterado ao longo da sub-rotina, torna-se uma porta de entrada/sada, defina como inout no cdigo VHDL. Caso a sub-rotina a ser traduzida seja uma funo, ou seja, retorne um valor como resultado, como na figura 5.1, deve-se criar uma porta de sada na declarao da entity correspondente. No caso da traduo de procedimentos, que no retornam valores, a porta de sada no tem finalidade, logo, no ser criada. Por fim, uma arquitetura sempre implementada, realizando a funo antes realizada pela sub-rotina escrita em linguagem C. Nesse ponto torna-se fundamental observar a facilidade que a linguagem VHDL nos permite. Sendo uma linguagem estruturada como uma linguagem de programao usual, torna a traduo direta, ou seja, a cada instruo em C haver uma instruo VHDL correspondente.

ENTITY soma IS PORT ( num1, num2 : IN INTEGER; saida : OUT INTEGER END soma; ARCHITECTURE arc_soma OF soma IS BEGIN saida <= num1 + num2; END arc_soma;
Figura 5.2: Programa VHDL correspondente

5.2

Tratando os tipos de dados derivados

5.2.1 Vetores Temos de levar em conta a questo do uso de vetores nos dois possveis casos: quando so declarados no procedimento ou quando a funo a ser traduzida os recebe como parmetros. Caso considerssemos que os circuitos descritos pelo cdigo VHDL gerado devessem alocar fisicamente vetores, eles precisariam ser implementados com estruturas de memria. Convencionamos que no processo de traduo, o programador tem a liberdade de escolher entre manter os vetores em memria, passando os ponteiros referentes s suas posies, ou passar os vetores completos para serem armazenados na pastilha. No primeiro caso, a soluo adotada foi passar os ponteiros das posies iniciais dos vetores na memria principal, de modo que a pastilha tenha acesso ao vetor atravs de DMA (Acesso direto Memria). O trecho VHDL a ser gerado deve, ento, ser escrito de forma que ao identificar um vetor, crie portas que sejam capazes de armazenar os endereos de memria onde se encontram os vetores. Nesse caso, o programador deve declarar o vetor como um ponteiro. Em C, a indicao de um tipo de dado ponteiro se d pelo smbol o (*), conforme a figura 5.3. int *a[100]; // Declarao do vetor inteiro como um ponteiro
Figura 5.3: Declarao de um vetor em C

Vejamos o exemplo da figura 5.4., que realiza a soma entre dois vetores que so passados como parmetros. A especificao VHDL gerada pelo tradutor mostrada na figura 5.5. int soma[] (int *a[], int *b[]) { int k; int vetor_soma[]; for(k=0;k<100;K++) vetor_soma[k] = a[k] + b[k]; return vetor_soma[]; }
Figura 5.4: Sub-rotina C que utiliza vetores

No programa principal, no lugar da rotina que foi traduzida, deve ser introduzida uma chamada pastilha que foi criada. Para realizar essa chamada, sugerimos o conjunto de instrues proposto no estudo realizado sobre o microprocessador FPGA [Machado, 1998]. Como o projeto r efere-se ao desenvolvimento do tradutor, a questo da chamada pastilha no ser abordada com profundidade. Os vetores a e b da figura 5.4 so representados pelas portas de entrada a e b da figura 5.5. No corpo da arquitetura, essas portas so utilizadas para enderear as posies dos respectivos vetores na memria principal. Da mesma forma, tem-se o vetor vetor_soma da figura 5.4 que representado pela porta de sada saida. Afim de permitir os acessos memria principal, so utilizados dois procedimentos: MWr, para escrita e o MRd para leitura. Ambos so considerados como procedimentos em VHDL, no implementados pelo tradutor. No segundo caso, a soluo dada foi passarmos o vetor completo como parmetro para a pastilha. Nesse caso, a declarao do v etor no possui o indicador de ponteiro. Temos o vetor sendo tratado normalmente pelo cdigo VHDL. A figura 5.7 mostra como ficaria se no utilizssemos a indicao de ponteiro no cdigo da figura 5.4, como mostra a figura 5.6.

ENTITY soma IS PORT( a, b : IN INTEGER; saida : OUT INTEGER) END soma; ARCHITECTURE arc_soma OF soma IS BEGIN PROCESS (a,b) VARIABLE k: INTEGER; BEGIN FOR k IN 0 TO 100 MWr(saida+k)=MRd(a+k)+MRd(b+k); END PROCESS; END arc_soma;
Figura 5.5: Traduo VHDL com vetor alocado na memria

int soma[] (int a[], int b[]) { int k; int vetor_soma[]; for(k=0;k<100;K++) vetor_soma[k] = a[k] + b[k]; return vetor_soma[]; }
Figura 5.6: Sub-rotina C que utiliza vetores

ENTITY soma IS PORT( a, b : VECTOR OF INTEGER; saida : VECTOR OF INTEGER) END soma; ARCHITECTURE arc_soma OF soma IS BEGIN PROCESS (a,b) VARIABLE k: Integer; BEGIN FOR k IN 0 TO 100 saida(k) = a(k) + b(k); END PROCESS; END arc_soma ;
Figura 5.7: Traduo VHDL com vetor alocado na pastilha

5.2.2 Enumeraes e registros Ainda prevendo a possibilidade da criao de tipos de dados derivados, devemos tratar os tipos enum e struct no cdigo C. Como em VHDL temos os equivalentes a essas estruturas, a traduo ser direta. O tipo enumerado declarado em VHDL como um type comum, onde definimos em sua sintaxe os elementos enumerados. J o registro, em VHDL um type definido como record. Seja o cdigo C da figura 5.8. enum dias{Dom,Seg,Ter,Qua,Qui,Sex, Sab}; struct coordenada { int x; int y; };
Figura 5.8: Traduo de um registro e um tipo enumerado

O cdigo VHDL correspondente definido como mostra a figura 5.9.

TYPE dias IS (Dom, Seg, Ter, Qua, Qui, Sex, Sab) TYPE Coordenada IS RECORD x : INTEGER; y : INTEGER; END RECORD;
Figura 5.9: Traduo de um registro e um tipo enumerado

5.3 Portas e variveis A forma de tratar as portas e variveis a serem utilizadas no cdigo VHDL deve ser considerada. Elas devem manter uma correspondncia entre os tipos de dados que foram declarados em C e os tipo s de dados existentes em VHDL. O tipo integer em VHDL ocupa 32 bits (-2.147.483.648 a 2.147.483.647) e o tipo real ocupa 64 bits (1,7 x 10-308 a 1,7 x 10308). A partir desses dados podemos realizar a traduo de acordo com a correspondncia mostrada na tabela 5.1. Tipo em C Unsigned char Char Enum Unsigned int Short int Int Unsigned long Long Float Double Long double Tipo em VHDL Integer Integer Integer Integer Integer Integer Integer Integer Real Real -

Tabela 5.1: Correspondncia entre os tipos de dados entre C e VHDL

O tipo Long Double no ser aceito, pois a linguagem VHDL no suporta nenhum tipo de dado correspondente. Podemos ver um exemplo da traduo das portas e variveis, atravs da funo diviso descrita na figura 5.10. float divisao (int a, int b) { float c; c = a/b; return c; }
Figura 5.10: Cdigo C com tipos de dados float e int

O cdigo VHDL correspondente , ento, descrito na figura 5.11, mostrada a seguir. ENTITY divisao IS PORT( a, b: IN INTEGER; saida: OUT REAL) END divisao; ARCHITECTURE arc_divisao OF divisao IS BEGIN PROCESS (a,b) VARIABLE c: real; BEGIN c := a/b; saida <= c; END PROCESS; END arc_divisao ;
Figura 5.11: Traduo do cdigo C da figura 5.10.

5.4 Tratando as sentenas Nesse item realizamos uma breve discusso sobre a traduo das sentenas de cdigo C para cdigo VHDL. Podemos afirmar que a traduo se d de forma direta. No entanto, salientamos o caso especial da sentena for, mostrada na figura 5.12. Para realizarmos a traduo, necessrio realizar uma anlise mais detalhada dos elementos definidos como expresses (exp1, exp2, exp3). Como pode ser visto na figura 4.6, a expresso exp1, contm a inicializao do identificador que ser utilizado na contagem e ao ser analisada fornece o valor inicial da faixa. A expresso exp2, contm o delimitador, que nos fornece o valor final da faixa. A expresso exp3, contm o valor do incremento. A linguagem C permite outras variaes para definio da estrutura for, que no esto previstas pelo tradutor. Cdigo C For (exp1; exp2; exp3) comando Cdigo VHDL for id in faixa loop comando end loop

Figura 5.12: Correspondncia entre a sentena for em C e VHDL

5.5 Tratando as funes e bibliotecas A linguagem C possui uma imensa variedade de funes definidas em bibliotecas, como por exemplo, as matemticas log (retorna o logaritmo neperiano) ou sin (retorna o seno), disponveis na biblioteca math.h. O uso de determinadas funes to corrente que, muitas vezes, so entendidas como partes integrantes da prpria linguagem. Na verdade, essas funes so mdulos escritos em linguagem C. Pode haver uma correspondncia entre muitas das funes em C e em VHDL. Um possvel estudo dessa correspondncia pode ser realizado futuramente visando a possibilitar o uso das funes em C e a traduo para a funo correspondente automaticamente. Qualquer chamada a essas funes no cdigo C ser traduzida para uma chamada mesma funo em VHDL. lgico que uma chamada a uma funo no existente acarretar em um erro na compilao do programa VHDL. O projeto no prev a traduo das bibliotecas includas no cdigo C. Por essa razo, o analisador sinttico encara a declarao #include <nome_da_biblioteca> como um erro. 6 Estudos de casos Para fins de validao sero realizados dois estudos de caso que tomaro como ponto de partida uma rotina em C para que se realize a traduo, compilao do cdigo VHDL gerado e sua simulao. Um terceiro estudo de caso propem a idia inversa, ou seja, um cdigo VHDL descrito por Chang [Chang, 1987] tomado inicialmente. Procura-se, ento, escrever um cdigo C que fosse correspondente. Realizamos a traduo do cdigo C para compar-lo com o primeiro cdigo VHDL proposto. As simulaes sero realizadas no simulador My VHDL produzido pela My Cad Inc [MyCad, 2000]. 6.1 Caso 1 Rotina de clculo de delta de uma equao do 2 grau Nesse caso, consideremos a rotina C da figura 6.1, que possui a finalidade de calcular o valor delta (b 2 4.a.c) de uma equao do segundo grau. Caso delta seja maior ou igual a zero o resultado 1. Caso delta seja negativo, o resultado 0. Os coeficientes a, b e c da equao so passados como parmetro para a rotina. int testa_delta (int a, int b, intc) { int delta; delta = b*b 4*a*c; If (delta < 0 ) return 0; else return 1; }
Figura 6.1: Cdigo C de validao do projeto

Seguindo os passos do tradutor, primeiramente ser identificada a rotina delta que dever ser confirmada pelo usurio como a rotina a ser traduzida. Nesse exemplo ela ser a nica rotina presente no cdigo. Em seguida, ser realizada a etapa de anlise, sendo listado na tela o cdigo da rotina. No caso de erro, o analisador interrompe o processo e indica a localizao de erro. Caso contrrio, o tradutor gera o arquivo delta.vhd, conforme figura 6.2.

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY testa_delta IS PORT( a,b,c : IN integer; saida : OUT INTEGER ); END testa_delta; ARCHITECTURE arc_ testa_delta OF testa_delta IS BEGIN PROCESS (a,b,c) VARIABLE delat:INTEGER; BEGIN delta := b*b - 4*a*c; IF (delta < 0) THEN saida <= 0; ELSE saida <= 1; END IF; END PROCESS; END arc_ testa_delta;
Figura 6.2: Cdigo VHDL gerado pelo tradutor

O caso 1 utiliza uma rotina de clculo de delta, com retorno 0 ou 1, dependendo do valor de delta encontrado, como j mencionado. Para realizarmos a simulao deve-se ter um arquivo VHDL para gerao dos sinais de entrada, ou estmulos, que correspondem aos coeficientes a, b e c. A tabela 6.1 mostra os valores atribudos aos coeficientes e as respectivas sadas esperadas. Valores dos sinais a 1 1 2 1 b 2 -5 3 -4 c 2 6 4 4 Sada 0 1 0 1
Tabela 6.1: Valores dos sinais do programa testado

O cdigo do arquivo VHDL para gerao dos sinais de entrada, ou estmulos mencionado est listado na figura 6.3. Observa-se que na declarao da entidade no h definio de portas de entrada e sada. Na parte declarativa da arquitetura, encontramos a declarao do componente Testa_Delta, sob teste. Dentro do corpo da arquitetura, indicamos a existncia de somente um componente (L1), de tipo Testa_Delta. Neste momento torna-se necessrio fazer um mapeamento dos sinais internos com os sinais de interface do componente. ENTITY TB_delta IS END TB_delta; ARCHITECTURE TB_delta_A OF TB_delta IS SIGNAL TB_a, TB_b, TB_c, TB_s: INTEGER; COMPONENT testa_delta PORT( a,b,c : IN INTEGER; saida : OUT INTEGER); END component; BEGIN L1: testa_delta PORT MAP(TB_a, TB_b, TB_c, TB_s); PROCESS BEGIN TB_a <= 1, 1 AFTER 100 ns, 2 AFTER 200 ns, 1 AFTER 300 ns; TB_b <= 2,-5 AFTER 100 ns, 3 AFTER 200 ns, -4 AFTER 300 ns; TB_c <= 2, 6 AFTER 100 ns, 4 AFTER 200 ns, 4 AFTER 300 ns; WAIT; END PROCESS; END TB_delta_A;
Figura 6.3: Cdigo de estmulos de sinal utilizado na simulao

A simulao gerou o diagrama temporal da figura 6.4. Verificando o diagrama temporal, podemos compar -lo com a tabela 6.1, verificando que as sadas apresentadas pelo simulador correspondem s sadas previstas pela referida tabela.

Figura 6.4: Diagrama temporal resultante da simulao

6.2 Caso 2 Rotina que testa se um valor ou no primo Nesse caso, consideremos a rotina C da figura 6.5, que possui a finalidade de responder se um valor passado a ela como parmetro ou no um nmero primo. Caso seja, ser retornado pela funo o valor 1, caso contrrio, a funo retornar o valor 0. int testa_primo(int num){ int teste = 1, i; if (num % 2) { for (i=3; i<(num/2); i=i+2) if (!(num % i)) teste=0; } else if (num!= 2) teste=0; return teste; }
Figura 6.5: Rotina C que testa se um nmero primo

Criamos o arquivo primo.c com a rotina acima. Da mesma forma como foi realizado no caso 1, o tradutor C2VHDL executado a partir da linha de comando c2vhdl primo.c. O tradutor realiza as anlises lxica e sinttica da rotina C e gera o arquivo traduzido primo.vhd, listado no figura 6.6. Para realizarmos a simulao, devemos criar uma tabela dos valores que sero utilizados pelo arquivo de gerao dos sinais de entrada, que correspondem ao valor num. A tabela 6.2 mostra os valores atribudos a num e as respectivas sadas esperadas. De acordo com a tabela 6.2, podemos gerar o arquivo tipo vhd de estmulo de sinais, que mostrado na figura 6.7. Uma vez compilados ambos os arquivos, de forma anloga ao realizado no caso 1, podemos realizar a simulao e execuo do projeto, de modo a obtermos o d iagrama temporal da figura 6.8. Valores dos sinais num Sada 1 1 2 1 3 1 4 0 5 1 6 0 7 1 8 0

Tabela 6.2: Valores dos sinais do programa testado

ENTITY testa-primo is PORT( n: IN INTEGER; saida: OUT INTEGER ); END testa-primo; ARCHITECTURE arc_ testa-primo OF testa-primo IS BEGIN PROCESS (n) VARIABLE teste, i:INTEGER; BEGIN teste:= 1; IF ((n rem 2) = 1) THEN itere: FOR i IN 3 TO (n/2) LOOP IF (not((n rem I)=1)) THEN teste:=0; END IF; END LOOP itere; ELSE IF (n /= 2) THEN teste:=0; END IF; END IF; saida <= teste; END PROCESS; END arc_testa_primo;
Figura 6.6: Cdigo VHDL gerado pelo tradutor

ENTITY TB_primo IS END TB_primo; ARCHITECTURE TB_primo_A OF TB_primo IS SIGNAL TB_n, TB_s : INTEGER; COMPONENT testa_primo PORT( n: IN integer; saida: OUT INTEGER); END COMPONENT; BEGIN L1: testa_primo PORT MAP(TB_n, TB_s); PROCESS BEGIN TB_n <= 1, 2 AFTER 100 ns, 3 AFTER 200 ns, 4 AFTER 300 ns, 5 AFTER 400 ns, 6 AFTER 500 ns, 7 AFTER 600 ns, 8 AFTER 700 ns, 9 AFTER 800 ns; WAIT; END PROCESS; END TB_primo_A;
Figura 6.7: Cdigo de estmulos utilizado na simulao

Verificando o diagrama temporal, podemos compar-lo com a tabela 6.2, verificando que as sadas apresentadas pelo simulador correspondem s sadas previstas pela referida tabela.

Figura 6.8: Resultado da simulao do componente testa_primo

7 Concluso e melhorias futuras O objetivo principal desse projeto foi o desenvolvimento de um tradutor que fosse capaz de gerar um cdigo VHDL a partir de uma rotina escrita em linguagem C. De acordo com os testes realizados de validao do cdigo gerado, entendemos que atingimos esse objetivo com xito. Contudo, vrios estudos e consideraes foram feitos at chegarmos implementao que foi realizada nesse projeto. Em uma primeira anlise do problema, optamos por traduzirmos o cdigo assembly da rotina C. Esse caminho foi proposto, pois o cdigo assembly apresenta uma estrutura que utiliza diretamente entidades fsicas, como registradores, o que facilitaria a converso para o cdigo VHDL utilizando-se o modelo estrutural. Desta forma uma futura etapa de sntese do circuito seria facilitada. Estudos posteriores nos mostraram, que, devido ao fato da linguagem VHDL ter uma estrutura de linguagem de programao estruturada, o processo de traduo poderia ser feito apro veitando a correspondncia da rotina em C. Assim, o cdigo VHDL gerado se torna mais legvel e com maior facilidade de acompanhamento da simulao por parte do usurio. Essa proposta utiliza o modelo comportamental da linguagem VHDL. Diante desse fato, a primeira proposta foi abandonada. Algumas sugestes so aqui apresentadas, que permitiro melhorar o projeto do tradutor. Uma enorme gama de funes existentes nas bibliotecas disponveis em linguagem C no esto sendo aceitas na traduo (ver item 5.5). Logo, um avano considervel seria a traduo dessas funes, de modo a disponibiliz-las em bibliotecas VHDL. Podemos indicar melhorias na implementao do tradutor, visando a aproxim-lo do modelo terico proposto na seo 3, figura 3.5. No foram implementados mdulos de anlise semntica e de otimizao de cdigo, ficando aqui uma proposta de seus desenvolvimentos. Finalmente, analisando a proposta mais geral apresentada na introduo, acreditamos que ao disponibilizarmos o tradutor C2VHDL, um passo importante foi dado na direo de modelagem de circuitos digitais a partir de trechos de software, com o intuito de otimizao de programas computacionais.

8 Referncias Bibliogrficas [Aho, 1995] Aho, Alfred, Compiladores, princpios, tcnicas e ferramentas, Rio de Janeiro, Livros cientficos Editora, 1995. [Tanembaum, 1992] Tanembaum, Andrew, Organizao estruturada de computadores, Rio de Janeiro: Prentice Hall do Brasil, 1992. [Ashenden, 1990] Ashenden, Peter J., The VHDL Cookbook, Dept. Computer Science University of Adelaide, Australia, 1990. [Chang, 1987] Chang, K. C., Digital Desing and Modeling with VHDL ans Synthesis, IEEE Computer Society Press, 1987 [Monmouth, 2001] Documentao das ferramentas automticas de gerao de analisadores lxico (LEX) e sinttico (YACC), http://www.monmouth.com/%7ewstreett/lex-yacc. [Lysator, 2001] Gramtica da Linguagem C, http://www.lysator.liu.se. [Kowaltowski, 1983] Kowaltowski, Tomasz, Implementao de linguagens de programao, Rio de Janeiro: Ed. Guanabara Dois, 1983. [Lipsett, 1989] Lipsett, Roger, VHDL: Hardware Description and Desing, Massachusetts: Kluwer Academic Publishiers, 1989. [Machado, 1992] Machado, Francis Berenger, Introduo arquitetura de sistemas operacionais, Rio de Janeiro: Livros Tcnicos e Cientficos, 1992. [Mourelle, 1998] Mourelle, Luiza de Macedo, Hardware/Software Interfacing in a Software Acceleration Environment, Tese de doutorado, University of Manchester, Institute of Science and Technology (UMIST), Inglaterra, 1998. [MyCad, 2000] MyCad, Inc., My VHDL Station V 4.0x Tutorial, California, 2000. [Taub, 1984] Taub, Herbert, Circuitos digitais e microprocessadores, So Paulo: Makron Books do Brasil Editora, 1984.