Sunteți pe pagina 1din 25

CURSO BSICO DE VERILOG

Seo 1: Viso geral do Verilog



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.