Síntese estranha ao trabalhar com FPGA

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:

  1. Libero SoC v11.8

    test1 Libero SoC

  2. Quartus Prime 17.1

    test1 quartus prime

  3. Vivado 2017.4.1

    test1 vivado


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:

  1. 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.

    test2 Libero SoC

  2. 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.
  3. 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.

    test2 vivado


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:

  1. 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.
  2. 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.
  3. Vivado 2017.4.1

    O esquema foi sintetizado sem erros:

    test3 vivado


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:

  1. 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). "

    test4 Libero SoC

  2. 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.

    test4 quartus prime

  3. 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.

    test4 vivado


De todas as experiências descritas, podem ser tiradas as seguintes conclusões:

  1. A linguagem Verilog é uma linguagem universal de descrição de hardware, cujas limitações são as capacidades dos próprios ambientes de desenvolvimento;
  2. 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.

Source: https://habr.com/ru/post/pt413007/


All Articles