C'è un modo per innescare condizionalmente un errore di compilazione in verilog?


9

Ho un modulo con parametri in verilog, in cui i parametri sono una frequenza di clock e una frequenza di aggiornamento, che viene utilizzato per calcolare quanti cicli di inattività sono inseriti tra istanze di un'operazione ripetuta. Tuttavia, è molto facile impostare parametri che non possono essere raggiunti (poiché l'operazione richiede un periodo di tempo non banale, quindi la ripetizione dovrebbe avvenire prima del completamento), e al momento il progetto non fornisce alcun feedback su questo.

Mi chiedevo se ci fosse un modo per innescare un errore durante la sintesi (o la compilazione prima della simulazione) se le condizioni non potevano essere soddisfatte (cioè se un localparam è inferiore a un altro)? Qualche equivalente del popolare hack di compilazione C / C ++, forse.

Risposte:


10

Sono sicuro che esiste un modo per associare un callback del tempo di compilazione C / C ++. Tuttavia, fintanto che i generateblocchi di supporto (introdotti in IEEE Std 1364-2001), è possibile eseguire le operazioni seguenti:

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

Se la condizione è vera, il compilatore genererà un errore perché esiste una richiesta per qualcosa che non esiste. Se la condizione è falsa, l'operazione viene ignorata. L'unico requisito è che il codice per la condizione illegale segua la sintassi legale di Verilog e la condizione illegale non diventerà mai accidentalmente valida (da cui il nome del modulo lungo e dettagliato non esistente).

Se il tuo simulatore e strumenti di sintesi supportano IEEE Std 1800-2009 (revisione SystemVerilog rilasciata nel 2009) o revisione più recente, puoi utilizzare $error()e fornire un messaggio più significativo per correggere l'errore. Non sono sicuro che qualche venditore abbia ancora implementato questa funzione. Dovrebbe diventare il metodo preferito una volta implementata la maggior parte dei distributori, quindi fornirò un esempio:

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

1

Potresti fare qualcosa del genere:

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

Gli strumenti possono trattare questo in modo leggermente diverso, ma se VALUEnon rientra nell'intervallo previsto, dovrebbe davvero essere un errore poiché l'indice di bit per l'istruzione assegnato sarà fuori dai limiti di range_for_value.


1

È davvero vero che non c'è niente come "asserire" in Verilog? Questa è roba piuttosto semplice!

Se i tuoi strumenti supportano un linguaggio misto, potresti aggiungere un modulo che è solo un'entità VHDL con le porte o i generici necessari e l'ovvia dichiarazione ASSERT. Per condizioni determinabili in termini di compilazione o elaborazione, questo funzionerà ugualmente bene in sim o sintesi (almeno con XST o 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;

Nessuna delle risposte finora è davvero soddisfacente, tranne forse l'errore $ "System Verilog 2009" () ma questo è probabilmente il più semplice nella più ampia gamma di strumenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.