|
“Ainda que eu andasse pelo vale da sombra da morte, não temeria mal algum…” Salmos 23:4 |
Prezados leitores, começo esse post com um Salmo. Pode parecer estranho, mas justifico essa abordagem porque pretendo tratar de um assunto delicado e suscetível a críticas pesadas. NÃO TEMEREI – Verilog e VHDL – Qual a diferença entre essas duas linguagens de descrição de hardware? Quais as vantagens e desvantagens entre as duas linguagens?
Vou direto no ponto. Estarei me guiando pelo artigo [1], em leituras adicionais de sites e livros que possuo. Não estarei analisando as especificações em si, nem as variações (VHDL 2008, VERILOG 2005, e outros) – portanto, alguns detalhes das especificações podem variar. Caso você tenha alguma dúvida mais específica sobre essas linguagens, pesquise no Embarcados ou em outros sites os seguintes tópicos: FPGA, Descrição de Hardware, Verilog, VHDL. Existem diversos posts que detalham bem cada assunto. O aprendizado será grande.
Capacidade de Modelagem HDL
Tendo em vista que ambas linguagens têm a capacidade de descrever hardware, podemos analisar então como cada uma permite essa descrição – ou seja, quais os níveis de abstrações que cada linguagem melhor se adapta (aqui cabe uma ressalva – essas linguagens evoluem, portanto podem variar conforme novas especificações são feitas). A Figura 1 concatena alguns detalhes desta capacidade de modelagem.
É importante identificar e entender os cinco níveis de abstração mostrados acima – sistema, algoritmo, nível de transferência de registro (RTL), lógico e nível de porta.
Níveis de Sistema e Algoritmos não são sintetizáveis, ou seja, consistem em um grupo de instruções ou mesmo uma sequência que deve ser seguida e não possuem restrições de tempo (atrasos, clock). Já o nível RTL e Lógico consistem na entrada para a síntese, variando entre si, conforme o nível de detalhamento dos atrasos entre as lógicas. Por fim, o nível de porta consiste na saída final da síntese, ou seja, aqui já temos uma rede de portas lógicas e registradores sintetizados para uma determinada tecnologia. Em resumo, podemos entender que a grande diferença entre esses níveis de abstração está em termos de detalhamento de timing de cada nível.
Modelagem Low-Level (Baixo Nível)
As duas linguagens permitem modelagem em nível de portas lógicas, contudo VERILOG é mais indicada que VHDL para uma descrição Low-Level (observer a Figura 1). Justifico essa afirmação tendo em vista que a origem do VERILOG foi primordialmente para modelar e simular portas lógicas. VERILOG possui primitivas nativas ou portas lógicas, nas quais um desenvolvedor pode instanciar sem maiores traumas, quando comparada com VHDL. A dica para modelar Low-Level em VHDL é utilizar os operadores lógicos NOT, AND, NAND, OR, NOR, XOR, XNOR. Abaixo é possível comparar essas primitivas e seus equivalentes em VHDL e VERILOG.
or u0(x, y, z); VERILOG <-> x <= y OR z; VHDL and u1(d1, d2, d3); VERILOG <-> d3 <= d2 AND d3; VHDL
Abaixo seguem mais algumas primitivas nativas em VERILOG bem interessantes. Neste site é possível obter mais detalhes sobre essas primitivas.
VERILOG - Portas Lógicas and; nand; or; nor; xor; xnor; buf; not; bufif0; notif0; bufif1; notif1; pullup; pulldown; VERILOG - Switches pmos; nmos; rpmos; rnmos; cmos; rcmos; tran; rtran; tranif0; rtranif0; tranif1; rtranif1;
VERILOG possui suporte a duas dúzias de primitivas para modelagem de lógica estrutural. Adicionalmente a essas primitivas, o VERILOG possui suporte a primitivas definidas por usuários, UDP (User-Defined Primitives). UDPs são muito úteis e populares entre projetistas de ASICs. Neste site existem alguns exemplos de como começar uma biblioteca UDP em VERILOG.
Neste sentido, se o projeto final implica em um ASIC, e se você for um projetista de ASIC – use VERILOG.
Modelagem High-Level (Alto Nível)
Aqui pulamos para um outro ponto de vista. VHDL é muito melhor para descrever hardware em alto-nível, observe a figura 1.
VHDL possibilita a criação de tipo de dados definidos pelo usuário.
type int_8bit is range 0 to 255 -- define 8-bit unsigned numbers signal i : int_8bit; type state_FSM is (Idle, start, calculate , finish, delay) -- define symbolic states to represent FSM states. signal current_state, next_state: state_FSM;
Pacotes (package) para reuso em projetos. Subprogramas e tipos de dados reutilizados podem ser declarados em um pacote VHDL e reutilizados em outras entidades e arquiteturas. VERILOG possui o equivalente através da diretiva de compilação include ” “.
package fsm_type is type FSM_states is (IDLE, TRANSMIT, RECEIVE, STOP); end package -- to use the FSM_states type in an entity or architecture -- use the following statement on top of the entity use work.fsm_type.all entity example is
Declaração de configuração em VHDL permite que um projeto em VHDL possua muitas entidades de projetos com arquiteturas diferentes. Esse recurso é muito útil para os projetistas que utilizam VHDL e precisam gerenciar um projeto de alto nível, cujas características podem variar.
configuration CONFIGURATION_NAME of INSTANTIATING_ENTITY is
for INSTANTIATING_ARCH
for INSTANCE_NAME : COMPONENT_NAME
use entity LIBRARY_NAME.ENTITY_NAME(ARCHITECTURE_NAME);
end for;
end for;
end CONFIGURATION_NAME;
Gerenciamento de Bibliotecas. Essas bibliotecas VHDL possuem arquiteturas, entidades, pacotes e configurações já compiladas. Esse recurso é muito útil no gerenciamento de grandes estruturas de projeto.
-- library management in VHDL library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.numeric_std.all;
Tão quanto o fluxo de projeto não requeira uma modelagem em baixo-nível, é preferível o uso de VHDL. Ou seja, se você for um projetista de sistemas em FPGA, use VHDL.
Verbosidade entre VHDL e VERILOG
VHDL é fortemente tipada, ou seja, você tem que descrever a sua lógica de acordo com o tipo de dados definidos na estrutura inicial do seu código. Caso você misture tipos de dados, o compilador irá acusar erro. Isso não ocorre em VERILOG – portanto muito cuidado e atenção na codificação em VERILOG.
Outro aspecto que traduz em um VHDL mais “verboso” é o fato de o VHDL possuir muitos tipos de dados complexos, e, além disso, temos que considerar que o usuário pode usar outros tantos tipos de dados. Observe a diferença entre os códigos abaixo.
-- VHDL CÓDIGOlibrary IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux_2to1_top is
Port ( SEL : in STD_LOGIC;
A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
X : out STD_LOGIC_VECTOR (3 downto 0));
end mux_2to1_top;
architecture Behavioral of mux_2to1_top is
begin
X <= A when (SEL = '1') else B;
end Behavioral;
// VERILOG CÓDIGO
assign OUT = (SEL==0)?tmp1 : ((SEL==1)? tmp2 : ((SEL==2)? B:A ));
Acima fica bem claro que uma descrição em VERILOG é mais simples que uma descrição em VHDL.
Outras Diferenças
Pontualmente, ainda podemos listar que:
- VERILOG é muito parecido com a linguagem C, enquanto VHDL é muito próximo a ADA e ao PASCAL;
- VERILOG é case-sensitive, o que não ocorre com VHDL;
- Em VERILOG para usar um componente em um módulo basta fazer uma instância e fazer correto “port_map”. Em VHDL, para instanciar um componente é necessário declarar as bibliotecas, os pacotes, a entidade, seguido da arquitetura, para finalmente realizar o port-map dos sinais;
- VERILOG possui diversas diretivas de compilação como “timescale”, “ifdef”, “else”, “include”. Diretivas de compilação não foram permitidas em VHDL até a especificação VHDL2008. Aqui vale uma observação lembrada pelo engenheiro Ricardo Fialho – “…sempre foi possível colocar código dentro de uma architecture usando procedure e functions…mas só servem para alguns casos…”. Valeu Tafas. A lógica abaixo é um bom exemplo de função que implementa a lógica OR bit-a-bit (unária) em VHDL.
library ieee;
use ieee.std_logic_1164.all;
package unary_logic is
function or_reduct(slv : in std_logic_vector(3 downto 0)) return std_logic;
end unary_logic;
package body unary_logic is
function or_reduct(slv : in std_logic_vector) return std_logic is
variable res_v : std_logic := '1'; -- ATENÇÃO COM A INICIALIZAÇÃO
begin
for i in slv'range loop
res_v := res_v or slv(i);
end loop;
return res_v;
end function;
end unary_logic;
Uso no Mundo – desenvolvimento de ASIC e IC
Segundo a pesquisa realizada em 2016 pelo Wilson Research Group Functional Verification Study, a linguagem de descrição de hardware mais utilizada para o desenvolvimento de ASIC e IC é VERILOG. Observe a Figura 2.
Já linguagem de VERIFICAÇÃO mais utilizadapara no desenvolvimento de ASIC e IC consiste no SystemVerilog, seguido de VERILOG (Figura 3).
Vale ressaltar que SystemVerilog foi concebida para suprir a demanda da linguagem VERILOG com relação à modelagem de alto nível. Permitindo recursos e construções de alto nível, como em VHDL, especialmente para o uso em verificação funcional de ICs. Tendo em vista que a última especificação da linguagem VERILOG foi em 2005, em círculos de programadores, que SystemVerilog tende a substituir VERILOG em todos os níveis. Será que VERILOG está morrendo? É uma dúvida interessante.
Conclusão
Neste post foram apresentados alguns aspectos entre as duas linguagens. Como toda linguagem computacional, esses aspectos podem variar conforme elas evoluem. A melhor sugestão que posso dar é: aprenda as duas. Aprenda a pensar em descrição de hardware reutilizável, com boas abstrações, código claro e bem documentado.
Um engenheiro que admiro muito me lembrou bem detalhes que havia esquecido – “…o engenheiro tem que aprender a construir uma visão sistêmica e a identificar gargalos de desempenho arquiteturais e buscar ferramentas de verificação (vunit, cocotb, UVVM)…“. Grato Eurípedes.
Invariavelmente um dia você vai se deparar com o desafio de integrar dois códigos, um descrito em VERILOG/SystemVerilog e outro em VHDL, e o entendimento das peculiaridades dessas linguagens serão fundamentais.
O assunto não se encerra aqui. Vamos conversar sobre esse assunto?
Saiba mais
PROCESSADORES PROGRAMÁVEIS – como projetar um processador em VERILOG – Arquitetura – parte 1
Referências
[1] VHDL & Verilog Compared & Contrasted – Plus Modeled Example Written in VHDL, Verilog and C. Douglas J. Smith. 1996. [2] Part 10: The 2016 Wilson Research Group Functional Verification Study. Disponível em: https://blogs.mentor.com/verificationhorizons/blog/2016/10/31/part-10-the-2016-wilson-research-group-functional-verification-study/














