Migrando para VHDL2008

VHDL2008

VHDL2008 ainda é novidade

 

O VHDL2008 já está faz 9 anos à disposição de todos os desenvolvedores de HDL. Porém, ainda é pouco utilizada nos projetos.

 

A principal razão para isso é:

 

  • Lenta adoção dos Fabricantes (exemplo)
  • VHDL2002

 

De 93 a 2002, o VHDL ficou em um vai e vem, com promessas de versões intermediárias e  promessas de suporte a novas tecnologias. Em paralelo, o VERILOG, com o SYSTEM VERILOG, avançou muito e abraçou a filosofia ESL, Eletrctronic System Level. Trocando em miúdos, ESL basicamente consiste em gerar blocos de hardware base a partir de uma biblioteca, via software. Para quem usa a ferramenta QSYS da Intel, basta verificar os blocos de System Verilog gerados automaticamente.

 

VHDL 2002 não tinha nada disso.

 

Quando o VHDL2002 veio, ele trouxe pouca ou nenhuma mudança consistente para a linguagem. Basicamente, ele só decretou como não padrão as bibliotecas STD_LOGIC_ARITH, STD_LOGIC_UNSIGNED e STD_LOGIC_SIGNED. No lugar destas, o VHDL2002 apresentou a NUMERIC_STD, que fazia com que uma parte muito grande dos códigos até então escritos estivessem errados, sem adicionar nada consistente em troca. Sem motivo, todos permaneceram com o VHDL93. (Leia mais neste forum da Altera/Intel, ou leia uma opinião no Embarcados a respeito).

 

Com o Verilog funcionando bem e os projetos ainda acontecendo com o VHDL93 usando bibliotecas não padrão (eu mesmo julgava ser bobagem abandonar a STD_LOGIC_ARITH), os fabricantes não investiram na linguagem e quando o VHDL2008 veio, a inércia já era muito grande. Os fabricantes demoraram a adotar VHDL2008 em parte por culpa do próprio VHDL.

 

E foi assim até 2015, mais ou menos.

 

 

Migrar para  VHDL2008

 

Eis que surge o VHDL2008. Ele trouxe inovações *reais* ao VHDL. De todas as mudanças, eu entendo que a melhor foi colocar os generates em esteróides. Não foi apenas uma mudança para enquadrar bibliotecas ou que agradasse os puristas da linguagem: agrada quem a utiliza também.

 

Com um pacote bastante grande de alterações, melhorias e mudanças, o VHDL2008 realmente incentiva os desenvolvedores a migrar e a modificar seu estilo de codificação. Com o aumento da adoção, deve aumentar a pressão aos fabricantes em adotar todas as novas bibliotecas e todas as novas construções da linguagem.

 

Foram feitas mudanças significativas na linguagem que demandam um pouco de boa vontade e esforço para se acostumar. Para que a peregrinação não vire um martírio, seguem algumas sugestões para facilitar a vida de quem está fazendo a migração, sem gerar correria e mantendo o foco em novos projetos.

 

 

Mudando as Bibliotecas

 

Para aproveitar todo seu poder, é preciso abandonar as famosas STD_LOGIC_ARITH. O problema disso é que esta é, disparado, a coisa mais chata para se fazer. Praticamente todos os contadores, da maioria dos blocos legados, são feitos com STD_LOGIC_VECTOR.

 

O caminho mais fácil para uma migração para o VHDL2008 é migrar as bibliotecas:

 

  • STD_LOGIC_ARITH → NUMERIC_STD
  • STD_LOGIC_UNSIGNEDNUMERIC_STD_UNSIGNED
  • STD_LOGIC_SIGNEDNUMERIC_STD_SIGNED

 

Basta mudar o cabeçalho do código para:

 

 

Só tem um problema... A não ser que o desenvolvedor obtenha em algum lugar estas duas bibliotecas, ele não vai poder usá-las. Alguns fabricantes de FPGA ainda não suportam bibliotecas além da NUMERIC_STD.

 

Então, se o caminho mais fácil não está disponível, existem outros para fazer o trabalho menos dolorido.

 

Criar as Próprias Funções

Que NUMERIC_STD não define operações para STD_LOGIC_VECTOR e isso é um problema, já é sabido. Porém, se a Synopsis fez a própria biblioteca, porque não, por conta própria, definir tais bibliotecas?

 

As principais funções a serem criadas são:

 

  • CONV_STD_LOGIC_VECTOR
  • CONV_TO_INTEGER
  • Operadores ("+", "-", "*", "/")

 

Com relação aos operadores, pode ser interessante não mexer e apenas usar um recurso, as variables, como será proposto a seguir.

 

Sobrepor Funções (Function Overload)

 

VHDL ainda aceita um conceito chamado function overload. Basicamente, isso quer dizer que é possível utilizar funções com o mesmo nome, sendo a escolha entre qual função será usada é feita pelos tipos de dado de entrada.

Este foi o grande problema apontado pelo IEEE: se a entrada é STD_LOGIC_VECTOR, seria este vetor SIGNED ou UNSIGNED? Dependeria do sintetizador, não do código VHDL. Para a Synopsys, dependeria da biblioteca usada e eles fizeram ótimas bibliotecas.

Na minha experiência, exceto quando o desenvolvedor sabe que está usando SIGNED, situação normalmente ligada a algum tipo de processamento de sinais, todo STD_LOGIC_VECTOR é usado para contador, endereçamento e etc, ou seja, UNSIGNED.

