Hoje, existem duas das linguagens de descrição de hardware mais comuns: Verilog / SystemVerilog e VHDL. As próprias linguagens de descrição de hardware são meios bastante universais, mas esse é sempre o caso? E do que “não universalidade” da linguagem de descrição de hardware depende?
A idéia de escrever este artigo surgiu durante a síntese de um projeto em diferentes ambientes de desenvolvimento, como resultado dos quais diferentes resultados foram obtidos. Como o módulo de origem é bastante volumoso, um módulo de teste de um volume menor foi escrito para demonstrar os resultados, mas cuja síntese causou os mesmos avisos / erros. Um registro de 4 bits com redefinição assíncrona foi usado como módulo de teste e o Libero SoC 18.1, Quartus Prime 17.1, Vivado 2017.4.1 foi escolhido como ambiente de desenvolvimento.
Primeiro, é apresentada uma variante da descrição desse módulo na linguagem Verilog, cujo texto é percebido corretamente pelos ambientes de desenvolvimento selecionados:
module test1 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= 4'h0 ; end else begin q <= data ; end end endmodule
Como resultado da síntese deste módulo, foram obtidos os seguintes esquemas:
- Libero SoC v11.8
- Quartus Prime 17.1
- Vivado 2017.4.1
Em todos os circuitos sintetizados para o teste1, os gatilhos D foram utilizados com uma entrada de reset inversa (Quartus Prime) ou com a adição de um inversor (VERIFIC_INV no caso do Libero SoC e LUT1 no caso do Vivado).
O circuito sintetizado será diferente se a verificação de status da redefinição assíncrona for alterada? Para fazer isso, altere o texto do módulo test1 para a descrição do módulo test2:
module test2 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=data; end else begin q<=4'h0; end end endmodule
Pode-se supor que a síntese do módulo test2 não deva diferir da síntese do módulo test1, uma vez que a lógica da descrição de ambos os módulos não se contradizem. No entanto, a síntese do módulo test2 levou aos seguintes resultados:
- Libero SoC v11.8
O circuito foi sintetizado, mas a seguinte mensagem de aviso “Incompatibilidade de borda e condição (CG136)” apareceu nas mensagens. Este aviso indica uma incompatibilidade da lista de sensibilidade e verificação da condição de redefinição. No entanto, o circuito sintetizado não é diferente do módulo test1.
- Quartus Prime 17.1
A síntese do circuito falhou com o erro:
"Erro (10200): Erro da instrução condicional HDL da Verilog em test2.v (10): não pode corresponder operando (s) na condição às bordas correspondentes no controle de evento que encerra a construção always." O texto do erro é semelhante ao aviso emitido pelo Libero SoC. - Vivado 2017.4.1
A síntese do circuito foi realizada com o aviso:
"[Synth 8-5788] O registro q_reg no teste do módulo está definido e redefinido com a mesma prioridade. Isso pode causar incompatibilidades na simulação. Considere reescrever o código ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test2.v":10]." Semelhante ao Libero SoC e Quartus Prime, um aviso semelhante foi emitido. Além disso, o aviso dizia sobre a possível discrepância entre os resultados da modelagem e o trabalho no hardware, pelo que foi proposto reescrever o código do módulo.
Depois de descrever os módulos test1 e test2, surgiu a idéia de verificar o que aconteceria se sintetizássemos o seguinte código:
module test3 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=4'h0; end else begin q<=data; end end endmodule
A descrição desse registro não é lógica, pois a redefinição de gatilhos nesse caso ocorre quando a linha de redefinição está inativa.
Os resultados da síntese foram os seguintes:
- Libero SoC v11.8
A síntese do circuito não foi realizada com o erro: “A lógica para q [3: 0] não corresponde a um flip-flop padrão (CL123)”, recusando-se a sintetizar o circuito, citando a ausência do tipo de gatilhos necessários para a síntese. - Quartus Prime 17.1
O circuito não foi sintetizado com o seguinte erro: "Erro (10200): Erro da instrução condicional HDL da Verilog em test3.v (9): não é possível corresponder operando (s) na condição às bordas correspondentes no controle de evento anexo da construção sempre" . O texto desse erro não difere do texto de erro do módulo test2. - Vivado 2017.4.1
O esquema foi sintetizado sem erros:
No entanto, o que acontecerá se descrevermos um módulo no qual a lista de sensibilidade não contradiga a verificação da condição de redefinição, mas os gatilhos serão redefinidos quando a linha de redefinição estiver inativa, como no caso da descrição do módulo test3. A descrição desse módulo test4 é a seguinte:
module test4 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= data ; end else begin q <= 4'h0 ; end end endmodule
Durante a síntese, foram obtidos os seguintes resultados:
- Libero SoC v11.8
A síntese do circuito foi realizada com o aviso:
“Sinal encontrado identificado como relógio do sistema que controla 4 elementos seqüenciais, incluindo q_1 [3]. O uso desse relógio, que não possui restrição de tempo especificada, pode afetar negativamente o desempenho do design. (MT532). "
- Quartus Prime 17.1
Como resultado da síntese do circuito, foram recebidos avisos:
«Warning (13004): Presettable and clearable registers converted to equivalent circuits with latches. Registers power-up to an undefined state, and DEVCLRn places the registers in an undefined state.
Warning (13310): Register "q[0]~reg0" is converted into an equivalent circuit using register "q[0]~reg0_emulated" and latch "q[0]~1"
Warning (13310): Register "q[1]~reg0" is converted into an equivalent circuit using register "q[1]~reg0_emulated" and latch "q[1]~1"
Warning (13310): Register "q[2]~reg0" is converted into an equivalent circuit using register "q[2]~reg0_emulated" and latch "q[2]~1"
Warning (13310): Register "q[3]~reg0" is converted into an equivalent circuit using register "q[3]~reg0_emulated" and latch "q[3]~1"»
Todos os avisos descritos acima correspondem ao fato de que foram usadas travas em vez de gatilhos.
- Vivado 2017.4.1
O circuito foi sintetizado com um aviso:
"[Synth 8-5788] O registro q_reg no teste do módulo está definido e redefinido com a mesma prioridade. Isso pode causar incompatibilidades na simulação. Considere reescrever o código ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test.v":11]." O texto desse erro repete o texto do erro para o módulo test2.
De todas as experiências descritas, podem ser tiradas as seguintes conclusões:
- A linguagem Verilog é uma linguagem universal de descrição de hardware, cujas limitações são as capacidades dos próprios ambientes de desenvolvimento;
- para a descrição correta do equipamento, é necessário conhecer a sintaxe do idioma, além de analisar as listas de avisos e erros que ocorrem em cada etapa da construção do projeto.