Verbosidade fazia diferença antes dos editores com macro. Hoje, acho um argumento completamente inválido e obsoleto.
Obrigado pelo comentário Tafas. Realmente Macros resolvem muitos problemas. Talvez se eu tivesse dado um tom de “você que está iniciando no mundo HDL e já entende bem C”, o leitor sentiria um pouco a verbosidade – falo por experiência própria. Mais uma vez obrigado pelas revisões e comentário.
Excelente artigo!
Eu prefiro a liberdade do Verilog…
Mas é como o Rodrigo concluiu: o importante é conhecer as duas linguagens.
Oi Rodrigo, Sem tentar adicionar combustível ao fogo, é uma discussão que abandonei há muitos anos. Nada produtivo sai disso. Um ponto acho interessante considerar, falando de ferramentas, as linguagens de descrição de hardware são apenas ferramentas, não deveria-se esquecer de considerar quem faz a seleção das ferramentas. Com muito poucas exceções não seria o usuário final da ferramenta quem seleciona. O usuário final geralmente tem nada a ver com isto. As ferramentas são impostas pela empresa; a empresa tem investido muito dinheiro em formação, ferramentas, horas engenheiro e outras; o impacto econômico faz quase impossível reconhecer que poderia estar… Leia mais »
Obrigado Walter pelo comentário. Faz uns meses, com ajuda do povo do Embarcados (Tafas e Eurípedes) comecei a rever meus conceitos sobre HDL. Acredito que agora estou pelo menos procurando saber onde ficam as chaves de fendas. Quando tiver com mais folga, vou começar a usá-las. Você foi pontual e acertivo, no meu caso em 2005 comecei com VHDL e tive muita dificuldade. Contudo em 2007 fui apresentado ao VERILOG e de lá para cá, em virtude das empresas e treinamentos, sempre calhou trabalhos com essa linguagem. Nos últimos meses tive que retomar o VHDL e percebi que tanto faz.… Leia mais »
Estive escrevendo sobre essa tematica ha alguns meses atrás.
Uma grande diferença entre VHDL e Verilog é que VHDL é uma linguagem de tipagem forte enquanto que Verilog é como C, de tipagem fraca. Dai se vc conecta por exemplo uma variavel de 5 bits de largura a uma de 32 bits o Verilog vai deixar passar enquanto que o VHDL não. Esse é um dos fatores que faz VHDL ser bem usado pelo pessoal que trabalha com sistemas criticos para o setor aeroespacial na Europa.
VHDL foi baseada no ADA. Por ser uma linguagem de tipagem forte em tese ela deixaria menos erros passarem e precisaria de msnos linting em comparação ao verilog que é de tipagem fraca.
Porém para a verificação funcional o Verilog tem um suporte bem mais forte que vem do SystemVerilog e da metodologia UVM. No ciclo de desenvolvimento do ASIC a verificação funcional é uma etapa extremamente critica. Para o VHDL ha alternativas recentes que podem fazer algo analogo ao UVM. Porém essas alternativas são bem menos maduras e tem muito pouca literatura cobrindo.
Obrigado pelo cometário Pedro. A discusão é ampla – tenho um conhecido nos EUA que me afirma que VERILOG é amplamente usada; e neste momento tenho um colega de doutorado ligado de alguma forma a ESA que afirma o que você menciona. A diferença entre os dois é que o primeiro está ligado a indústria voltada para ASIC e o segundo a indústria voltada para SISTEMAS. Aqui eu vejo que ambos falam a mesma lingua, mas um com sotaque Americano e outro com sotaque Britânico – mas falam Inglês. Obrigado mais uma vez pelo comentário.
Quanto aos EUA já ouvi dizer que VHDL seria mais usado na defesa e o Verilog seria mais usado no vale do Silicio.
Na Europa de uma representante de uma empresa que fornece softwares para o desenvolvimento ouvi que no lado do ASIC as empresas estão procurando a homogenização das linguagens para verificação e desenvolvimento e por isso estão usando mais o verilog e SystemVerilog enquanto que o VHDL é mais usado quando ha legacy que não da para fugir.
Tipagem forte costuma ser a característica que não permite um mesmo dado ser tratado como se fosse de outro tipo, isso e a linguagem C.