0 Bewertungen0% fanden dieses Dokument nützlich (0 Abstimmungen)
106 Ansichten25 Seiten
Este documento fornece uma visão geral da linguagem Verilog, descrevendo-a como uma linguagem de descrição de hardware utilizada para simulação e síntese. Explica os principais conceitos como modelamento comportamental e estrutural, síntese RTL e fluxos de design e simulação. Também descreve a estrutura básica de um módulo Verilog, incluindo declarações de portas, dados, funcionalidade e especificações de tempo.
Este documento fornece uma visão geral da linguagem Verilog, descrevendo-a como uma linguagem de descrição de hardware utilizada para simulação e síntese. Explica os principais conceitos como modelamento comportamental e estrutural, síntese RTL e fluxos de design e simulação. Também descreve a estrutura básica de um módulo Verilog, incluindo declarações de portas, dados, funcionalidade e especificações de tempo.
Este documento fornece uma visão geral da linguagem Verilog, descrevendo-a como uma linguagem de descrição de hardware utilizada para simulação e síntese. Explica os principais conceitos como modelamento comportamental e estrutural, síntese RTL e fluxos de design e simulação. Também descreve a estrutura básica de um módulo Verilog, incluindo declarações de portas, dados, funcionalidade e especificações de tempo.
Verilog no uma linguagem de programao de software. Uma linguagem de programao de software utilizada para executar funes em um processador baseadas em um conjunto de instrues. Por outro lado, Verilog uma linguagem de descrio de hardware, cujo objetivo especificar a descrio do comportamento de um circuito que eventualmente ser implementado em hardware. A linguagem Verilog um padro IEEE, uma linguagem de descrio de alto nvel utilizada tanto para simulao quanto para sntese. Um subgrupo da linguagem tipicamente utilizado para propsitos de sntese e a linguagem inteira pode ser utilizada para modelamento e simulao. Os padres so de 1995 e de 2001. System Verilog outro padro que acessa uma extenso do Verilog original e tipicamente utilizado para modelamento a nvel de sistema e verificao. Na literatura comum sobre Verilog ou outra linguagem de alto nvel, observa-se alguns termos comuns que sero definidos posteriormente.
- HDL significa Hardware Description Language - Linguagem de Descrio de Hardware, e consiste em uma linguagem de programao de software utilizada para modelar um hardware ou parte dele; - RTL - Register Transfer Level - Nvel de Transferncia de Registradores, define basicamente relaes entre entradas e sadas em termos de fluxo de operaes dentro do modelo de hardware; - Behavior Modelling - Modelamento de comportamento outro termo comum e basicamente um modelo que define as relaes entre entrada e sada; - Structural Modelling - Modelamento de Estrutura algo que utilizado para instanciar componentes e a descrio do circuito. Pode ser a nvel de porta ou a macro-nvel, instanciando outros mdulos no seu design. Em um design normalmente se encontra uma combinao de ambos, modelamento de estrutura e de comportamento;
A noo de sntese de traduzir o cdigo HDL para um circuito de tecnologia especfica no qual se est trabalhando: um FPGA, uma tecnologia ASIC,... Seja qual for o dispositivo de destino, as bibliotecas que pertencem a este dispositivo normalmente so utilizadas no processo de traduo durante a operao de sntese. Mdulo a unidade fundamental de design no Verilog, e todo modelo em Verilog deve ser implementado dentro de um mdulo. Em um modelo comportamental, a funcionalidade normalmente descrita, mas no necessria uma idia da estrutura atual do circuito, que tipicamente a sada do sintetizador. Durante a execuo do processo de sntese normal, o usurio ir especificar certos parmetros de otimizao para o sintetizador, que resultaro em uma estrutura particular do circuito; e em outra sntese, se os parmetros de otimizao forem diferentes, a sada do sintetizador pode ser diferente. Modelos comportamentais geralmente so utilizados tanto para sntese quanto para simulao. O cdigo feito de uma maneira comportamental porque no h nenhuma instanciao de elemento de arquitetura especfico no dispositivo no qual o cdigo ser implementado, o cdigo tipicamente genrico. Isto possibilita que uma operao de compilao destine-se a um dispositivo, e outra compilao diferente pode ser destinada a outro dispositivo, sem modificar nenhuma parte do cdigo. No modelo estrutural, tanto a funcionalidade como a estrutura do circuito so especificados, resultando nos elementos especficos de hardware que sero utilizados na implementao. O elementos de hardware podem ser genricos como portas lgicas primitivas (como uma porta E ou uma porta OU), ou uma instanciao de outro mdulo que representa outra camada de abstrao. normalmente utilizado para sntese e/ou simulao, pode ser genrico, especfico de um dispositivo ou ambos, o que significa que posso a descrio da estrutura inteira pode ser direcionada utilizando elementos primitivos da biblioteca que no so especficos de um dispositivo em particular, e ao mesmo tempo tambm possvel instanciar alguns elementos particulares da arquitetura no cdigo, controlando a implementao do circuito. Em uma designao inicial em um design tpico, encontra-se uma combinao dos modelos estruturais e comportamentais, em um modelo Verilog simples. A sntese RTL o primeiro dos processos de traduo do cdigo original, utilizando elementos de arquitetura de um dispositivo particular que ser utilizado. O sintetizador entra em um processo de otimizao para ter a certeza de uma implementao tima da descrio do circuito. No exemplo da figura abaixo h uma declarao CASE sendo implementada dentro de um bloco always, que tipicamente infere a implementao de um multiplexador.
O diagrama na figura a seguir demonstra um fluxo normal de design de sntese e simulao. No fluxo de sntese, observa-se um modelo Verilog como entrada, e suas bibliotecas de tecnologia tambm como entradas do engine de sntese. O sintetizador sintetiza seu design com o netlist sintetizado que pode de fato colocar um valor no dispositivo alvo da sntese. Nota- se neste fluxo de sntese que a sada do sintetizador pode tambm ser utilizada para gerar uma estimativa anterior de temporizao, antes que fase de place and route seja executada no design.
O benefcio disto pode ser uma idia da performance, antes da entrada no processo de place and route. A sada da engine do place and route tipicamente alimentada em um analisador de tempo esttico, onde a anlise detalhada de temporizao executada no circuito. A sada da engine de place and route, ou depois deste estgio, tambm pode produzir uma netlist em nvel de portas que pode se introduzido em um simulador para executar uma simulao em nvel de portas no design. Em um fluxo puro de simulao, o modelo Verilog, as bibliotecas tecnolgicas e o Verilog testbench se encontram alimentando um simulador, como ModelSim ou VCS. O simulador compila o design com toda esta informao para gerar um modelo de simulao ou um netlist de simulao, que alimenta a engine de simulao. A engine de simulao pode ento ser utilizada para executar a simulao de funes em seu cdigo para o propsito de verificao.
Seo 2: Estrutura de um Mdulo
Um mdulo tpico em Verilog est encapsulado entre duas palavras chave: "module" e "endmodule". Dentro de um mdulo existem quatro declaraes: declaraes dos ports, declaraes de tipo de dados, descrio da funcionalidade do circuito, i.e., comportamental ou estrutural, e finalmente a opo de incluir especificaes de temporizao. - Verilog uma linguagem case sensitive, significando que o mesmo nome de uma varivel declarada em letras maisculas ou minsculas, da perspectiva Verilog, consiste em duas variveis diferentes; - Todas as palavras chaves devem ser em letras minsculas no design; - Espaos em branco so utilizados para melhor legibilidade do cdigo, sendo recomendado o uso do trao baixo ("_"); - O ponto e vrgula a declarao de terminao, significando que se uma linha no for finalizada com o ponto e vrgula, o Verilog entende todos os caracteres como uma linha at encontrar o prximo ponto e vrgula; - Comentrios de uma linha so colocados aps barras duplas "//" e comentrios de mais de uma linha so iniciados por uma barra e um asterisco ("/*") e finalizados com um asterisco e uma barra ("*/"); - A especificao de temporizao utilizada para propsitos de simulao somente. Quando h alguma especificao de temporizao em um mdulo, o sintetizador ignora completamente.
Abaixo se encontra um exemplo de um tpico mdulo Verilog. Neste mdulo observa-se o incio com um atributo que neste caso uma escala de tempo que especifica a resoluo para o simulador, utilizado somente para fins de simulao. Aps encontra-se a palavra chave "module", especificando o nome do mdulo, e entre parnteses os nomes dos ports de entrada e sada do mdulo. Na primeira seo, os tipos de dados dos ports so definidos como conexes externas do mdulo como entradas e sadas, definindo tambm os tipos de dados para estas entradas e sadas. A declarao de designao "assign" na caixa em verde denominada de declarao de designao contnua, que resulta em um circuito combinacional (neste caso sintetizada em um somador). No bloco rosa h o que denomina-se de bloco sequencial, que neste caso gera um flip-flop acionado pela borda positiva, e finalmente na seo azul h uma instanciao de um componente que foi declarado em algum outro mdulo, componente este denominado "multa", com um nome da instanciao de "u1", juntamente com os nomes dos sinais que alimentam os ports de entrada e sada deste componente. A ltima declarao no mdulo a palavra chave "endmodule".
Ports so os meios primrios de comunicao com um mdulo. Existem trs tipos fundamentais de ports em Verilog, denominados de ports de entrada (input), de sada (output) e de entrada-sada (inout), que possibilitam conexes bidirecionais para fora ou para dentro de um mdulo. No exemplo exibido abaixo, ports "ina" e "inb" so ports de oito bits do tipo entrada, ports clock - "clk" e clear - "clr" so ports de entrada e o port "out" um port de sada de dezesseis bits.
Existem dois tipos de dados fundamentais em Verilog denominados net e register. Tipos de dados net geralmente representam informao de interconexo e o tipo de dado register geralmente representa variveis de armazenamento temporrio, que pode ser sintetizado em um flip-flop no hardware (ou registrador de hardware), ou em um n combinatrio.
Como mencionado anteriormente, tipos de dados net representam informao de interconexo. O slide abaixo exibe os tipos mais comuns de dados net que so utilizados em mdulos Verilog, denominados tipos de dados "wire", que representam um n ou uma conexo. O tipo de dado "tri" representa um n "tristate" e fornece uma fonte para hardcode de nvel lgico zero ou um. Por exemplo, o bus "out" um bus de oito bits do tipo "wire" e o sinal enable um sinal tristate no exemplo a seguir.
Variveis do tipo de dados register podem ser sintetizadas tanto em ns combinacionais ou sequenciais, ou so sintetizadadas como uma funo dos contatos e tipos de declaraes nas quais so utilizadas. Um tipo de dado register pode ser um dos seguintes tipos: register, integer, real, time e realtime. Uma varivel do tipo reg pode ser designada somente por um procedimento de declarao, uma tarefa ou uma funo. Uma varivel do tipo reg tambm no pode ser a sada de uma porta ou de uma declarao de designao (so regras do Verilog). O exemplo abaixo exibe uma varivel de oito bits denominada "out" do tipo reg, e tambm uma varivel denominada "count "do tipo integer. O significado de um inteiro (integer) dependente do dispositivo alvo do cdigo, mas geralmente traduzido por um registrador de alguns bits.
Conexes para dentro ou para fora de um mdulo possuem regras bsicas, de acordo com a tabela a seguir. Se voc possui uma varivel do tipo net, ela pode ser declarada do tipo input, output, ou inout. Uma varivel do tipo register somente pode ser declarada do tipo output (os tipos input e inout no so possveis).
Valores designados para as variveis podem ser dimensionados ou no dimensionados. Se o tamanho de uma varivel no for especificada, ela ser traduzida em um tamanho de 32 bits decimais por padro. Para especificar o tamanho de uma varivel ou o tamanho de um valor que atribudo a uma varivel, o formato exibido aqui. O primeiro exemplo demonstra 3'b010, que diz ao compilador que esta entidade uma entidade de trs bits, o formato da informao est em binrio e o valor atribudo varivel "010". possvel especificar o radix da informao que atribuda a uma varivel, para melhorar a legibilidade do cdigo. Podem ser especificados os formatos decimal, hexadecimal, binrio e octal, como demonstrado nestes exemplos:
Nmeros negativos em Verilog so representados precedendo o tamanho do valor com um sinal negativo. Por exemplo, -8'd3 representa um nmero negativo armazenado em 8 bits como o complemento de 2 do nmero 3. O segundo exemplo 4'd-2 resulta em um erro de sintaxe porque o sinal negativo colocado depois da definio do tamanho. Existem alguns caracteres especiais que so utilizados no Verilog, incluindo o underscore ("_"), que utilizado normalmente para finalidade de legibilidade do cdigo, "x" minsculo ou "X" maisculo, utilizado normalmente para especificar valor desconhecido, e "z" minsculo ou "Z" maisculo, que utilizado normalmente para especificar valores de alta impedncia.
Em termos de operadores aritmticos, o Verilog define soma, subtrao, multiplicao e diviso. A linguagem Verilog trata o operando nestas operaes como um valor total. Se qualquer um destes operandos "z" ou "x" o resultado ser desconhecido, se o resultado e os operandos so do mesmo tamanho, o sinal de carry (vai um) ser perdido (deve-se ter certeza de que a sada deve ter um tamanho maior que os operandos). Todos os valores negativos so armazenados no formato de complemento de 2, e deve-se ter esta informao em mente em um modelamento comportamental em particular, porque na realidade sero uma srie de bits.
Operadores bit a bit podem ser operadores unrios ou binrios. Verilog define os operadores Invert, And, Or, Xor e Xnor. Estes operadores atuam em cada bit do operando, e normalmente o resultado do mesmo tamanho que o maior operando, e na ocorrncia de uma m combinao no tamanho, usualmente o operando de menor tamanho preenchido esquerda com zeros para acomodar a diferena no tamanho.
Operadores de reduo so operadores unrios que reduzem um vetor a um nico bit. Verilog define operadores de reduo And, Nand, Or, Nor, Xor e Xnor. Valores "x" ou "z" so considerados desconhecidos, mas o resultado pode ser um valor conhecido. No exemplo abaixo, se din=3'bX011, &din resulta em 1'b0.
Operadores relacionais so utilizados para comparar valores. Estes operadores fornecem um valor de um bit, que representa usualmente um valor falso ou verdadeiro. Se qualquer um dos operadores for "z" ou "x", o resultado desconhecido. A linguagem Verilog define os quatro operadores maior que, menor que, maior ou igual que e menor ou igual que.
Operadores de igualdade so utilizados para comparar valores, e normalmente retornam um valor escalar de um bit que representa falso ou verdadeiro. Em Verilog existem quatro tipos diferentes de operadores de igualdade que podem ser utilizados: igualdade, desigualdade, caso igualdade e caso desigualdade; que literalmente comparam bit a bit os operandos para decidir se a sada ser 1 ou 0. No caso de se utilizar os operadores de igualdade e desigualdade, se qualquer um dos operandos "z" ou "x", o resultado ser desconhecido. No caso dos operadores de caso igualdade e caso desigualdade, os valores "z" e "x" so includos como parte de definio de tipos, sendo aceitos na operao.
Os operadores lgicos em Verilog podem ser unrios ou binrios. A linguagem Verilog define o operador "NO", um operador unrio, um operador "E" binrio e um operador "OU" binrio. Quando estes operadores so utilizados, retornam um valor de um bit que representa falso ou verdadeiro, e se qualquer um dos operandos "z" ou "x" o resultado desconhecido.
Operadores de deslocamento so utilizados para deslocar um vetor para a esquerda ou para a direita. Os bits deslocados so normalmente perdidos, e as posies anteriores destes bits so preenchidas com zeros.
Um dos operadores mistos mais utilizados em Verilog so o operador condicional, que consiste em uma maneira conveniente de representar uma verso compacta da declarao if...then...else. No exemplo sig_out = (sel = = 2'b01)?A:B, o sinal sel comparado com o valor "01", e se for verdadeira a igualdade o valor "A" atribudo varivel "sig_out", caso contrrio o valor "B" atribudo. A operao de concatenao outra operao muito utilizada em Verilog, para basicamente combinar dois vetores para produzir um vetor maior, resultante da concatenao dos vetores operandos. A operao de replicao pode replicar um mesmo vetor diversas vezes, atribuindo o valor resultante a uma varivel ou utilizando-o em uma expresso.
muito recomendvel, ao utilizar diversos operadores em uma mesma linha de cdigo, utilizar parnteses para a precedncia nas operaes com os operandos, obtendo-se assim mais clareza no cdigo, exibindo-se exatamente as operaes na ordem em que sero executadas. Em casos em que isto no possvel, a lista abaixo demonstra como o compilador ordena a prioridade dos diferentes tipos de operao no Verilog.
Executando Designaes:
Em Verilog existem duas maneiras fundamentais de se efetuar as designaes: declaraes de designao contnuas e declaraes de designao de procedimento. Declaraes de designao contnuas so utilizadas normalmente para gerar circuitos combinacionais e pode ser efetuada durante o estgio de declarao de variveis, como no exemplo a seguir em que a varivel "adder_out", do tipo wire, igual "mult_out + out". O exemplo abaixo produz uma designao de um circuito combinacional. No corpo do mdulo pode ser utilizada a palavra chave "assign" para criar uma declarao de designao continua. Isto significa que a qualquer momento em que qualquer uma das variveis "mult_out" ou "out" modificar seu valor, a varivel "adder_out" ser atualizada para seu novo valor. Verilog possibilita tambm definir valores de atraso quando a designao executada. No exemplo: assign #5 adder_out = mult_out + out significa que a varivel "adder_out" modificar seu valor 5 unidades de tempo depois que "mult_out" ou "out" modificarem seu valor. Se o simulador estiver sendo executado e a varivel "out", por exemplo, se modifica em t=1, a varivel "adder_out" se modificar em t=6. As declaraes de designao continua seguem as seguintes regras:
Declarao de designao de procedimento so designaes efetuadas dentro de um bloco de designao de procedimento. Em Verilog, existem dois tipos de blocos de designao de procedimento, denominados bloco "initial" e bloco "always". Um bloco initial utilizado normalmente para inicializar declaraes de comportamento somente para fins de simulao. Ento, qualquer que seja o cdigo incluso dentro de um bloco initial, ignorado pelo sintetizador. Um bloco always utilizado normalmente para descrever a funcionalidade de um circuito utilizando declaraes de comportamento. Cada bloco always e initial representa um processo separado, e em um circuito normalmente se encontram muitos blocos always. Na simulao, todos estes blocos always estaro sendo executados concorrentemente ao mesmo tempo. Estes processos so executados em paralelo e iniciam no tempo de simulao zero. Depois do incio da sesso de simulao, estes processos esto imediatamente ativos e a qualquer tempo qualquer uma das entradas destes blocos executaro o cdigo dentro do bloco. As declaraes dentro de um processo so executadas seqencialmente. Ento as declaraes dentro de um bloco always, seja qual forem, sero executadas na ordem em que esto. Blocos always e initial no podem ser aninhados, no sendo possvel um bloco always dentro de outro bloco always ou de um bloco initial. Um bloco initial consiste de declaraes de comportamento que tipicamente incluem declaraes de monitoramento, gerao de formas de onda, e qualquer processo ou seqncia de inicializao que deve ser executado pelo menos uma vez durante a sesso de simulao. Um bloco initial inicia sua execuo em t=0, executado do incio ao fim e ento cessa sua execuo, ou seja, executado somente uma vez. Todas as declaraes de comportamento dentro de um bloco initial so executadas seqencialmente, sendo que a ordem de posicionamento destas declaraes dentro do bloco deve ser levada em considerao. Observa-se que as declaraes dentro de um bloco initial so completamente ignoradas pelo sintetizador, pois o bloco initial definido na linguagem para propsitos de simulao e nunca utilizado para sntese. Como nos blocos initial, o bloco always consiste de declaraes de comportamento sendo sempre executados, i.e., no so executados somente uma vez ou param sua execuo durante a sesso de simulao. Se existem mltiplos blocos always no mdulo, o que comum, todos estes blocos sero executados concorrentemente ao mesmo tempo, porm, declaraes dentro destes blocos sero executadas seqencialmente. Blocos always so utilizados para modelar um processo que continuamente repetido em um circuito digital, um exemplo poderia ser um flip- flop ou registrador que continuamente acionado por um sinal de clock. Um bloco always se inicia no tempo igual a zero, e executa as declaraes comportamentais continuamente na forma de um loop. possvel obter uma lista de sensibilidade em um bloco always, o que significa que a execuo em um bloco always no inicia a menos que uma ou mais das variveis na lista de sensibilidade modifique seu valor. E como no bloco initial, as declaraes comportamentais dentro de um bloco always executam-se sequencialmente, ento a ordem das declaraes dentro do bloco levada em conta. Abaixo se encontra um exemplo da implementao de um bloco always, com um mdulo Verilog denominado "clock_gen" com uma sada simples denominada "clk" do tipo reg. O primeiro bloco initial inicializa a varivel "clk" com o valor zero, e ento o bloco always executa a declarao de que cada ciclo de trabalho multiplicado pelo perodo e dividido por 100. Sempre que o simulador ultrapassar este tempo dado por este cdigo, o sinal de clock ser alternado porque este valor igual ao clock negado. H outro bloco initial, que diz que aps 100 unidades de tempo executada uma chamada ao sistema dada por "finish" para finalizar a sesso de simulao. Neste exemplo o perodo de 50 e o ciclo de trabalho de 50, o que se traduz em um perodo de clock efetivo de 25 unidades de tempo. Se esta simulao for executada, o sinal de clock alternar seus valores a cada 25 unidades de tempo e em t=100 a simulao ser finalizada.
Dentro de um bloco de designao de procedimento existem dois tipos de declaraes de designao que podem ser utilizados para propsitos de modelamento: designao de bloqueamento e designao de no-bloqueamento. As designaes de bloqueamento so executadas na ordem em que so especificadas em um bloco seqencial, o que significa que se existem duas designaes de bloqueamento consecutivas, a segunda designao no pode ser executada at que a primeira tenha finalizado sua execuo. Designaes de no-bloqueamento possibilitam o agendamento de designaes sem bloquear a execuo de declaraes que se seguem em um bloco seqencial. Se existem duas designaes de no-bloqueamento consecutivas, a segunda designao pode ser executada ao mesmo tempo em que a primeira executada. E novamente estes tipos de designaes de bloqueamento e no-bloqueamento podem estar dentro de um mesmo bloco de procedimento. Os valores ou os tipos de valores que so utilizados dentro de um bloco seqencial devem ser do tipo reg, que pode incluir variveis do tipo definido como reg, integer, real, time ou realtime.
O slide da figura abaixo demonstra alguns exemplos de uso das designaes de bloqueamento e no-bloqueamento. O exemplo esquerda demonstra um bloco initial com duas designaes, "a=b" e "c=d". Em t=5, o simulador traduz que "b" atribuda a "a", e em t=10, "d" ser atribuda a "c". Como est sendo utilizada uma designao de bloqueamento, "d" atribuda a "c" no pode ser executada at que "b" seja atribuda a "a", que somente ocorre quando t=5. Ento em t=5 a designao de "a=b" executada, e 10 unidades de tempo depois, a designao "c=d" executada. No exemplo de no-bloqueamento, temos um bloco initial que executa as mesmas designaes no exemplo do lado esquerdo, exceto pela utilizao de designaes de no-bloqueamento. Como podemos observar claramente deste exemplo, caso seja utilizada designao de no-bloqueamento, ambas declaraes podem ser executadas ao mesmo tempo, e ento a designao "c <= d" no necessita esperar at que a designao "a <= b" seja executada. Ento a designao "c <= d" executada em t=10, e no em t=15.
Abaixo encontra-se outro exemplo de comparao entre as designaes de bloqueamento e de no-bloqueamento, o que pode resultar em uma diferena significativa no comportamento do circuito. O uso cuidadoso de designaes de bloqueamento e de no bloqueamento dever ser levado em considerao para sintetizar o circuito corretamente.
O bloco de procedimento always pode ser utlizado por circuitos combinacionais e circuitos com clock. O tipo de circuito sintetizado tipicamente uma funo do tipo de uma funo primitiva que utilizada dentro de um bloco always. Por exemplo, se na lista de sensibilidade h somente variveis, isto pode resultar em um circuito combinacional pelo sintetizador. Se no bloco always existem as funes pr-construdas "posedge" ou "negdge" clock, isto pode resultar na sntese de um circuito com clock ou em um circuito sequencial. Nestes tipos de circuitos no necessrio especificar a entrada do elemento de registro na lista de sensibilidade, porque assume-se que quando o clock muda o dado j est estvel na entrada no flip-flop.
Declaraes de comportamento so declaraes que podem ser utilizadas dentro de um bloco de designao de procedimento, i.e., um bloco always ou initial. A linguagem Verilog define trs tipos diferentes de delaraes de comportamento que podem ser utilizadas, denominadas declaraes "if-else", declaraes "case" e declaraes "loop". O formato das declaraes if-else demonstrado aqui. possvel obter declaraes if- else aninhadas quantas vezes for necessrio. O nico fato a se prestar ateno que no caso do uso de declaraes if-else aninhadas teremos um circuito que sintetizado utilizando uma implementao de prioridade de trs tipos, que resulta em muitas camada de lgica. No exemplo direita, a lista de sensibilidade inclui todas as entradas no circuito combinacional, assim como todas as variveis "select", neste caso "a", "b" e "c", "sela" ou "selb". Isto significa que este bloco always ser chamado ou executado a qualquer tempo em que qualquer uma destas variveis modificar seu valor.
A declarao case uma maneira conveniente de implementar declaraes if-then-else ou comportamento if-then-else complexos. A diferena entre uma declarao case e uma if-else o fato de que todas as declaraes no case so executadas ao mesmo tempo. A sada tpica do sintetizador da declarao case um multiplexador. No exemplo abaixo e direita, observa-se que a lista de sensibilidade especifica novamente todas as entradas, o que inclui as variveis "a", "b", "c" e "d", e as variveis de seleo do multiplexador, e ento a declarao case executada. Neste exemplo, se a varivel de seleo igual a "00", "a" atribudo para "q", seno observa-se a prxima declarao, se a varivel de seleo igual a "01", "b" designado a "q", se igual a "10", "c" designado a "q", e h uma declarao padro para o caso das anteriores falharem, no caso designando "d" para "q". Assim, a declarao case finalizada.
O Verilog tambm define dois outros casos da declarao case, denominados declarao casez e declarao casex. A declarao casez trata todos os valores "z" na condio case como no importa, ao invs de valores lgicos. Todos os valores "z" podem ser representados por um ponto de interrogao. No exemplo demonstrado aqui, se o valor do encoder igual a "B1zzz", na declarao case representado por "B1???" e a declarao executada como uma condio verdadeira, e a declarao "high_lvl=3" executada. A declarao casex trata todos os valores "x" e "z" nas condies como no importa ao invs de valores lgicos. Ento, sempre que houver um "x" na declarao casex, ele representa uma condio no importa, e a declarao executada de acordo com a condio.
No Verilog esto definidas uma variedade de declaraes loop. O loop forever uma maneira comum de especificar sinais que iro se repetir continuamente, os quais so utilizados para gerao de sinais de clock, por exemplo. Neste exemplo h um bloco initial, e ao adentrar o bloco o clock inicializado com zero, e a cada 25 unidades de tempo o clock alternado pela negao do sinal de clock, e na execuo da simulao ser observado este comportamento do clock. Outra forma de looping a utilizao da palavra chave repeat, e neste exemplo temos repeat(8), o que significa que todo o cdigo que est encapsulado entre as declaraes begin e end ser repetido 8 vezes. Neste exemplo, a implementao de uma operao de deslocamento de um registrador de oito bits.
Outra forma de loop que definido no Verilog o loop while. Neste exemplo, enquanto a contagem menor que "101", as declaraes entre o begin e end so executadas, e no importa se todas estas declaraes esto encapsuladas dentro de um bloco initial, novamente estas so declaraes de comportamento que necessitam estar dentro de um bloco de designao de procedimento, (um bloco initial ou um bloco always).
Outra forma comum de loop utilizada no Verilog o loof for, que basicamente executa o loop de um incio, e continua a execuo enquanto uma condio do loop for verdadeira. No exemplo, o loop for vai ser executado e se iniciar designando um valor 4 varivel "i", e ento esta varivel incrementada por 1 cada iterao, que executada continuamente at "i" ser menor ou igual a 7. Neste exemplo as declaraes dentro do loop sero executadas para i = 4, 5, 6 ou 7.
A maneira em que o circuito codificado ter um impacto direto na existncia de sinais de controle sncronos ou assncronos implementados nos flip-flops. O cdigo no lado esquerdo abaixo demonstra como presets e clears sncronos necessitam ser codificados em Verilog. Neste cdigo em particular, h um bloco always acionado pela borda positiva do sinal de clock. Neste bloco always, os valores ou os estados dos sinais clear e preset so verificados, e baseado nisto, o clear ou set do flip-flop acionado, e se ambos no esto ativos, i.e., se ambos, neste caso, so iguais a zero, na borda de subida do clock a entrada "d" aparecer, em sincronia com o sinal de clock, na sada "q" do flip-flop. O cdigo esquerda demonstra que na lista de sensibilidade, o cdigo est sensvel borda de subida do clock ou do clear. Ento se o sinal clear muda de zero para um, desconsiderando o valor do sinal do clock ou a borda do sinal do clock, a execuo passa para o flip-flop sendo efetuado um clear, e ento, esta implementao, em particular, uma implementao assncrona de um clear que completamente independente do clock.
Para implementar a habilitao de um clock, a maneira mais fcil demonstrada no exemplo abaixo, com um bloco always que sensvel borda de subida do clock, e dentro deste bloco observa-se que o "if" ativo se "ena" igual a um, e ento "d" atribudo a "q". Mesmo que o clock ocorra, se "ena" igual a zero no bloco always, "q" mantm seu estado prvio e o valor "d" no atribudo no flip-flop.
No exemplo a seguir, de um contador que possui uma operao clear assncrona, na lista de sensibilidade do bloco always h uma borda de subida do clock ou borda de subida de "aclr". No bloco always, se o clear assncrono for ativado, a sada ser limpa sendo atribudo o valor "00", caso contrrio executa-se a seo else desta declarao if-else, dentro da qual h uma declarao case, que observa basicamente o valor dos sinais de controle de "func". Se o valor de "func" for igual a "00", a entrada no contador carregada para inicializ-lo, se "func" igual a "1" incrementado, se "func" igual a "2" decrementado e se "func" igual a "3" o estado atual do contador se mantm.
A linguagem Verilog tambm define funes e tarefas, que so subprogramas, similares aos subprogramas vistos em linguagens de alto nvel como C, C++, Pascal, ou qualquer outra linguagem de alto nvel usual. So teis para cdigo repetitivo com similaridades e diferenas entre estes dois tipos. Adiciona legibilidade ao mdulo, possibilitando a compresso do cdigo. Uma funo geralmente retorna um nico valor, baseado nas suas entradas, e geralmente produz lgica combinacional. Por exemplo, se utilizarmos uma declarao continua de designao assign como: assign mult_out=mult(ina,inb); mul neste caso uma funo que foi definida anteriormente. Uma tarefa no contexto do Verilog como um procedimento em outras linguagens de alto nvel. Pode representar lgica combinacional ou de registradores. Tarefas so invocadas como declaraes no cdigo Verilog, e a linha de cdigo instanciado com uma tarefa ser substituda pelo cdigo escrito dentro da tarefa. No exemplo stm_out(nxt, first, sel, filter) a tarefa denominada stm_out com variveis nxt, first, sel e filter. O exemplo a seguir demonstra uma definio de funo, que se inicia com a palavra chave "function", a especificao do nome da funo, e se uma funo de um bit ou multibit, i.e., se vai retornar um valor de um bit ou multibit. especificada a entrada para a funo, neste exemplo duas entradas "a" e "b", e duas variveis locais "r" e "i" a serem utilizadas dentro da funo. No exemplo, a funo implementa uma operao de multiplicao utilizando o algoritmo combinatrio. Nota-se que a ltima declarao na funo atribu um valor ao nome da funo que ser retornado aps a chamada a esta funo.
No exemplo abaixo demonstrada uma instanciao da funo que foi declarada, com uma declarao de designao continua ou combinacional que designa o valor que retornado pela funo "mult", com entradas "a" e "b", sendo atribudo varivel "mult_out".
A seguir encontra-se um exemplo completo de uma tarefa, com um mdulo denominado "tasks" que define basicamente uma tarefa simples denominada "add". Sero transmitidos dois parmetros para esta tarefa, parmetros "a" e "b", sendo produzido um parmetro denominado "c". Dentro do corpo da tarefa definida uma operao, neste exemplo "c=a+b". Dentro do mdulo h um bloco de procedimento initial que utilizado para executar algumas designaes de procedimentos, encapsuladas entre um begin e um end porque existem mltiplas declaraes dentro deste bloco initial. Uma varivel local definida e denominada "p", e ento efetuada uma chamada tarefa "add" com trs parmetros de valores 1, 0 e "p" (1 atribudo varivel "a", 0 "b" e "p" "c"). Aps a chamada desta funo, ser atribudo "p" o valor 1 (resultado da operao 1+0). O "$display" uma chamada do sistema que ir exibir o valor de "p". Este um exemplo simples de tarefa, mas engloba os elementos diferentes de uma tarefa que podem ser utilizados dentro de um mdulo.
Na tabela abaixo so apresentadas algumas diferenas entre tarefas e funes, e uma das principais que fundamentalmente uma funo executada no tempo 0, enquanto uma tarefa basicamente uma substituio de uma poro de cdigo dentro de um mdulo Verilog no ponto em que instanciada.