Prévia do material em texto
UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE ENGENHARIA ELÉTRICA DISCIPLINA: ARQUITETURA DE SISTEMAS DIGITAIS Projeto de Sistemas Digitais na Atualidade Alexandre Scaico Campina Grande Dezembro/2000 Projeto de Sistemas Digitais na Atualidade pág. 2 A Alexandre Scaico Dezembro/2000 SUMÁRIO 1. INTRODUÇÃO...........................................................................................................................5 2. A LÓGICA PROGRAMÁVEL...................................................................................................7 2.1 - O que é a Lógica Programável? ...........................................................................................7 2.2 - Memórias PROM.................................................................................................................7 2.3 - Os Dispositivos Lógicos Programáveis (PLD) ....................................................................9 2.4 - Arranjos Lógicos Programáveis.........................................................................................10 2.4.1 - PLA..............................................................................................................................10 2.4.2 - PAL..............................................................................................................................11 2.5 - Arranjos de Portas Programáveis (Programmable Gate Array).........................................11 2.5.1 - CPLD (Complex PLD) ................................................................................................12 2.5.2 - FPGA (Field Programmable Gate Array)....................................................................13 2.6 - Considerações finais ..........................................................................................................14 2.7 - Bibliografia ........................................................................................................................15 3. AS LINGUAGENS DE DESCRIÇÃO DE HARDWARE.......................................................16 3.1 - Evolução dos sistemas digitais...........................................................................................16 3.2 - Surgimento das HDL’s ......................................................................................................16 3.3 - Fluxo Típico em um Projeto ..............................................................................................17 3.4 - Importância das HDL’s......................................................................................................18 3.5 - Tendências em HDL’s .......................................................................................................19 3.6 - Bibliografia ........................................................................................................................19 4. VERILOG HDL ........................................................................................................................20 4.1 - O que é Verilog? ................................................................................................................20 4.2 - Por que usar o Verilog HDL? ............................................................................................20 4.3 - Popularidade do Verilog HDL...........................................................................................21 4.4 - Aplicações do Verilog e outras linguagens HDL ..............................................................21 4.5 - Limitações do Verilog........................................................................................................21 4.6 - Níveis de abstração ............................................................................................................22 4.7 - Nível comportamental x RTL ............................................................................................22 4.8 - Conceitos principais da linguagem ....................................................................................23 4.9 - Metodologias de projeto ....................................................................................................24 4.10 - Estrutura dos módulos......................................................................................................24 4.11 - Projeto hierárquico...........................................................................................................26 4.12 - Instâncias..........................................................................................................................26 4.13 - Representando hierarquia.................................................................................................27 Projeto de Sistemas Digitais na Atualidade pág. 3 A Alexandre Scaico Dezembro/2000 4.14 - Componentes de uma simulação......................................................................................28 4.15 - Nomes hierárquicos .........................................................................................................29 4.16 - Exemplos de módulos ......................................................................................................30 4.16.1 - Meio somador ............................................................................................................30 4.16.2 - Somador completo.....................................................................................................30 4.17 - Conceitos básicos.............................................................................................................31 4.18 - Convenções léxicas..........................................................................................................32 4.18.1 - Espaços em branco ....................................................................................................32 4.18.2 - Comentários...............................................................................................................32 4.18.3 - Operadores.................................................................................................................32 4.18.4 - Especificações de números........................................................................................32 4.18.5 - Strings........................................................................................................................33 4.18.6 – Identificadores e palavras-chave...............................................................................33 4.19 - Tipos de dados .................................................................................................................33 4.19.1 - Definição de valores ..................................................................................................33 4.19.2 - Nets............................................................................................................................34 4.19.3 - Registradores .............................................................................................................34 4.19.4 - Vetores.......................................................................................................................34 4.19.5 - Registros de tipos de dados integer, real e time ........................................................344.19.6 - Arrays ........................................................................................................................35 4.19.7 - Memórias ...................................................................................................................35 4.19.8 - Parâmetros .................................................................................................................35 4.19.9 - Strings........................................................................................................................35 4.20 - Módulos ...........................................................................................................................35 4.21 - Portas................................................................................................................................37 4.21.1 - Lista de portas............................................................................................................37 4.21.2 - Declarações de portas ................................................................................................37 4.21.3 - Regras de conexões de portas ....................................................................................38 4.21.4 - Conectando portas a sinais externos..........................................................................39 4.22 - Exemplos de estruturas de módulos.................................................................................40 4.22.1 - Nível de portas lógicas ..............................................................................................40 4.22.2 - Nível de fluxo de dados (RTL)..................................................................................41 4.22.3 - Nível comportamental ...............................................................................................41 4.23 - Bibliografia ......................................................................................................................42 5. O VERILOG E A FERRAMENTA DE SÍNTESE LÓGICA DA ALTERA ...........................43 5. 1 - Considerações iniciais.......................................................................................................43 Projeto de Sistemas Digitais na Atualidade pág. 4 A Alexandre Scaico Dezembro/2000 5.2 - Tipos de operadores ...........................................................................................................43 5.2.1 - Operadores aritméticos ................................................................................................44 5.2.2 - Operadores lógicos ......................................................................................................44 5.2.3 - Operadores relacionais ................................................................................................45 5.2.4 - Operadores de igualdade .............................................................................................45 5.2.5 - Operadores Bitwise......................................................................................................45 5.2.6 - Operadores de Redução ...............................................................................................45 5.2.7 - Operadores de deslocamento .......................................................................................46 5.2.8 - Operador de concatenação...........................................................................................46 5.2.9 - Operador de replicação................................................................................................46 5.2.10 - Operador Condicional................................................................................................46 5.3 - Definição de constantes .....................................................................................................47 5.4 - Estruturas if-else e case......................................................................................................47 5.4.1 - Estrutura if-else............................................................................................................47 5.4.2 - Estrutura case...............................................................................................................48 5.4.3 - Outras estruturas ..........................................................................................................48 5.5 - Controle de Eventos...........................................................................................................48 5.6 - Lógica Combinacional .......................................................................................................49 5.6.1 - Atribuições contínuas ..................................................................................................49 5.6.2 - Construções always .....................................................................................................49 5.7 - Lógica seqüencial...............................................................................................................50 5.7.1 – Implementando registradores......................................................................................50 5.7.2 - Implementando contadores..........................................................................................51 5.8 - Bibliografia ........................................................................................................................52 6. A PLACA FPGA E A FERRAMENTA MAX+PLUS II .........................................................53 6. 1 - Considerações iniciais.......................................................................................................53 6.2 – A placa de desenvolvimento .............................................................................................53 6.3 – A ferramenta de síntese lógica Max+Plus II .....................................................................55 6.3.1 – Utilizando o Max+Plus II............................................................................................57 6.4 – Realização dos testes na placa...........................................................................................61 6.5 – Bibliografia........................................................................................................................61 Projeto de Sistemas Digitais na Atualidade pág. 5 A Alexandre Scaico Dezembro/2000 1. INTRODUÇÃO Para muito de nós, a realização de um projeto de um sistema digital consiste em determinarmos a função lógica que o sistema que queremos projetar deve apresentar como resposta aos estímulos recebidos, e então construirmos um circuito lógico complexo que execute essa função a partir de circuitos lógicos simples (portas OR, AND, XOR, Flip-flops, contadores, registradores, etc.). Mas, devido a complexidade dos sistemas atuais, esse tipo de projeto está se tornando inviável devido a vários problemas que o projeto a nível de portas lógicas acarreta, tais como: - Alto número de CI’s contendo os circuitos lógicos (portas lógicas) simples necessários; - Atraso global do sistema alto devido a contribuição individual dos atrasos de cada porta lógica individualmente; - Alto custo do projeto; - Necessidade de um grande layout físico para acomodar todos os componentes; - Alto consumo do sistema; - Possíveis erros de conexão e/ou maucontatos (confiabilidade do sistema); - Possíveis indisponibilidades dos circuitos necessários no mercado, acarretando em atraso na finalização dos projetos; - Necessidade de protótipos para testes, que acarreta em mais gastos. Junte a isso a evolução tecnológica que vem ocorrendo nos últimos 35 anos. Com a evolução, ocorreu um aumento na capacidade de processamento dos sistemas, e isso acarretou uma maior complexidade dos sistemas a serem projetados (e com isso um maior número de portas lógicas necessárias ao projeto). E também gerou uma maior escala de integração dos CI’s, que é a VLSI (Integração em Altíssima Escala). Então, com a inviabilidade de se efetuar os projetos digitais da maneira convencional (com portas lógicas), pesquisas foram implementadas a fim de se obter uma forma alternativa mais viável de se efetuar os projetos em dispositivos que contivessem milhares de portas lógicas internamente, e que essas portas pudessem ser programadas de acordo com a necessidade do projeto a fim de implementar a função desejada (ao invés de ter que interligar uma quantidade considerável de CI’s contendo portas lógicas, se usaria esse novo dispositivo). Esses estudos geraram a chamada lógica programável. Com a lógica programável surgiram vários novos dispositivos passíveis de serem programados pelo projetista (seja enviando o projeto para a produtora dos dispositivos efetuar a programação ou programando-o o próprio projetista). E, com esses dispositivos surgiu a necessidade de uma nova forma de se projetar, pois as formas tradicionais de projetos baseados em tabelas da verdade, em softwares de projeto lógico a partir de portas lógicas (o Eletronic Workbech é um exemplo), entre outros, já não eram mais viável. Dentre as novas técnicas que surgiram, a que despontou como a mais promissora é a “descrição de hardware”. Nesta modalidade de projeto, o projetista, com o auxílio do computador, descreve o hardware a ser projetado (o seu sistema digital) utilizando uma HDL (Hardware Description Language – Linguagem de Descrição de Hardware). Uma HDL é muito parecida com uma linguagem de programação de alto nível, como C ou Pascal. O projeto utilizando HDL se torna parecido com a programação, uma vez que o projetista inicialmente não Projeto de Sistemas Digitais na Atualidade pág. 6 A Alexandre Scaico Dezembro/2000 se preocupa com a tecnologia que vai ser utilizada na implementação do projeto, e sim com a funcionalidade lógica do projeto. Após a descrição ser feita, existem várias ferramentas de simulação para testar a funcionalidade do projeto antes de sua implementação. E isto é importante porque reduz drasticamente o tempo de testes, uma vez que não é necessária a construção de protótipos e que, na ocorrência de um erro ou mudança no projeto, é muito simples se modificar a descrição do sistema em HDL. Ao término da etapa de teste é então escolhido o dispositivo que mais se adapte ao projeto (número de portas, tempo de resposta, etc.) e então utilizamos um software de síntese lógica, disponibilizado pelo fabricante do dispositivo, para convertermos a nossa descrição em HDL para um arquivo que contenha os dados necessários para a programação do dispositivo. E. uma vez realizada a programação, o dispositivo está pronto para ser utilizado. Deve-se ressaltar que existem dispositivos programáveis que só podem ser programados uma única vez (que são os que o projetista envia a descrição para o fabricante programar), e os que podem ser reprogramados de acordo com a necessidade (que são os programáveis pelo projetista). Projeto de Sistemas Digitais na Atualidade pág. 7 A Alexandre Scaico Dezembro/2000 2. A LÓGICA PROGRAMÁVEL 2.1 - O que é a Lógica Programável? Os componentes da lógica programável são dispositivos que possuem em sua lógica interna centenas (ou milhares) de portas lógicas, flip-flops e registradores; que são interligados internamente. Essas interconexões são os pontos programáveis da lógica. Podemos então programar essas conexões para permanecerem fechadas ou abertas, de acordo com a necessidade do projeto. Essas interconexões podem ser entendidas como fusíveis, que de acordo com a necessidade do projeto podem ou não ser queimados (desfazendo ou não a conexão entre portas lógicas). Essa “queima” é realizada pelo projetista, utilizando um software de programação do dispositivo. Existem vários tipos de dispositivos lógicos programável (PLD – Programmable Logic Devices), como os mostrados abaixo: - PLA - PAL - Dispositivos Lógicos Programáveis Complexos (CPLD) - Arranjo de Portas Programáveis em Campo (FPGA) Podemos também considerar as memórias PROM como dispositivos de lógica programáveis se elas forem utilizadas para implementar funções lógicas. 2.2 - Memórias PROM O conceito de programação de hardware (sistemas digitais) se materializou com a necessidade de se construir unidades de memória, cujo conteúdo fixo, não era perdido ao se desligar o sistema. Esta necessidade foi resolvida com a criação das memórias ROM, que vinham de fábrica com o seu conteúdo já determinado. Com a evolução surgiram as memórias PROM (ROM programável), cuja programação ocorria pela “queima” dos fusíveis internos (interconexões entre as portas lógicas básicas que compõem a PROM). Temos na figura a seguir o modelo de um PROM. Ela internamente nada mais é que uma estrutura AND-OR, com a matriz AND fixa e a matriz OR programável. Então, podemos ver a matriz AND da PROM como um decodificador completo de endereços que pode ser programado a partir da matriz OR. Ao ser produzida, a PROM vem com todas as conexões internas. Para programá-la devemos aplicar níveis de tensão apropriados a fim de manter ou não a conexão de cada entrada de cada porta OR (“queimar” ou não os fusíveis internos). Só que uma vez feita a programação, ela não pode ser desfeita. Com a evolução, sugiram novos tipos de ROMs que solucionaram essa limitação das PROMs, que são as EPROMs apagáveis por radiação ultravioleta, e as PROMs apagáveis eletricamente (EEPROM). Projeto de Sistemas Digitais na Atualidade pág. 8 A Alexandre Scaico Dezembro/2000 Fig.01 – Memória PROM de 8 x 2 bits Então, podemos ver a PROM não apenas como uma memória apenas de leitura, mas também como um circuito combinatório genérico de n entradas e m saídas, cuja função lógica executada pode ser facilmente programável, como mostra a figura abaixo. Fig. 02 – PROM vista como um circuito combinatório Mas o uso de PROMs como dispositivos programáveis apresentam algumas desvantagens, como por exemplo: - A memória não aproveita as vantagens das técnicas de minimização porque implementam diretamente a tabela da verdade; Projeto de Sistemas Digitais na Atualidade pág. 9 A Alexandre Scaico Dezembro/2000 - Quando um sistema possui menos saída que o comprimentoda palavra da memória, temos porções de memória que não são utilizadas totalmente. Por isso, os pesquisadores se empenharam em produzir dispositivos melhores que as memórias para implementar projetos lógicos, esses componentes são chamados de Dispositivos Lógicos Programáveis (PLD – Programmable Logic Devices). 2.3 - Os Dispositivos Lógicos Programáveis (PLD) Dispositivos Lógicos Programáveis são dispositivos (circuitos integrados) configuráveis pelo usuário usados para implementar uma grande variedade de funções lógicas, tanto seqüenciais como combinacionais. PLDs podem implementar qualquer expressão booleana ou função construída a partir de estruturas lógicas. Sua programação é efetuada pelo usuário utilizando uma ferramenta computacional de síntese lógica fornecida pelo fabricante do dispositivo. Podemos ter PLDs com pontos internos de programação permanentes ou reprogramáveis. Os pontos de programação são os “fusíveis” (conexões) que interconectam os elementos internos do PLD. É através da queima ou não desses “fusíveis” que programamos o dispositivo. Devido a complexidade da estrutura interna dos PLDs, podemos dividi-los em duas categorias, como mostra a figura abaixo. E, em cada categoria temos os dispositivos mais representativos. Fig. 03 – Divisão dos PLDs É importante destacar que esses componentes têm o objetivo central de oferecer a versatilidade, o baixo custo, a confiabilidade e a velocidade da microeletrônica em estruturas menos rígidas que as tradicionais. E, para que esses dispositivos sejam utilizáveis de maneira simples, os fabricantes oferecem programas de computador que, a partir de descrições simplificadas do circuito que se deseja projetar (em HDL), consegue-se gerar rapidamente a programação correta do dispositivo. Ressaltando-se que esses softwares, além de gerar o conteúdo a ser gravado (programado) no componente, oferecem recursos de simulação (verificação), documenta completamente o projeto e, ainda, gera roteiros de testes. PLD Arranjos Lógicos Programáveis Arranjos de Portas Programáveis PAL PLA FPGA CPLD Projeto de Sistemas Digitais na Atualidade pág. 10 A Alexandre Scaico Dezembro/2000 2.4 - Arranjos Lógicos Programáveis Os dispositivos que são arranjos lógicos programáveis possuem uma estrutura interna semelhante baseadas na estrutura interna AND-OR das PROMs. A estrutura consiste de um número de entradas ligadas a número de portas AND. As saídas das portas AND são conectadas as entradas de um número de portas OR, cujas saídas são as saídas do dispositivo. Nestes dispositivos podemos ter tanto as duas matrizes de portas programáveis, quanto apenas a matriz de portas AND programáveis. E isso gerou dois tipos de dispositivos: as PLAs e as PALs. Estes dispositivos, assim como as PROMs, só podem se programados um única vez. 2.4.1 - PLA A estrutura de uma PLA é muito semelhante a de uma PROM. Só que ela possui uma menor quantidade de portas AND (não formando um decodificador completo), e possuindo tanto a matriz de portas AND quanto a matriz de portas OR programáveis. Temos a seguir a estrutura típica de uma PLA. Fig. 04 – Estrutura típica de uma PLA Possuindo as duas matrizes de portas programáveis, as PLAs possibilitam que o projetista implemente termos minimizados (que não utilizam todas as entradas), como mostra o diagrama simplificado abaixo (note que cada linha de entrada das portas AND representam todas as entradas disponíveis na portas, estando apenas em notação simplificada). Fig 05 – Implementação de uma função lógica usando PLA Projeto de Sistemas Digitais na Atualidade pág. 11 A Alexandre Scaico Dezembro/2000 2.4.2 - PAL Com o uso da PLA’s foram verificadas que existiam situações em que a flexibilidade da matriz OR programável era desnecessária, o que não justificava o uso da PLAs. Além disso, a existência das duas matrizes (AND e OR) programáveis acarretava uma grande propagação de atraso entre a entrada e a saída do dispositivo (além de uma maior custo do dispositivo). Por causa disso foi-se criado um dispositivo baseado no PLA só que mais simples, que é o PAL. O PAL se assemelha ao PLA, tendo apenas a matriz de portas AND programável (a de portas OR é fixa). Temos a seguir a estrutura interna simplificada de uma PAL. Fig. 06 – Estrutura típica de uma PAL Essa estrutura básica da PAL pode ser varia da em quatro alternativas básicas: - Combinatório; - Entrada/Saída Programada; - Saídas com registradores e realimentação; - Saídas com porta XOR. O PAL mais simples, o combinatório, tem as saídas iguais as somas de produtos, sem realimentação (o PAL da figura anterior). Os PALs mais complexos realimentam a saída de volta para a entrada, permitindo que a saída seja também uma entrada. Outra característica de PALs mais complexos e a existência de registradores na saída, que fornecem aos PALs a possibilidade de sintetizar circuitos seqüenciais síncronos. Um tipo de PAL bem complexo é o que dispõe de circuitos de saída que incorporam a porta XOR. Tais dispositivos são normalmente chamados de aritméticos porque são sempre necessários quando se quer sintetizar unidades aritméticas. 2.5 - Arranjos de Portas Programáveis (Programmable Gate Array) Os arranjos de portas programáveis são estruturas mais genéricas e versáteis que as baseadas na estrutura típica de um PROM (PAL, PAL ou a própria PROM). Nestas estruturas existem recursos de configuração e interligação mais genéricos que aqueles apresentados pelo rígido esquema baseado na estrutura AND-OR. Os fabricantes destes tipos de dispositivos garantem que com seu uso se consegue um fator de utilização de 80 a 90%, enquanto que com PALs, tipicamente, utiliza-se apenas cerca de 15% de seus componentes. Projeto de Sistemas Digitais na Atualidade pág. 12 A Alexandre Scaico Dezembro/2000 Inicialmente, assim como as PROMs, estes componentes só eram passíveis de uma única programação. Mas, com o desenvolvimento das técnicas de fabricação, surgiram as versões programáveis em campo (que podiam ser reprogramadas de acordo com as necessidades do projetista), dentre as quais podemos destacar os FPGAs e os CPLDs. Devemos salientar que com o surgimento das versões programáveis em campo, as versões programadas na fábrica não deixaram de existir. Pois componentes programáveis em fábrica são sempre mais confiáveis, dispensam as etapas de programação e, dependendo do volume, são mais baratos. Devido a esses fatores é que os fabricantes oferecem versões programáveis em fábrica para os dispositivos programáveis em campo que dispõem. A idéia é que sempre que se necessitar de componentes para elevadas quantidades, utiliza-se o componente programável em campo para a construção dos protótipos, e uma vez terminado o projeto e assegurado que se disponha da programação correta do dispositivo, o fabricante poderá fornece-lo em versões programáveis de fábrica. 2.5.1 - CPLD (Complex PLD) De uma maneira genérica os CPLDs (ou EPLDs – Erasable Programmable Logic Device) podem ser vistos como dispositivos queagregam em sua estrutura vários PLDs (PLA ou PAL) interligados por conexões programáveis, como ilustra a figura a seguir. Fig. 07 – Visão genérica de um CPLD Na realidade, sua estrutura interna é formada por centenas de macrocélulas programáveis, interligadas por conexões também programáveis (cada PLD da figura anterior seria, na verdade, uma macrocélula). Cada macrocélula é composta por uma matriz AND-OR (com a matriz AND programável e a OR fixa, como nos PALs) para implementar as funções lógicas combinacionais, cujas saídas ativam módulos de entrada/saída (compostos por flip-flops e realimentações com funções e interligações programáveis). Os pinos de E/S podem ser configurados como apenas saída, apenas entrada, ou entrada/saída. Os CPLDs são programáveis em campo, e podem ser reprogramados quantas vezes seja necessário. PLD PLD PLD PLD Entradas Saídas Conexões Programáveis Projeto de Sistemas Digitais na Atualidade pág. 13 A Alexandre Scaico Dezembro/2000 2.5.2 - FPGA (Field Programmable Gate Array) Os FPGAs (Field Programmable Gate Arrays – Arranjo de Portas Programáveis em Campo), em comparação com os PLDs, possuem uma arquitetura mais flexível baseada no conceito de blocos lógicos. Um bloco lógico (BL) consiste de um certo número de portas lógicas capazes de implementar uma grande variedade de funções lógicas dependendo de sua programação, e pode ou não conter registradores. Temos em detalhe, na figura abaixo, a estrutura interna de um BL típico do fabricante Xilinx, que consiste em dois registradores, um número de multiplexadores e uma unidade de função combinatória (para implementar as funções lógicas). Fig 08 – Estrutura de um Bloco Lógico da Xilinx Tipicamente, os blocos lógicos de um FPGA são idênticos, e cada bloco pode ser programado individualmente para realizar um pedaço da lógica do projeto (decompondo a função lógica geral do projeto em funções menores que serão implementadas pelos blocos lógicos). A complexidade de um bloco lógico pode variar (não se limita a estrutura típica mostrada acima) consideravelmente entre diferentes FPGAs, indo desde um bloco de “granularidade fina” implementando uma ou duas funções lógicas de duas ou quatro variáveis, até blocos de “granularidade grossa” implementando diversas funções lógicas de quatro a dez variáveis. Cada FPGA contém um grande número de blocos lógicos, tipicamente entre 50 e 250, e algumas vezes mais. Cada bloco lógico é conectado aos outros blocos lógicos e aos pinos de E/S por interconexões programáveis. Temos a seguir alguns exemplos de arquiteturas de FPGAs no que diz respeito ao blocos lógicos e as interconexões programáveis. Fig 09 – Exemplos de arquitetura de FPGAs com respeitos as interconexões entre blocos lógicos Projeto de Sistemas Digitais na Atualidade pág. 14 A Alexandre Scaico Dezembro/2000 Podemos entender as interconexões programáveis como um conjunto de fios e um conjunto de chaves programáveis entre esses fios. As chaves são programadas para conectar ou desconectar segmentos de fio, de forma a prover os caminhos de comunicação desejados. A figura a seguir mostra um exemplo. Fig. 10 – Exemplo de conexão entre Blocos Lógicos 2.6 - Considerações finais Como já foi dito, para efetuarmos um projeto utilizando os dispositivos explicados, necessitamos de uma nova técnica de projeto e de um software que permita realizar a programação (software de síntese lógica). Para o caso da programação, cada dispositivo possui o seu próprio software (de síntese lógica) que é fornecido pelo fabricante. Resta, então, aprender uma nova técnica de projeto. E, como também já foi mencionado, a técnica mais promissora nos dias atuais é a “descrição de hardware”. Pois, além das linguagens de descrição de hardware estarem amplamente difundidas e serem de fácil aprendizado (já que se parecem com uma linguagem de programação de alto nível), os softwares de síntese lógica (que programam os dispositivos) aceitam o projeto em linguagem de descrição de hardware para fazerem a programação dos dispositivos. E, dentre as linguagens de descrição de hardware, a mais promissora nos dias atuais é o Verilog HDL. Devemos salientar também que, para o usuário final, FPGA e CPLD podem ser vistas como o mesmo tipo de estrutura. A única diferença está na sua estrutura interna, mas o seu resultado final é o mesmo. O fato é que um dos grandes fabricantes, a Xilinx usa o nome FPGA, enquanto outro grande fabricante, a Altera, usa o nome CPLD. Tanto faz usar uma ou a outra (embora os fabricantes tentem mostrar que a sua estrutura interna é sempre melhor), que se obtém o mesmo resultado. Na prática, tanto os FPGAs quanto os CPLDs são conhecidos como FPGAs. Existe atualmente uma nova tecnologia que permite usarmos um conceito chamado “cache lógica” com FPGAs. A cache lógica é um meio mais barato de se implementar lógica mais eficientemente. As funções ativas da aplicação que está sendo executada pelo FPGA podem ser reconfiguradas durante a execução, enquanto funções inativas são armazenadas em uma memória mais barata (um EPROM, por exemplo). Quando uma nova função é necessária, ela é buscada na memória e escrita sobre as antigas. Ou seja, as funções vão sendo buscadas a medida que são necessárias como em uma cache de computador. Essa técnica foi desenvolvida pela Projeto de Sistemas Digitais na Atualidade pág. 15 A Alexandre Scaico Dezembro/2000 ATMEL Corporation e, segundo a ATMEL, com isso conseguimos um aumento muito grande da utilização do FPGA, pois estudos seus mostram que em um FPGA de 10000 com uma função que o utiliza por completo, apenas 2000 são utilizadas ao mesmo tempo. Então, utilizando essa tecnologia para fazer a cache das outras 8000 portas podemos implementar essa mesma função com um FPGA de 2000 portas (bem mais barato). Finalizando, é interessante saber que os dispositivos reprogramáveis não existem apenas na área digital. Existem circuitos reconfiguráveis analógicos, os FPAAs (Field Programmable Analog Arrays); e os mistos (que misturam estruturam analógicas e digitais), os FPMAs (Field Programmable Mixed Arrays). 2.7 - Bibliografia 1. FREGNI, Edson e SARAIVA, Antonio M. “Engenharia do Projeto Lógico Digital” Ed. Edgard Blûcher LTDA, São Paulo, SP, 1995. 2. SEALS, R. C. & WHAPSHOTT, G. F. “Programmable Logic – PLDs and FPGAs”. Ed. McGraw-Hill, USA, 1997. 3. DEWEY, Allen M. “Analysis and Design of Digital Systems with VHDL”. Ed. ITP, Boston, MA, USA, 1997. 4. WESTE, Neil H. E. & ESHRAGHIAN, Kamran. “Principles of CMOS VLSI Design – A System Perspective”. 2a Edition, Ed. Addison Wesley, Santa Clara, CA, USA, 1993. 5. “Altera Data Book”. Altera Corporation, 1996. 6. “Implement Cache Logic with FPGAs”. Aplication Note, Atmel Corporation, 1999. 7. “Programmable Logic Devices”. (www.eeng.dcu.ie/~scaifer/csh/pld/pld.html} 8. “FPGA Page”. (www.ele.auckland.ac.nz/students/chengms/fpga.htm) 9. “FPGA Research at University of Toronto”. (www.eecg.toronto.edu\EECG\RESEARCH\FPGA.html) 10. “FIPSOC: Field Programmable System on a Chip Family”.(www.sida.es\ftpsoc.htm) http://www.eeng.dcu.ie/~scaifer/csh/pld/pld.html http://www.ele.auckland.ac.nz/students/chengms/fpga.htm http://www.eecg.toronto.edu/EECG/RESEARCH/FPGA.html http://www.sida.es/ftpsoc.htm Projeto de Sistemas Digitais na Atualidade pág. 16 A Alexandre Scaico Dezembro/2000 3. AS LINGUAGENS DE DESCRIÇÃO DE HARDWARE 3.1 - Evolução dos sistemas digitais O projeto de sistemas digitais têm se desenvolvido rapidamente nos últimos 35 anos. Os circuitos digitais mais simples eram desenvolvidos com válvulas e transistores. Posteriormente foram criados os circuitos integrados, quando passou-se a existir uma maior preocupação com os espaços físicos ocupados por circuitos mais complexos. Os primeiros chips de circuitos integrados foram os chips SSI (Integração em Pequena Escala) onde um pequeno número de portas lógicas dividiam o mesmo espaço. Com o começo da sofisticação tecnológica, os projetistas desenvolveram circuitos com cerca de 100 portas (ou 100 transistores) em um mesmo chip. Esses chips foram chamados chips MSI (Integração em Média Escala). Com o surgimento do LSI (Integração em Larga Escala), os projetistas poderiam colocar milhares de portas em um único chip. Neste ponto, os projetos começaram a ficar muito complexos, e os projetistas acharam necessário automatizar todos os processos envolvidos nos projetos. E dessa forma, as técnicas de CAD (Projetos Auxiliados por Computador) começaram a ser desenvolvidas. Os projetistas de chip passaram a usar circuitos e técnicas de simulação lógica para verificar a funcionalidade de blocos de construção da ordem de 100 transistores (ou portas lógicas). Até esta data, os circuitos ainda eram testados sobre breadboards (protoboards) e o layout era feito no papel ou pelo controle manual de um computador gráfico. Com o surgimento da Tecnologia VLSI (Integração em Altíssima Escala), os projetistas passaram a projetar chips com mais de 100.000 transistores. Devido a complexidade desses circuitos já não era possível verificar o funcionamento desses circuitos sobre breadboard. Técnicas de auxílio por computador começaram a ficar indispensáveis na verificação e no projeto de circuitos digitais VLSI. Programas de computador para fazer automaticamente a divisão do espaço disponível e rotinas de layout de circuitos também começaram a se difundir. Os projetistas estavam agora construindo circuitos digitais ao nível de porta sobre terminais gráficos. Eles construíam pequenos blocos e então formavam blocos em um nível arquitetural mais alto a partir dos blocos mais simples. Esse processo continuaria até que se tivesse construído todo o circuito. Simuladores lógicos eram então usados para verificar a funcionalidade desses circuitos antes da fabricação do chip. Como os projetos foram ficando mais e mais complexos, os simuladores lógicos assumiram um importante papel nos processos do projeto. 3.2 - Surgimento das HDL’s Ao longo do tempo, linguagens de programação (tais como FORTRAN, Pascal e C) foram desenvolvidas para descrever programas de computador. Também no campo de projetos digitais, os projetistas começavam a vislumbrar a necessidade de uma linguagem específica para descrever circuitos digitais. Surgiram, então, as Linguagens de Descrição de Hardware (HDLs). As HDLs podem descrever um sistema digital em vários níveis. Por exemplo, uma HDL pode descrever o layout dos fios, resistores e transistores sobre um chip de circuito integrado, ou seja, descrever o nível de layout. Ou ela pode descrever as portas lógicas e flip-flops em um sistema digital, ou seja, o nível de portas lógicas. Em um nível mais alto ela descreve os registradores e Projeto de Sistemas Digitais na Atualidade pág. 17 A Alexandre Scaico Dezembro/2000 os vetores de transferência de informação entre os registradores. Este é chamado de nível de transferência entre registradores (RTL). Existe ainda o nível comportamental, em que se descreve apenas a funcionalidade do projeto sem se preocupar com detalhes de implementação. Ao contrário das linguagens seqüenciais (Pascal, FORTRAN, C, etc.), as HDL’s permitiram aos projetistas modelarem os processos concorrentes encontrados nos elementos de Hardware. Entre essas linguagens as que se tornaram mais populares foram a Verilog HDL e a VHDL. A Verilog HDL foi introduzida em 1985 pela Gateway Design System Corporation. Até maio de 1990, com a formação da Open Verilog International (OVI), a Verilog HDL era uma linguagem de propriedade da Cadence Design Systems, conglomerado que tinha o controle da Gateway Design System Corporation. A VHDL foi desenvolvida em 1983 pelo departamento de defesa americano (DOD) através de um programa chamado Very High Speed Integrated Circuits (VHSIC). Apesar de difícil de aprender, VHDL passou a ser um padrão aceito pelo IEEE em 1987. Atualmente ambos os padrões, Verilog e VHDL são amplamente aceitos pelos projetistas de sistemas digitais. 3.3 - Fluxo Típico em um Projeto Um típico diagrama de fluxo de projetos de circuitos VLSI IC é mostrado na figura abaixo. Fig. 11 - Diagrama de fluxo típico de um projeto de um sistema digital O diagrama de fluxo acima é tipicamente usado para projetos que usam HDL’s. Em qualquer projeto, as especificações são definidas primeiro. As especificações descrevem de Especificações do Projeto Descrições de procedimento Descrições RTL (HDL) Verificação Funcional de Testes Síntese Lógica Net List -- Nível-porta Verificação lógica e teste Plano de Fundo Automático Layout físico Verificação de layout Implementação Projeto de Sistemas Digitais na Atualidade pág. 18 A Alexandre Scaico Dezembro/2000 forma abstrata a funcionalidade, interface, e toda a arquitetura do circuito digital a ser projetado. Neste ponto o projetista não precisa saber como implementar o circuito. A descrição de funcionamento é então criada para analisar o projeto em temos da funcionalidade, performance, submissão aos padrões e outras características de alto-nível. As descrições de funcionamento são manualmente convertidas para as descrições RTL em uma HDL. O projetista tem que descrever o fluxo de dados desejado no circuito digital. Deste ponto em diante, o processo é feito com o auxílio de ferramentas de CAD (Computer-Aided Design). As ferramentas de síntese lógica convertem a descrição RTL em uma descrição à nível de portas lógicas. O nível de portas lógicas é uma descrição do circuito em termos de portas e conexões entre elas. O nível de porta é a entrada para a ferramenta de rotas e distribuição física dos elementos, a qual cria o layout. O layout é verificado e então o chip é fabricado. A maior parte do tempo gasto no projeto de um circuito digital é concentrado na otimização manual da descrição RTL do circuito. Depois da descrição RTL concluída, ferramentas de CAD são usadas para assistir o projeto nos demais processos. Diminuindo-se o tempo gasto no nível RTL pode-se reduzir o tempo de projeto de anos para poucos meses. É também possível fazer mais interações no projeto em um curto período de tempo. Com essa finalidade, ferramentas de síntesecomportamental tem começado a surgir recentemente. Essas ferramentas podem criar descrições RTL a partir da descrição da funcionalidade do circuito (nível comportamental). Com o amadurecimento dessas ferramentas, os projetos de circuitos digitais estão se tornarão similares à programação em alto-nível de computadores. Os projetistas simplesmente implementarão o algoritmo com a HDL em um nível muito abstrato. As ferramentas de CAD ajudarão os projetistas a converterem as descrições de procedimento em um chip de circuito integrado. É importante notar que apesar das ferramentas de CAD conseguirem automatizar os processos e reduzirem o tempo de projeto, os projetistas serão ainda as pessoas que controlarão a performance dessas ferramentas. Além disso, se usadas impropriamente, essas ferramentas de CAD produzirão projetos ineficientes. Então torna-se necessário o uso de projetistas que entendam as nuances das metodologias de projeto, usando as ferramentas de CAD para obter um projeto otimizado. 3.4 - Importância das HDL’s As HDL’s levam muita vantagem em relação aos projetos baseados apenas em esquemas tradicionais. • Os projetos podem ser descritos em um nível muito abstrato pelo uso de HDL’s. Projetistas podem escrever suas descrições sem escolha prévia de uma tecnologia específica de fabricação. Ferramentas de síntese lógica podem automaticamente converter os projetos para qualquer tecnologia de fabricação. Se uma nova tecnologia surgir, os projetistas não necessitam reprojetar seus circuitos. Eles simplesmente entram com as descrições RTL e/ou comportamental na ferramenta de síntese lógica (desde que a ferramenta suporte o nível de descrição usado) e ela então cria uma nova organização ao nível de porta, usando a nova tecnologia de fabricação. A síntese lógica otimiza o circuito na área e no tempo de processamento, adequando-o a nova tecnologia. • Através da descrição em HDL’s, a verificação funcional do projeto pode ser feita facilmente durante as etapas de projeto. Desde que projetistas trabalham em um nível Projeto de Sistemas Digitais na Atualidade pág. 19 A Alexandre Scaico Dezembro/2000 mais alto de abstração (RTL ou comportamental), eles podem otimizar e modificar suas descrições até que seja alcançada a funcionalidade desejada. A maior parte dos bugs do projeto são eliminados nesse ponto. Isso causa uma redução significativa no tempo gasto no projeto. • Projetos com HDL’s são análogos a programas de computador. Uma descrição textual com comentários é uma forma fácil de desenvolver circuitos e retirar seus problemas. Eles também fornecem uma concisa representação do projeto comparado com os esquemas elétricos tradicionais. Esses esquemas tradicionais são altamente incompreensíveis para projetos muito complexos. HDLs são certamente uma tendência no futuro. Com o rápido aumento da complexidade dos circuitos digitais e com a sofisticação das ferramentas de CAD, HDLs provavelmente se tornarão o único método de projeto de grandes sistemas. 3.5 - Tendências em HDL’s A velocidade e complexibilidade dos circuitos digitais têm crescido rapidamente. Os projetistas têm projetado em níveis cada vez mais altos de abstração, se preocupando apenas com a funcionalidade dos circuitos e deixando os detalhes de implementação a cargo das ferramentas de CAD. Essas ferramentas por sua vez vem se tornando sofisticadas o suficientemente para fazerem implementações próximas do ótimo. Certamente a tendência atual é projetar em HDL em um nível alto de abstração (RTL ou comportamental) e empregar as ferramentas de síntese lógica para criar os nível de portas a partir do nível projetado. A síntese de funcionalidade surgiu recentemente. Com o melhoramento dessas ferramentas, os projetistas irão conseguir projetar diretamente em algoritmos o comportamento do circuito e então usar ferramentas de CAD para fazer a tradução e otimização nas demais fases do projeto. A modelagem do comportamento dos circuitos será usada mais e mais com o amadurecimento da síntese de funcionalidade. Técnicas de “verificação formal” também vêm aparecendo no horizonte. A verificação formal aplica técnicas de matemática formal para verificar a precisão das descrições em HDL e estabelecer equivalência entre o nível RTL (e/ou comportamental) e o nível de portas. Contudo a necessidade de descrever um projeto em HDL não irá desaparecer. Para circuitos de alta velocidade como microprocessadores, o nível de portas provido pelas ferramentas de síntese lógica não é ótimo. Nestes casos os projetistas misturam as descrições em nível de portas com as descrições em níveis mais abstratos para conseguir resultados melhores. Esta prática vai contra o paradigma de se projetar em alto-nível, mas mesmo assim, é muito utilizada pelos projetistas devido a ineficiência das ferramentas de CAD para esses circuitos de tempo crítico. 3.6 - Bibliografia 01. PALNIKTAR, Salmir. Verilog HDL – A Guide to Digital Design and Synthesis, Sun Soft Press, California, EUA, 1996. Projeto de Sistemas Digitais na Atualidade pág. 20 A Alexandre Scaico Dezembro/2000 4. VERILOG HDL 4.1 - O que é Verilog? O Verilog é uma das duas maiores HDL (Hardware Description Language – Linguagem de Descrição de Hardware) usadas pelos projetista de hardware na industria e mo meio acadêmico (a outra é o VHDL). Ela é usada para descrever o comportamento e a estrutura de uma parte de um hardware (ou ele todo), e é muito parecido com uma linguagem de programação de alto nível (C, para ser mais preciso). O Verilog foi desenvolvido entre 1984 e 1985 por Philip Moorby que necessitava de um meio simples, intuitivo e efetivo de descrever circuitos digitais para modelagem, simulação e análise. Em 1985 a linguagem se tornou propriedade da Gateway Design System Corporation, que posteriormente foi adquirida pela Cadence Design Systems Inc., que desenvolveu a linguagem. Até maio de 1990, quando foi criada a Open Verilog International (OVI), o Verilog era uma linguagem proprietária da Cadence. Com o OVI a Cadence se sentiu motivada a abrir a linguagem para domínio público com a expectativa que com isso aumentasse rapidamente a aceitação da linguagem, e com isso a procura por suas ferramentas de desenvolvimento para Verilog. O padrão atual da linguagem Verilog é o IEEE1364 de dezembro de 1995. 4.2 - Por que usar o Verilog HDL? Os sistemas digitais atuais são muito complexos. Em seus níveis de maior detalhamento, verificamos que eles consistem de milhões de elementos (transistores ou portas lógicas). Então, para sistemas digitais grandes, o projeto a nível de portas lógicas está morto. Por muitas décadas, esquemas lógicos serviram como a linguagem para projetos digitais. Porém hoje em dia a complexidade do hardware cresceu para um degrau no qual os esquemas lógicos não são mais usuais e mostram apenas uma teia de conexões e não a funcionalidade do projeto. Desde 1970, engenheiros de computação e engenheiros elétricos tem usado as HDL’s, das quais as proeminentes são o Verilog e o VHDL. Porém o Verilog é usado pela maioria dos desenvolvedores, dentre os quais os projetistas de empresas como a Sun Microsistems, Apple Computer e Motorola. A linguagem Verilog provê ao projetista digital a possibilidade de descrever um sistema digital em uma grande faixa de níveis de abstração, e, ao mesmo tempo, provê acessoa ferramentas de projeto por computador no auxílio ao projeto. O Verilog permite expressar o projeto em termos de estruturas comportamentais, deixando os detalhes da implementação para um estágio posterior do projeto. Uma representação abstrata ajuda o projetista a explorar alternativas de arquiteturas através de simulações e detectar falhas no projeto antes de começar um maior detalhamento do projeto. Após terminar os testes com o projeto em Verilog em um nível comportamental, existem ferramentas computacionais que compilam descrições em Verilog para uma descrição das máscaras de um CI VLSI, e então enviar essa descrição para uma fábrica de CI para o mesmo ser criado. Pode-se ainda converter uma descrição em Verilog em uma descrição para programar um Projeto de Sistemas Digitais na Atualidade pág. 21 A Alexandre Scaico Dezembro/2000 FPGA (ou um ASIC, ou um PLD), onde o mesmo é testado e o projeto é aperfeiçoado para depois ser enviado para uma fábrica de CI. 4.3 - Popularidade do Verilog HDL O Verilog tem se tornado uma linguagem de descrição de hardware padrão por oferecer características muito úteis aos projetistas digitais. Dentre as quais podemos destacar: • O Verilog é uma HDL de propósito geral que é fácil de aprender e usar. Sua sintaxe é similar a da linguagem de programação C. Projetistas com experiência de programação em C vão achar fácil aprender Verilog. • O Verilog permite que diferentes níveis de abstração sejam misturados em um mesmo modelo. Então, pode-se definir uma parte do hardware em termos de portas lógicas, outra em termos comportamentais, etc. • As ferramentas de síntese lógica mais populares suportam o Verilog. Isto torna o Verilog a linguagem de escolha dos projetistas. 4.4 - Aplicações do Verilog e outras linguagens HDL As linguagens de descrição de hardware encontraram a sua principal aplicação em Dispositivos Lógicos Programáveis (PLD – Programmable Logic Devices) em vários níveis de complexidade, desde PLD’s simples até PLD’s complexos (CPLD – Complex PLD), e também nos FPGA’s (Field Programmable Gate Array). PLD’s são, de maneira simplificada, matrizes programáveis de estruturas de soma de produtos (AND-OR). São utilizados em circuitos onde não é exigida muita flexibilidade nem muita lógica seqüencial. Já os FPGA’s são dispositivos mais complexos, que consistem em vários blocos lógicos em que o projeto é realizado. Essa divisão em blocos e a composição dos mesmos varia de forma radical de fabricante para fabricante, não sendo aqui possível uma explicação genérica deste dispositivo. No caso específico do Verilog, temos que inicialmente (meio dos anos 80) ele era usado para o projeto de ASIC´s (usando ferramentas de síntese para automaticamente criar e otimizar a implementação). Atualmente, o Verilog também é usado (como já foi mencionando) nas áreas de FPGA’s e PLD’s (que são sua aplicação principal). Existem hoje em dia várias linguagens de descrição de hardware sendo utilizadas atualmente. As mais populares são a Abel, Palasm e Cupl (usadas para projetos de dispositivos com baixa complexidade), e a Verilog e VHDL (para grandes CPLD’s e FPGA’s). 4.5 - Limitações do Verilog O Verilog é uma linguagem para projeto de sistemas digitais. Até o presente momento ele não suporta trabalhar com sistemas e sinais analógicos. O IEEE 1364 define apenas a linguagem Verilog e sua sintaxe, porém ele não descreve os diferentes estilos do Verilog e quando usá-los. Projeto de Sistemas Digitais na Atualidade pág. 22 A Alexandre Scaico Dezembro/2000 Cada ferramenta de síntese suporta uma partição da linguagem Verilog (definida pelo fabricante da ferramenta) e não toda a linguagem. Com isso a vezes é necessário se adequar (alterar) o seu código (descrição em Verilog) para se usar determinada ferramenta de síntese. 4.6 - Níveis de abstração Como já foi mencionado, uma descrição de um sistema digital em Verilog pode ser feita em vários níveis de abstração, que são os diferentes estilos de escrita em Verilog. A abstração define o nível de detalhamento necessário ao projeto, especificado por uma dada descrição desejada. Esses níveis de abstração são: 1. Nível de Layout: É o nível mais baixo de abstração. O projeto neste nível é implementado em termos de chaves, nós de armazenamentos, e das interconexões entre eles. Este nível especifica as informações sobre o layout atual do projeto na pastilha de silício, e pode também especificar informações detalhadas sobre temporização e possíveis efeitos analógicos. 2. Nível de portas lógicas: Em seguida ao nível de layout vem o nível de portas lógicas. Aqui o projeto é descrito como uma rede de portas lógicas e registradores, e das interconexões entre os mesmos. Projetar neste nível é similar a descrever um projeto em termos de diagrama lógico de portas lógicas. Já o layout e os efeitos analógicos são ignorados. No entanto, o projeto contém informações sobre a função, a arquitetura, a tecnologia e a temporização. 3. Nível de Transferência de registros (RTL – Register Transfer Level): É também conhecido como nível de fluxo de dados. Nesse nível usamos um estilo estrito do Verilog que define cada registrador do projeto, e a lógica entre eles (o projeto especifica o fluxo dos dados). Aqui, o projetista está preocupado em como os dados fluem entre os registradores. O projeto contém informações sobre a arquitetura, mas não contém detalhes sobre a tecnologia. 4. Nível Comportamental: Este é o nível mais alto de abstração. Aqui descrevemos a função do projeto sem especificar a arquitetura ou os registradores. O projeto pode ser implementado em termos do algoritmo do projeto desejado sem detalhes da implementação de hardware. Projetar neste nível é similar a programar em C. 4.7 - Nível comportamental x RTL Como mostrado, existem quatro estilos distintos no Verilog. Os níveis de layout e de portas lógicas não são adequados para sistemas com um número considerável de elementos, sendo mais utilizados os níveis RTL e comportamental. Vamos ver os casos os casos em que um desses níveis (RTL e comportamental) é mais adequado que o outro: • A razão para o RTL ser tão importante é que a maioria das ferramentas de síntese que existem hoje requer que o código esteja escrito em RTL. E nesse nível o projetista ainda mantém controle sobre a arquitetura dos registradores do projeto. • Por outro lado, as ferramentas de síntese comportamental geram automaticamente arquiteturas de portas lógicas e de registradores direto de uma descrição comportamental Projeto de Sistemas Digitais na Atualidade pág. 23 A Alexandre Scaico Dezembro/2000 em Verilog. Existem poucas ferramentas desse tipo e elas tendem a ser baseadas em VHDL. • Geralmente você precisa descrever seu projeto de FPGA ou PLD em RTL para usar as ferramentas de síntese disponíveis. • O nível comportamental é usado para criar estruturas de estímulos, para modelar partes padrão do projeto, ou para criar especificações simuláveis do seu sistema. Atualmente, as descrições são feitas utilizando conjuntamente os níveis RTL e comportamentalpara dar maior flexibilidade ao projetista. E pra isso os fabricante já dispõem de ferramentas de síntese lógica que suporta esses dois níveis de descrição (e também o de portas lógicas, se for necessário). 4.8 - Conceitos principais da linguagem 1. Concorrência Como o Verilog nos permite descrever hardware, ele também tem que ser capaz de descrever atividades que estão ocorrendo em paralelo (atividades concorrentes). Fig. 12 – Concorrência 2. Estrutura Uma característica muito importante do Verilog é a capacidade de descrever estrutura ou hierarquia. Descrições de estrutura podem ser misturadas com descrições de comportamento. Também é possível ter apenas a descrição estrutural do projeto em Verilog ( que são as netlists do Verilog). Fig. 13 – Estrutura hierárquica 3. Declarações de procedimentos Uma descrição em Verilog pode também conter declarações que executam um após o outro em seqüência como uma linguagem de software tradicional com C ou Pascal. Isso é conhecido como declarações de procedimento. 4. Tempo O Verilog nos permite modelar o conceito de tempo, que claramente é uma parte muito importante da descrição de um sistema eletrônico. C D S A B Cin U1 U2 A B CARRY U1 SUM Projeto de Sistemas Digitais na Atualidade pág. 24 A Alexandre Scaico Dezembro/2000 4.9 - Metodologias de projeto Existem 2 tipos básicos de metodologias para projetos digitais: metodologia de projeto “top-down” e a metodologia de projeto “botton-up”. Na metodologia “top-down” nós definimos o bloco de nível superior do projeto e identificamos os sub-blocos necessários para construir o bloco de nível superior. Subdividimos então os sub-blocos até chegarmos em células básicas (blocos que não podem ser subdivididos), como mostra a figura abaixo. Fig. 14 – Metodologia top-down Na metodologia “bottom-up” nós primeiro identificamos os blocos que possuímos e a partir deles construímos blocos maiores até chegarmos no bloco de nível superior, como mostra a figura abaixo. Fig. 15 – Metodologia bottom-up Usualmente usamos uma combinação dessas 2 metodologias. Especificamos o bloco de nível superior e vamos dividindo-o ao mesmo tempo em que identificamos os blocos que já possuímos e vamos agrupando-os para formar blocos maiores. 4.10 - Estrutura dos módulos Agora vamos começar a ver como estruturamos o código em Verilog para fazer a representação de um projeto. Um projeto é formado a partir da construção de blocos, e no Verilog cada bloco é chamado de módulo. O módulo é o equivalente a um símbolo em um projeto baseado em esquema elétrico. A primeira coisa que temos que fazer quando desenvolvemos um bloco é dar a ele um nome único. Em seguida temos que definir as interfaces desse projeto e especificar quais são BS SB SB SB SB CB CB CB CB CB CB CB CB BS SB SB SB SB CB CB CB CB CB CB CB CB Projeto de Sistemas Digitais na Atualidade pág. 25 A Alexandre Scaico Dezembro/2000 entradas, saídas ou portas bidirecionais. Nós temos que incluir informações sobre a funcionalidade que é implementada pelo bloco. Nós podemos ainda ter a necessidade de incluir blocos de nível inferior no projeto. Para isso temos que definir quais são esses blocos e como eles são interconectados. A esse processo dá-se o nome de hierarquia. O bloco abaixo sintetiza tudo o que foi enunciado. Fig. 16 – Estrutura de um módulo O módulo pode ser um elemento ou uma coleção de blocos de projeto de nível inferior. Tipicamente, os elementos são agrupados em módulos para prover uma funcionalidade comum que é usada em várias partes do projeto. Um modulo provê a funcionalidade necessária para o bloco de nível superior através de sua interface de portas (entradas e saídas), mas esconde a implementação interna. Isto permite ao projetista modificar o conteúdo de um módulo sem afetar o resto do projeto. Um modulo é declarado pela keyword module e seu término com a keyword endmodule. Todo módulo deve conter um identificador para o módulo (seu nome), o module_name, acompanhado de uma descrição das entradas e saídas do módulo, o module_terminal_list. Deve conter também a definição de quem é entrada/saída e a descrição de sua funcionalidade, o module_internals. module<module_name> . . . <module_internals> . . . endmodule O Verilog é uma linguagem tanto estrutural quanto comportamental. O conteúdo de cada módulo, como já foi explicado, pode ser definido em 4 níveis de abstração, dependendo da necessidade do projeto. O módulo se comporta identicamente com o ambiente externo independente do nível de abstração no qual é descrito (o conteúdo do módulo é invisível para o ambiente). Então, podemos mudar o nível de abstração que descreve o módulo sem a necessidade de mudanças no ambiente. O Verilog permite ao projetista misturar e casar os 4 níveis de abstração em um mesmo projeto. Se um projeto contém 4 módulos, o Verilog permite que cada modulo seja escrito em um nível de abstração diferente. Bloco X Bloco Y BlocoA f Entrada 1 Entrada 2 Saída 1 Saída 2 Projeto de Sistemas Digitais na Atualidade pág. 26 A Alexandre Scaico Dezembro/2000 Quanto mais alto o nível de abstração, mais flexível e independente da tecnologia é o projeto. Quanto mais baixo o nível de abstração (aproximando do nível de layout), mais dependente da tecnologia e inflexível se torna o projeto. Considere a analogia com a programação em C e em Assembly. É fácil programar em uma linguagem de alto nível como o C, e o programa pode ser facilmente portado para qualquer máquina. No entanto, se o programa é em assembly, ele é escrito para uma máquina específica e não é facilmente portável para outra máquina. 4.11 - Projeto hierárquico A hierarquia de um projeto descreve a forma na qual ele é dividido em sub-blocos recursivamente até eventualmente chegarmos a um nível de célula básica. É importante entender hierarquia para se entender os conceito de projeto hierárquico. Fig. 17 – Projeto hierárquico Acima temos o diagrama que mostra os sub-blocos que formam o bloco A e a sua hierarquia dentro do bloco. As vantagens que obtemos ao fazer uso da hierarquia são: • Ao dividir o projeto em partes menores se torna mais fácil encontrar e depurar erros, já que o projetista irá lidar com pedaços menores de código. • Pedaços da lógica (sub-blocos) podem ser identificados e reusados em outras partes do projeto apenas instanciando ("chamando") o sub-bloco quando necessário. • Um projeto em blocos pode ser distribuído entre vários projetistas. 4.12 - Instâncias Um módulo é um modelo, a partir do qual você pode criar objetos. Quando um módulo é chamado, o Verilog cria um objeto único a partir do modelo. Cada objeto tem seu próprio nome, variáveis, parâmetros e interfaces de E/S. O processo de criar um objeto a partir de um módulo modelo é chamado instanciação, e os objetos são chamados de instâncias. No exemplo abaixo (contador de 4 bits) o bloco de nível superior cria 4 instâncias do flip-flop T (T_FF) modelo, que por sua vez instância umD_FF e uma porta inversora. Observe que cada instância deve possuir um nome único. Atente para o fato de que no Verilog é ilegal cascatear módulos (um dentro do outro), só é permitido instanciar. Bloco A Bloco X Bloco Y Bloco Z Bloco D Bloco E Bloco B Bloco C Bloco B Bloco D Projeto de Sistemas Digitais na Atualidade pág. 27 A Alexandre Scaico Dezembro/2000 Fig. 18 – Contador de 4 bits Fig. 19 – Flip-flop D Temos a seguir a descrição em Verilog. module ripple_carry_ counter(q, clk, reset); output [3,0] q; input clk, reset; T_FF tff0(q(0), clk, reset); // 1ª instância do T_FF T_FF tff1(q(1), q(0), reset); // 2ª instância do T_FF T_FF tff2(q(2), q(1), reset); // 3ª instância do T_FF T_FF tff3(q(3), q(2), reset); // 4ª instância do T_FF endmodule module T_FF(q, clk, reset); output q; input clk, reset; wire d; D_FF dff0(q, d, clk, reset); // instância de D_FF not n1(d, q) // a porta inversora é uma porta básica do Verilog endmodule 4.13 - Representando hierarquia A hierarquia é representada pela instanciação. Instanciando blocos de níveis inferiores (sub-blocos) nós podemos usar sua funcionalidade, mas não precisamos descrever sua d q D_FF clock reset q q T_FF tff 0 q T_FF tff 0 q T_FF tff 0 q T_FF tff 0 q0 q1 q2 q3 clock reset Contador de 4 bits Projeto de Sistemas Digitais na Atualidade pág. 28 A Alexandre Scaico Dezembro/2000 funcionalidade neste nível. Podemos descrever o módulo de nível inferior em qualquer outro lugar. No entanto isso significa que o módulo pode ter dois tipos de nomes: nomes de referência e nomes de instância. Para não gerar confusão vamos ver um exemplo de um somador completo feito a partir de dois meio somadores. Isso nós dá dois níveis de hierarquia. Fig. 20 – Estrutura hierárquica de um somador completo Neste caso, o bloco meio somador, com nome de referência HALF_ADD é instanciado duas vezes. Então precisamos de dois nomes de instância U1 e U2 para distinguí-los. Fig. 21 – Instâncias em um somador completo Tipicamente você vai instanciar o nível mais alto do seu projeto em um módulo de estímulo (que serve para testar a funcionalidade do projeto), que então passará a ser o seu bloco de nível superior. 4.14 - Componentes de uma simulação Uma vez que um projeto ou parte dele é completado, é uma boa prática testá-lo. A funcionalidade do bloco projetado pode ser testada aplicando-se estímulos e checando os resultados. Nós chamamos o bloco que faz isso de módulo de estímulo. É uma boa prática manter o projeto e módulo de estímulo em arquivos separado e identificar os dois como fazendo parte de um mesmo projeto maior. Dois estilos de aplicação de estímulos são possíveis. No primeiro estilo o módulo de estímulo instancia o módulo do projeto e mando e recebe sinais do mesmo (o bloco de estímulo não possui nem entradas nem saídas). No segundo estilo, os blocos de estímulo e projeto são instanciados em um módulo de teste (novo bloco de nível superior). O bloco de estímulo então interage com o projeto através de suas interfaces. Temos a seguir um esquema ilustrativo desses dois estilos de simulação. somador completo meio somadormeio somador HALF_ADD U1 HALF_ADD U2 OR FULL ADD A B Cin SUM CARRY Nomes de instância Projeto de Sistemas Digitais na Atualidade pág. 29 A Alexandre Scaico Dezembro/2000 Fig. 22 – Estilos de simulação 4.15 - Nomes hierárquicos Como foi visto o Verilog suporta uma metodologia de projeto hierárquico. Cada instância de um módulo é definida com um identificador (seu nome de instância). Cada identificador em particular tem uma posição única na hierarquia do projeto. Um nome hierárquico é uma lista de identificadores separados por pontos para cada nível de hierarquia. Então, cada identificador pode ser endereçado de qualquer lugar do projeto simplesmente especificando o nome hierárquico correspondente desse identificador. O módulo de nível superior é chamado de módulo raiz porque ele não é instanciado em nenhum lugar do projeto. Ele é o ponto de partida. Normalmente o módulo de nível superior é um módulo de estímulo (para testar o projeto). Para identificar o nome único de um identificador, comece do módulo de nível superior e trace o caminho através do projeto hierárquico até o identificador desejado. Para ficar mais claro esse processo, vamos considerar o exemplo abaixo, já visto anteriormente. Fig. 23 – Módulo de estímulo do somador completo Para essa simulação, o módulo ESTÍMULO é o módulo de nível superior. Como ele não é instanciado em parte alguma, ele é o módulo raiz. Os identificadores definidos nesse módulo são A, B, Cin, SUM e CARRY. Módulo raiz instancia U1 (com o identificadores a, b, L1 e L2) e U2 (com os identificadores (L1, cin, sum L3), que são módulos do tipo HALF_ADD e uma porta básica OR (com os identificadores L2, L3, cr). Como a porta OR é um bloco básico do Verilog e só é usado uma vez não é necessário instanciá-la. A partir dai podemos identificar os nomes hierárquicos, que são: HALF_ADD U1 HALF_ADD U2 OR FULL ADD A B Cin SUM CARRY ESTÍMULO L1 L2 L3 módulo projetado Bloco de estímulo (estímulos) (resultados) Bloco de teste módulo de estímulo módulo do projeto Projeto de Sistemas Digitais na Atualidade pág. 30 A Alexandre Scaico Dezembro/2000 ESTÍMULO ESTÍMULO.FULL_ADD.HALF_ADD.U1 ESTÍMULO.FULL_ADD ESTÍMULO.FULL_ADD.HALF_ADD.U2 ESTÍMULO.FULL_ADD.A ESTÍMULO.FULL_ADD.HALF_ADD.U1.A ESTÍMULO.FULL_ADD.B ESTÍMULO.FULL_ADD.HALF_ADD.U1.B ESTÍMULO.FULL_ADD.Cin ESTÍMULO.FULL_ADD.HALF_ADD.U1.L1 ESTÍMULO.FULL_ADD.SUM ESTÍMULO.FULL_ADD.HALF_ADD.U2.L1 ESTÍMULO.FULL_ADD.CARRY ESTÍMULO.FULL_ADD.OR.CARRY A partir dai você pode identificar os outros nomes hierárquicos. 4.16 - Exemplos de módulos Vamos agora mostrar 2 exemplos simples de módulos para mostrar de uma forma geral como uma descrição é feita no Verilog. 4.16.1 - Meio somador Fig. 24 – Estrutura de um meio somador A palavra chave module define o começo de cada descrição de módulo e é seguida pela lista de portas. Após a lista de portas vem a declaração das portas. Cada porta é declarada com entrada, saída ou entrada/saída. Você pode especificar portas como barramento declarando que a porta tem um comprimento nas declarações de entrada ou saída. Finalizando descrevemos o comportamento do módulo. Neste caso temos duas atribuições de sinais: o resultado de "A xor B" é atribuído para a saída SUM, e o resultado de "A and B" e atribuído para a saída CARRY. A seguir temos o código em Verilog para esse módulo. module HALF_ADD(A, B, SUM, CARRY); output SUM, CARRY; input A, B; assign SUM=A^B; assing CARRY=A&B; endmodule