Existe uma maneira de acionar condicionalmente um erro em tempo de compilação no verilog?

9

Eu tenho um módulo parametrizado no verilog, onde os parâmetros são uma taxa de clock e uma taxa de atualização, que são usados ​​para calcular quantos ciclos de inatividade são inseridos entre instâncias de uma operação repetida. No entanto, é muito fácil definir parâmetros que não podem ser atingidos (porque a operação leva um período não trivial, portanto a repetição deve ocorrer antes de ser concluída) e, no momento, o design não fornece feedback. nisto.

Fiquei me perguntando se havia alguma maneira de desencadear um erro durante a síntese (ou compilação antes da simulação) se as condições não puderem ser atendidas (ou seja, se um localparam for menor que o outro)? Talvez um equivalente do popular C / C ++ hack de confirmação de tempo de compilação.

Jules
fonte

Respostas:

10

Tenho certeza de que existe uma maneira de vincular um retorno de chamada em tempo de compilação C / C ++. No entanto, desde que os generateblocos de suporte (introduzidos no IEEE Std 1364-2001), você possa fazer algo como o seguinte:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module();
end
endgenerate

Se a condição for verdadeira, o compilador emitirá um erro porque há uma solicitação para algo que não existe. Se a condição for falsa, a operação será ignorada. O único requisito é que o código para a condição ilegal siga a sintaxe legal do Verilog e a condição ilegal nunca se torne acidentalmente válida (daí o nome longo e detalhado do módulo inexistente).

Se suas ferramentas de simulador e síntese suportam IEEE Std 1800-2009 (revisão do SystemVerilog lançada em 2009) ou revisão mais recente, você pode usar $error()e fornecer uma mensagem mais significativa para acompanhar o erro. Não tenho certeza se algum fornecedor já implementou esse recurso. Ele deve se tornar o método preferido assim que a maioria dos fornecedores for implementada, portanto, darei um exemplo:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    $error("%m ** Illegal Condition ** CONDITION(%d) > MAX_ALLOWED(%d)", CONDITION, MAX_ALLOWED);
end
endgenerate
Greg
fonte
1

Você poderia fazer algo assim:

module test();

  parameter VALUE=16;

  // VALUE should be between 16 and 64
  wire [64:16] range_for_value;
  assign range_for_value[VALUE] = 1'b0;

endmodule

As ferramentas podem tratar isso de maneira um pouco diferente, mas se VALUEnão estiver dentro do intervalo esperado, realmente deve haver um erro, pois o índice de bits da instrução de atribuição estará fora dos limites range_for_value.

dwikle
fonte
1

É realmente verdade que não há nada como "afirmar" em Verilog? Isso é coisa bem básica!

Se suas ferramentas suportam linguagem mista, você pode adicionar um módulo que é apenas uma entidade VHDL com as portas ou genéricos necessários e a instrução ASSERT óbvia. Para condições determináveis ​​de tempo de compilação ou elaboração, isso funcionará igualmente bem em simulação ou síntese (pelo menos com XST ou Synplicity).

entity CheckSize is
   generic (depth : natural := 16);
   port (data : std_logic_vector);
end CheckSize;

architecture empty of CheckSize is
begin
   Assert depth * data'length <= 256 Report "Size too large!" 
      severity Failure;
end empty;

Nenhuma das respostas até o momento é realmente satisfatória, exceto, talvez, a $ error () do "System Verilog 2009" $ (), mas essa é provavelmente a mais fácil de todas as ferramentas.

Brian Drummond
fonte