Pregunta

Me gustaría escribir una interfaz VPI/PLI que abrirá archivos de audio (es decir, WAV, AIFF, etc.) y presentará los datos al simulador Verilog. Estoy usando ICARUS en este momento y deseo usar libsndfile para manejar los formatos de archivo de entrada y la conversión de tipo de datos.

No estoy muy seguro de qué usar en el código C ... he visto IEEE 1364-2001 y todavía confundido qué funciones se supone que debo usar.

Idealmente, me gustaría tener un módulo Verilog con puerto de datos (en serie o paralelo), entrada del reloj y pin de inicio/parada. Me gustaría implementar dos módulos, uno para reproducción desde un archivo, y otro grabaría la salida de un filtro en prueba.

¿Puedo hacerlo todo en c y solo instanciar el módulo en mi banco de pruebas o tendré que escribir una función (digamos? $read_audio_data) y el módulo de envoltura para llamarlo en cada pulso de reloj?

HM, o puede ser que necesito crear el módulo y luego obtener un mango para él y pasar el valor/vecto al mango de alguna manera.

No estoy muy preocupado por cómo se establecerán los nombres de archivos, ya que probablemente no lo haría desde el código Verilog de todos modos. Y probablemente me quedaré con muestras enteras de 24 bits por el momento ylibsndfile Se supone que debe manejar la conversión bastante bien. Tal vez, me quedaré con la serie por ahora (incluso puede hacerlo de manera similar a I2) y des-serializaré en Verilog si es necesario.

También he mirado a Icarus enchufar que implementa una cámara de video que lee archivos PNG, aunque hay muchos más aspectos para el procesamiento de imágenes que el audio. Por lo tanto, ese código me parece un poco exagerado en este momento, ni logré que se ejecute.

¿Fue útil?

Solución

Sugiero acercarme así:

  1. Calcule su interfaz C/Verilog
  2. Implemente el acceso al archivo de audio con esa interfaz en mente, pero no se preocupe por VPI
  3. Implementar el pegamento C/Verilog usando VPI

La interfaz probablemente puede ser bastante simple. Una función para abrir el archivo de audio y especificar los parámetros necesarios (tamaño de muestra, Big/Little Endian, etc.), y otra función devuelve la siguiente muestra. Si necesita admitir la lectura de varios archivos en la misma simulación, deberá pasar una especie de mango a las funciones PLI para identificar de qué archivo está leyendo.

El uso de Verilog podría ser tan simple como:

initial $OpenAudioFile ("filename");

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

La muestra de imagen vpi parece un ejemplo razonable para comenzar. Los modismos básicos para usar en el código C son:

Acceso a argumentos

// 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

Recuperar valores de verilog

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

Escribir valores a Verilog

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

Para leer o escribir valores de más de 32 bits, deberá usar vpiVectorVal en vez de vpiIntVal, y DE/Codificar una estructura S_VPI_Vector.

Otros consejos

He pasado unos días implementando el PLI TestBench, si alguien lee esto y puede encontrarlo útil, aquí está mi código fuente. Hay un archivo ReadMe y a continuación se encuentra la captura de pantalla de algunos resultados básicos;)

Usar git clone git://github.com/errordeveloper/sftb Para obtener el repositorio del código o descargarlo desde el github.com.

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

También he escrito sobre esto en Mi nuevo blog, con suerte, si alguien busca este tipo de cosas, lo encontrarán. No pude encontrar nada similar, ¡así que comencé este proyecto!

Esto suena como un buen ajuste para Cocotb Un proyecto de código abierto que abstrae a VPI para proporcionar una interfaz pitónica a su DUT. No tendría que escribir ningún VERILOG TestBench o Wrapper RTL o llamar a las tareas o funciones VPI de Verilog ya que los bancos de prueba son puros Python.

Su TestBench como se describe se vería algo así:

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

Descargo de responsabilidad: Soy uno de los Cocotb desarrolladores y, por lo tanto, potencialmente sesgados, sin embargo, también desafiaría a cualquiera a producir una funcionalidad similar a la TestBench anterior tan rápido y con menos líneas de código (mantenible).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top