Então, outra abordagem seria definir operações UNSIGNED para STD_LOGIC_VECTOR que sobreponha as operações da NUMERIC_STD:

  • TO_INTEGER(STD_LOGIC_VECTOR)
  • STD_LOGIC_VECTOR(INTEGER, <tamanho do vetor>)
  • Operadores ("+", "-", "*", "/")

 

PORT MAP

 

Vejo muita gente sugerindo para imediatamente passar a usar novos formatos no PORT MAP. Já vi também sugestões para usar INTEGER, por exemplo.

 

Não acho muito razoável: muitos IPs disponíveis tem suas entradas e saídas em STD_LOGIC_VECTOR. Tal formato forçaria conversões de tipo em etapas intermediárias e na conexão entre componentes. Além de dificultar o acompanhamento, a perda de compatibilidade significa a perda de produtividade (refactoring de código).

 

Neste caso, recomendo manter as portas de entrada e saída como STD_LOGIC_VECTOR. Assim, não é preciso se preocupar com o que acontece dentro de uma entidade antiga, escrita em VHDL93: em VHDL, o conceito de biblioteca só vale para a interpretação de um arquivo e somente dele. Mesmo um bloco filho pode ter bibliotecas diferentes do bloco pai.

 

 

GENERATES

 

A mais impactante mudança que o VHDL trouxe foram os generates. Além do IF <condição> GENERATE, existem o ELSE GENERATE, o ELSIF <condição> GENERATE e o CASE GENERATE.

 

Estas construções, por exemplo, tornam mais robustas e mais próprias para contornar erros na descrição ao tornar explícitas alternativas de implementação e evitar o excesso e necessidade de vários blocos de IF GENERATE mutuamente exclusivos.

 

Apesar disso, não é necessário correr atrás de modificar os blocos que já estão funcionando.

 

 

Variables para converter tipos

 

Variables são construções bastante complexas em HDL. Diferente de um sinal, variáveis alteram seu valor no momento da atribuição, enquanto um sinal só muda seu valor ao final da analise sequencial do processo.

 

Isso faz com que muita gente erre feio a temporização de variáveis que venham a implementar Flip-Flops. Além disso, é difícil rastrear uma variável em simulação.
Contudo, estes dois comportamentos tornam as variáveis como as melhores ferramentas para conversão de tipos, algo que é feito em VHDL e que raramente é observada em simulação. E são essas conversões que auxiliarão na migração para VHDL2008.

 

Um contador em VHDL93 convencional:

 

 

Em VHDL2008 não é possível fazer operações com STD_LOGIC_VECTOR apenas com NUMERIC_STD. Para não precisar mudar o projeto inteiro, pode-se aplicar conversões locais de tipo com variáveis. Por exemplo:

 

 

Pode-se aplicar a mesma ideia para uma ROM:

 

 

 

Lista de sensibilidades

 

Processos usados para descrever lógica combinacional não difere muito de fazer lógica fora do processo com uso de uma função, por exemplo. Porém, a maior vantagem de usar processos com lista de sensibilidade é reduzir o peso da simulação: o simulador só avalia o processo quando detectar alguma modificação nos sinais contidos em tal lista.

 

Esquecer um sinal é perigoso: a simulação pode (e normalmente vai) apresentar resultado diferente da implementação em hardware do sistema.

 

Em VHDL2008, para resolver este problema, existe o PROCESS(ALL). Assim, a lista de sensibilidade se torna desnecessária.

 

Um aviso, entretanto: isso pode vir a carregar a simulação, uma vez que o simulador irá avaliar o estado do processo para qualquer mudança de sinal e otimizações dependerão da implementação do simulador.

 

Também sempre vale lembrar: lógica combinacional mal descrita em um processo pode resultar em latches involuntários.

 

Mudar é preciso

 

Sempre que um desenvolvedor estiver refazendo código, ele está fazendo mais do mesmo. Não está nem inovando, nem inventando: está, neste caso, adequando. As dicas apresentadas não tem objetivo de propor a migração como fim, mas como algo a ser feito enquanto os projetos estão em andamento, sem perder compatibilidade e sem transtorno.

 

O VHDL é muito poderoso para ser esquecido e ao contrário do seu irmão de 2002, trouxe muito mais coisa legal do que foi apresentado neste artigo. Aqui, apenas apresentei o que de mais urgente precisa começar a ser feito para empregar VHDL2008.

 

Migrar para VHDL2008 não precisa ser dolorido ou radical: dá para fazer isso enquanto se aproveita todo o histórico e todas as bibliotecas desenvolvidas com HDL, afinal, a ideia é adotar a nova linguagem para ganhar em produtividade e não para ficar fazendo refactoring de tudo que está pronto e funcionando.

 

E você? Já usou VHDL2008? Tem causos para contar? Deixe um comentário!

Ricardo Fialho Tafas Junior nasceu em Porto Alegre, em 4 de abril de 1981. É graduado em Engenharia Elétrica com foco em Sistemas Digitais e Eletrônica pela Universidade Federal do Rio Grande do Sul desde 2003. Desde o início de sua vida profissional, sempre trabalhou no desenvolvimento de Sistemas Embarcados com Lógica Programável (FPGA) ou na coordenação de equipes de desenvolvimento e aplicações. Ricardo escreve sobre carreira no rftafas.blog.br

Deixe um comentário

Seja o Primeiro a Comentar!

Notificar
avatar
 
wpDiscuz