2015-04-30 18 views
6

Sono un po 'confuso se è legale, dal punto di vista degli standard, leggere un parametro da un'interfaccia.In SystemVerilog, è consentito leggere un parametro da un'interfaccia

Come così

interface foo_if #(parameter BAR=5)(); 
... 
logic [BAR-1:0] data; 
modport slave(input data, ...); 
endinterface 

module foobar(foo_if.slave s); 
... 
logic [s.BAR-1:0] bar; 
logic [$bits(s.data)-1:0] m_data; 
... 
endmodule 

Ho un problema in cui un importante fornitore di strumento di sintesi non è in grado di gestire anche questo. E ti dicono esplicitamente nel messaggio di aiuto che non è permesso usare $ bits() con un membro dell'interfaccia.

Tuttavia uno strumento di simulazione di un altro fornitore lo gestisce perfettamente come fa un altro strumento di sintesi che ho.

Tuttavia, in SystemVerilog per il Disegno da S. Sutherland et al. si afferma:

Perché la gerarchia di progettazione potrebbe non essere ancora completamente risolta durante elaborazione, è illegale per assegnare un parametro, specparam, o localparam costanti di un valore che è derivato da altrove nella gerarchia disegno

Tuttavia, se non sono autorizzato a utilizzare i parametri delle interfacce, compromette l'utilità delle interfacce.

Il SystemVerilog 1800-2012 standard sugli altri stati della mano:

25,10 L'accesso all'interfaccia oggetti

L'accesso agli oggetti dichiarati in un'interfaccia deve essere disponibile per riferimento nome gerarchico, a prescindere se l'interfaccia è accessibile anche tramite una connessione di porta o tramite un'interfaccia virtuale e indipendentemente dall'esistenza di qualsiasi modaporto dichiarato nell'interfaccia di . È possibile utilizzare un modport per limitare l'accesso agli oggetti dichiarati in un'interfaccia a cui viene fatto riferimento tramite una connessione di porta o un'interfaccia virtuale elencando esplicitamente gli oggetti accessibili in il modport. Tuttavia, gli oggetti che non sono consentiti per essere elencati in un modport devono rimanere accessibili.

+0

[Xilinx Vivado] (http://forums.xilinx.com/t5/Synthesis/accessing-systemverilog-interface-parameters/m-p/405317) non supporta l'accesso ai parametri e nemmeno Altera Quartus. Supportano la soluzione alternativa di '$ bits (interface.port)' Tuttavia, le interfacce sono ancora paralizzate dal fatto che i modports non sono supportati molto bene sugli strumenti FPGA. – Chiggs

risposta

2

Il problema qui non riguarda l'accesso, ma ciò che è consentito in luoghi che richiedono espressioni costanti. LRM is not very clear i riferimenti di porta di interfaccia non sono considerati riferimenti gerarchici. Ma lo strumento non si lamenta di s.BAR, si lamenta di s.data, che è una variabile, non un parametro. Normalmente, non è possibile utilizzare le variabili nelle espressioni costanti, ma la LRM 20.6.2 dice

La funzione $ bit può essere utilizzato come un tempo di elaborazione costante quando utilizzato sui tipi di dati di dimensioni fisse; quindi, può essere utilizzato nella dichiarazione di altri tipi di dati, variabili o reti.

Così $ bit (s.data) avrebbero dovuto essere trattati come un'espressione di parametro.

BTW, si dovrebbe usare l'ultimo freely available IEEE 1800-2012 LRM.

+0

In realtà né s.BAR né i $ bit() hanno funzionato. Quindi anche se $ bits() non funziona. Stai sostenendo che s.BAR avrebbe dovuto funzionare se ho compreso correttamente la tua risposta. – AxelOmega

+0

LRM menziona esplicitamente i riferimenti delle porte di interfaccia quando parla dell'importazione di un tipo (typedef) da un'istanza di interfaccia. Per lo stesso motivo, dovrebbero essere consentiti anche i parametri attraverso le porte di interfaccia. La maggior parte degli strumenti lo supporta già, ma non è esplicito nell'LRM. –

+0

@ dave_59 purtroppo pochissimi (nessuno?) Strumenti FPGA supportano l'accesso ai parametri dell'interfaccia. Le persone ASIC hanno tutto il divertimento;) – Chiggs