2013-01-21 13 views
5

Esiste un modo sintetizzabile per passare un'interfaccia a una funzione o un'attività? Il mio caso d'uso è il seguente: Ho un pacchetto con diverse funzioni (anche se potrei convertirle in attività, se questo aiuta :)), tutte cose che potrebbero essere usate in un modulo e potrebbe aver bisogno di accedere alle porte del modulo. Ora, di solito raggrupperei tutte le porte in un interface, aggiungerlo al modulo e passarlo come virtual alla funzione. Tuttavia, il manuale del mio strumento di sintesi indica che virtual non è supportato.SystemVerilog: passaggio di interfacce a funzioni/attività (per sintesi!)

Mi manca qualcosa? Ci deve essere un modo per fornire le porte alle attività per la sintesi, in modo simile agli argomenti signal di VHDL?

Alcuni codici di esempio:

module mymod (
    input logic clk, 
    input logic rst, 
    input uint16_t adr, 
    input bit cyc, 
    input uint32_t dat_m, 
    input bit stb, 
    input bit we, 
    output bit ack, 
    output uint32_t dat_s 
    ); 

    always_comb begin 
     mypack::do_something(a, b, c, adr, cyc, dat_m, stb, we, ack, dat_s); 
endmodule 

Idealmente, il compito mypack::do_something sarebbe in grado di utilizzare le porte come porte, cioè attendere per modifiche su di loro, scrivere i valori ad essi, ecc; fondamentalmente, lo stesso si otterrebbe in VHDL passandoli come argomenti signal (a differenza degli argomenti variable o constant).

+0

Puoi pubblicare un po 'di codice? –

risposta

2

Normalmente si dichiarano funzioni specifiche dell'interfaccia nella definizione dell'interfaccia stessa. In questo modo, qualsiasi dichiarazione di attività o funzione ha già le porte di interfaccia in ambito.

+0

Grazie per l'idea. Tuttavia, nel mio caso la funzione implementa un comportamento specifico del modulo che capita di utilizzare alcune delle porte del modulo. Questa indiretta piuttosto strana è dovuta al fatto che il codice viene generato automaticamente e utilizza funzioni/pacchetti per ragioni al di fuori di questa domanda;). – rainer

2

Sfortunatamente sembra che un'interfaccia deve essere virtuale per essere passata attraverso un elenco di porte di funzioni o attività.

Il SystemVerilog IEEE Std 1800-2009 afferma che una porta di funzioni deve essere un tipo di dati. Vedere la Sezione 13.4, Allegato A.2.6 e Sintassi 13-2 per la sintassi della dichiarazione di una funzione. E vedi A.2.2.1 per definire un data_type. Ho anche controllato l'IEEE Std 1800-2005 e sembra che abbia la stessa restrizione, solo che non è stato scritto chiaramente. Vedere la sezione 12.3 e l'allegato A del 1800-2005.

Se si desidera utilizzare un'interfaccia, provare a utilizzare una funzione di traduzione nell'interfaccia di fare una struct (può richiedere packed, vedi IEEE Std 1800-2009 Sezione 13.4, nota # 12):

interface myif (/* ... */); 
/* signal list */ 
function mypack::var_list_s toStruct(); 
    /* make translation */ 
endfunction : toStruct 
endinterface : myif 

module mymod(myif my_if); 
always_comb 
    mypack::do_something(my_if.toStruct(), my_if.ack, my_if.dat_s); 
endmodule : mymod 

In alternativa puoi sempre fare il classico `include "myports" dove mai necessario il metodo.