Domanda

Vorrei scrivere un'interfaccia VPI/PLI che aprirà i file audio (cioè WAV, AIFF, ecc.) E presentare i dati al simulatore Verilog. Al momento sto usando Icarus e desidero utilizzare libsndfile per gestire i formati di file di input e la conversione del tipo di dati.

Non sono del tutto sicuro di cosa usare nel codice C ... ho guardato IEEE 1364-2001 e ancora confuso quali funzioni dovrei usare.

Idealmente vorrei avere un modulo Verilog con porta dati (seriale o parallelo), input dell'orologio e pin di avvio/arresto. Vorrei implementare due moduli, uno per la riproduzione da un file e un altro registrerebbe l'output da un filtro sotto test.

Posso fare tutto in c e basta istanziare il modulo nel mio testbench o dovrò scrivere una funzione (diciamo $read_audio_data) e modulo wrapper per chiamarlo su ogni impulso di clock ??

Hm o potrei essere devo creare il modulo e quindi ottenere un manico per esso e passare il valore/velare sulla maniglia in qualche modo?

Non sono del tutto preoccupato di come verranno impostati i nomi dei file, poiché probabilmente non lo farei comunque dal codice Verilog. E probabilmente mi atterrò a campioni interi a 24 bit per il momento elibsndfile dovrebbe gestire la conversione abbastanza bene. Forse per ora mi attengo al seriale (potrebbe anche essere in modo simile a I2S) e de-serializzarlo in Verilog, se necessario.

Inoltre ho guardato Icaro collegare Il che implementa una videocamera che legge i file PNG, sebbene ci siano molti più aspetti nell'elaborazione delle immagini, quindi c'è in audio. Quindi quel codice mi sembra un po 'eccessivo al momento - né sono riuscito a farlo funzionare.

È stato utile?

Soluzione

Suggerisco di avvicinarmi in questo modo:

  1. Scopri l'interfaccia C/Verilog
  2. Implementa l'accesso al file audio pensando a quell'interfaccia, ma non preoccuparti di VPI
  3. Implementa la colla C/Verilog usando VPI

L'interfaccia può probabilmente essere piuttosto semplice. Una funzione per aprire il file audio e specificare tutti i parametri necessari (dimensione del campione, endian grande/piccolo, ecc ...) e un'altra funzione restituisce il campione successivo. Se è necessario supportare la lettura da più file nella stessa simulazione, dovrai passare un tipo di handle alle funzioni PLI per identificare da quale file stai leggendo.

L'utilizzo di Verilog potrebbe essere semplice come:

initial $OpenAudioFile ("filename");

always @(posedge clk)
    audio_data <= $ReadSample;

Il campione Image-VPI sembra un esempio ragionevole da cui iniziare. Gli idiomi di base da utilizzare nel codice C sono:

Accesso agli argomenti

// Get a handle to the system task/function call that invoked your PLI routine
vpiHandle tf_obj = vpi_handle (vpiSysTfCall, NULL)

// Get an iterator for the arguments to your PLI routine
vpiHandle arg_iter = vpi_iterate (vpiArgument, tf_obj)

// Iterate through the arguments
vpiHandle arg_obj;
arg_obj = vpi_scan (arg_iter);
// do something with the first argument
arg_obj = vpi_scan (arg_iter);
// do something with the second argument

Recupero dei valori da Verilog

s_vpi_value v;
v.format = vpiIntVal;
vpi_get_value (handle, &v);
// value is in v.value.integer

Scrivere valori a Verilog

s_vpi_value v;
v.format = vpiIntVal;
v.value.integer = 0x1234;
vpi_put_value (handle, &v, NULL, vpiNoDelay);

Per leggere o scrivere valori più grandi di 32 bit, dovrai utilizzare vpiVectorVal invece di vpiIntVal, e de/codifica una struttura s_vpi_vector.

Altri suggerimenti

Ho trascorso alcuni giorni ora implementando il Testbench PLI, se qualcuno lo legge e potrebbe trovarlo utile - ecco il mio codice sorgente. C'è un file readme e di seguito è lo screenshot di alcuni risultati di base;)

Uso git clone git://github.com/errordeveloper/sftb Per ottenere il Repo di codice o scaricarlo da GitHub.com.

Screenshow of a little fragment from Velvet Underground's Sunday Morning in gtkwave

Ne ho anche scritto Il mio nuovo blog, quindi spero che se qualcuno cerca questo genere di cose lo troveranno. Non sono riuscito a trovare niente di simile, quindi ho iniziato questo progetto!

Sembra una buona scelta per CocotB Un progetto open source che estrae VPI per fornire un'interfaccia pitonica al tuo DUT. Non dovresti scrivere ulteriori Verilog Testbench o Wrapper RTL o chiamare compiti VPI o funzioni da Verilog in quanto i banchi di prova sono puro Python.

Il tuo testbench come descritto sembrerebbe qualcosa del genere:

import cocotb
from cocotb.clock import Clock
from cocotb.triggers import RisingEdge

# Whatever audio-file IO library you happen to like best...
from scikits.audiolab import wavread

@cocotb.test()
def stream_file(dut, fname="testfile.wav")    

    # Start a clock generator
    cocotb.fork(Clock(dut.clk, 5000))

    data, sample_frequency, encoding = wavread(fname)
    result = []        

    while data:
        yield RisingEdge(dut.clk)

        dut.data_in <= data.pop(0)
        result.append(dut.data_out.value.integer)

    # Write result to output file

Disclaimer: Sono uno dei CocotB sviluppatori e quindi potenzialmente distorti, tuttavia sfiderei anche a chiunque a produrre funzionalità simili al Testbench di cui sopra e con meno righe di codice (mantenibile).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top