# Verilog

Verilog, cuja padronização atual é a IEEE (1364 – 2005), é uma linguagem de descrição de equipamento físico (Hardware Description Language — HDL) usada para modelar sistemas eletrônicos ao nível de circuito. Essa ferramenta suporta a projeção, verificação e implementação de projetos analógicos, digitais e híbridos em vários níveis de abstração. Um dos principais atributos da modelagem de circuitos por linguagem descritiva frente à modelagem por captura de esquemático, é que desta maneira o projeto se torna independente da plataforma de desenvolvimento (IDE) em que se está trabalhando. Além disso, adotando-se as boas práticas na descrição dos circuitos, o compilador é inclusive capaz de contornar a ausência de determinado recurso na tecnologia onde o circuito será sintetizado, conferindo uma portabilidade desse modelo para qualquer dispositivo (Target) onde pode ser sintetizado.
Com placas de desenvolvimento baseadas nos Circuitos Integrados (CI's) específicos, é possível descarregar o código gerado nessa linguagem para matrizes de portas lógicas combinacionais (gates) e sequenciais (flip-flops) e/ou seus híbridos, que constituem o que se chama de uma célula padrão (standard cell), por exemplo, em FPGAs (field programmable gate array — matriz de portas programáveis). Os CI's programáveis dessas placas são constituídos por milhares de blocos lógicos; e fazem basicamente o mesmo que vários circuitos integrados, com a diferença de que a matriz é reprogramável. Basicamente, o compilador interpreta o código; e a ferramenta de programação realiza a gravação da lógica que define as interconexões desses blocos, de modo a atender à descrição textual modelada na linguagem.

## História
### Início

Verilog foi uma das primeiras linguagens para descrição de hardware (HDL) a ser inventada. Criada por Prabhu Goel e Phil Moorby, durante o inverno de 1983/1984, para a Automated Integrated Design Systems (mais tarde Gateway Design Automation, em 1985). A empresa Gateway Design Automation foi comprada pela Cadence Design Systems em 1990, que passou a ser a detentora dos direitos sobre as linguagens Verilog e Verilog-XL, que se tornariam um padrão na década seguinte. Originalmente, a linguagem tinha por objetivo descrever e permitir simulações; mais tarde, também lhe foi acrescentada a síntese de circuitos.

### Verilog-95

Diante do crescente sucesso da linguagem VHDL na época, a empresa Cadence decidiu tornar a linguagem aberta para padronização, transferindo-a para domínio público, subordinada à Open Verilog International (OVI; atualmente Accellera). Mais tarde submetida ao IEEE, tornou-se padrão segundo o IEEE Standard 1364-1995, comumente chamado de Verilog-95.
Ao mesmo tempo, a Cadence iniciou a criação de Verilog-A para estender a padronização para o seu simulador analógico Spectre. Verilog-A não se tornaria um subconjunto do Verilog-AMS incorporado pelo Verilog-95.

### Verilog 2001

Extensões ao Verilog-95 foram submetidas ao IEEE para cobrir deficiências que os usuários encontraram no padrão original. Essas extensões se tornaram o padrão IEEE Standard 1364-2001, também conhecido como Verilog-2001.
Verilog-2001 foi um importante avanço em relação ao Verilog-95. Primeiro, por adicionar suporte explícito (complemento de 2) às redes e variáveis com sinais. Anteriormente, operações com sinais precisavam usar manipulações ao nível de bits (por exemplo, para lidar com o “vai-um” de uma simples adição de 8-bits, requeria-se uma descrição explícita em álgebra de Boole para se determinar o valor correto). A mesma função em Verilog-2001 podia ser descrita de forma sucinta mediante o uso de operadores nativos: +, -, /, *, >>>. Um mecanismo semelhante ao generate/endgenerate, do VHDL, permitia ao Verilog-2001 controlar instâncias e comandos para instanciações através de operadores comuns de decisão (case/if/else), podendo até mesmo instanciar arranjos de instâncias, com controle sobre a conectividade individual de cada uma. Entradas e saídas com arquivos foram aprimoradas para diversas novas tarefas. Além disso, foram introduzidas algumas alterações à sintaxe para aperfeiçoar a legibilidade de código (como por exemplo, always @*, chamadas de parâmetros e definições de assinaturas semelhantes ao estilo da linguagem de programação C para funções/tarefas/módulos).
Verilog-2001 tornou-se a versão dominante de Verilog, com suporte da maioria dos pacotes de software comerciais para a automação de projetos eletrônicos EDA.

### Verilog 2005

Verilog 2005 (IEEE Standard 1364-2005) veio a ser uma atualização do padrão anterior, incluindo pequenas correções, esclarecendo especificações e introduzindo novas características à linguagem (como a palavra-chave “uwire”).
Em particular, uma parte do padrão Verilog, Verilog-AMS, procurou integrar o modelamento de sinais analógicos e híbridos à linguagem tradicional.

### SystemVerilog

SystemVerilog é um superconjunto de Verilog-2005, com novas características e capacidades para auxiliar o projeto e sua verificação.
O advento de outras linguagens orientadas à verificação, como OpenVera e Verisity, estimularam o desenvolvimento de Superlog pela empresa Co-Design Automation Inc, mais tarde adquirida pela Synopsys. As contribuições de Superlog e Vera foram doadas pela Accellera; e posteriormente seriam incorporadas ao padrão IEEE Standard P1800-2005: SystemVerilog.
A partir de 2009, SystemVerilog e a linguagem Verilog fundiram-se no padrão SystemVerilog 2009 (IEEE Standard 1800-2009).

## Sintaxe

Os autores dessa linguagem definiram sua sintaxe bem familiar à sintaxe da linguagem de programação C. Estruturas de controle de fluxo, como if e while, são facilmente encontradas em qualquer código Verilog. A diferença básica entre o Verilog e a linguagem C se encontra na estruturação do código. A Verilog é estruturada em blocos begin/end, se caracterizando em uma linguagem modular; e a linguagem C segue o paradigma procedural.

## Paralelismo temporal

A linguagem Verilog, às vezes chamada de Verilog HDL, difere das outras pela forma como é executada. Ela não segue os padrões lineares que as demais linguagens usam. Um projeto Verilog consiste na separação hierárquica de módulos que contêm conexões e registradores. Processos sequenciais e paralelos definem o comportamento dos módulos. Processos sequenciais são executados dentro de blocos begin/end. Os demais processos são executados de forma paralela, englobando assim os blocos begin/end; ou seja, o interior de um bloco begin/end é sequencial, mas dois blocos são paralelos. Este tipo de paralelismo é amplamente explorado em hardware; e com a chegada de processadores com vários núcleos ao mercado, abre novos campos de pesquisa.

## Compilação

Como Verilog é uma linguagem de descrição de hardware, sua simulação por softwares não é muito apropriada, mas fundamental para testes e ajustes no código. Um compilador que se destaca muito no mercado é o Icarus Verilog. A simulação do Verilog acontece de forma parecida com Java. Primeiro, o código é compilado e depois interpretado. A fase de compilação é dividida em cinco partes:
1. Pré-processamento: Faz a inclusão de arquivo (include) e substituição de macros;
2. Parser: Checa a sintaxe e semântica do código;
3. Elaboração: São analisadas e geradas dezenas de listas da hierarquia dos módulos no código;
4. Otimização: A lista de hierarquia é analisada; e algumas mudanças são feitas para aumentar a eficiência da simulação;
5. Geração do código: Toda a informação do circuito é armazenada; e cinco formatos são disponíveis para a geração do código. O padrão utilizado é o formato VVP.

## VVP

O VVP (Verilog Virtual Processor) é um interpretador do código assembly criado por Icarus Verilog. Esse interpretador usa a lista hierárquica de módulos do código para dirigir a simulação em função do tempo.
Em hardware, é comum o controle dos dados por batidas de tempo (clock). A linguagem Verilog define esse controle de forma que cada bloco seja executado x milissegundos após o outro. Somente na fase de interpretação esse controle faz sentido, uma vez que o sinal de entrada de uma porta pode não ser confiável antes dos x milissegundos.