2011-06-16 24 views
5

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 utilizando Icarus en este momento y deseo usar libsndfile para manejar formatos de archivos de entrada y conversión de tipo de datos.Módulo Verilog VPI simple para abrir archivos de audio

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

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

¿Puedo hacerlo todo en C y solo una instancia del módulo en mi banco de pruebas o voy a tener que escribir una función (por ejemplo $read_audio_data) y el módulo de envoltura para llamarlo en cada pulso de reloj ??

Hm, o puede ser que necesite crear el módulo y luego obtener un control para ello y pasar el valor/vect al mango de alguna manera?

No estoy muy preocupado sobre cómo se establecerán los nombres de los archivos, ya que probablemente no lo haría desde el código verilog de todos modos. Y probablemente me apegue a muestras enteras de 24 bits por el momento y libsndfile se supone que maneje la conversión bastante bien. Tal vez, me atengo a la serie por ahora (incluso puede hacerlo en la forma de I2S) y de serializarlo en Verilog si es necesario.

También he examinado Icarus plug-in 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 parece un poco demasiado complicado para mí en este momento, ninguno de los dos me las arreglé para ejecutar .

Respuesta

3

Sugiero acercándose así:

  1. la figura de su C/interfaz de Verilog
  2. implementar el acceso a los archivos de audio con esa interfaz en mente, pero no preocuparse por VPI
  3. aplicar la C/Pegamento Verilog usando VPI

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

uso Verilog El podría ser tan simple como:

initial $OpenAudioFile ("filename"); 

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

La muestra imagen-VPI se ve como un ejemplo razonable para empezar.Las expresiones básicas para utilizar en el código C son:

acceso Argumento

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

valores de Recuperación de Verilog

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

valores escrito 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, necesitará usar vpiVectorVal en lugar de vpiIntVal, y de/codificar una estructura de s_vpi_vector.

+0

Tuve un pequeño problema al implementar 'audio_data <= $ ReadSample;', así que lo hice en '$ ReaddSample (audio_cah1n1, audo_chan2);' moda. La diferencia es básicamente si es Función o Tarea, las funciones parecen ser bastante desagradables de acuerdo a cómo se comportan ... parece que las funciones se pueden llamar algo en cualquier punto durante la simulación y esto no es bueno si estoy contando el índice de muestra en la función C! – errordeveloper

1

He pasado unos días ahora la implementación del banco de pruebas PLI, si alguien lee esto y se puede encontrar útil - aquí es mi source code. Hay un archivo readme y por debajo es la captura de pantalla de algunos resultados básicos;)

Uso git clone git://github.com/errordeveloper/sftb obtener el repositorio de código o descargarlo de la github.com.

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

También he escrito sobre esto en my new blog, así que espero si alguien busca para este tipo de cosas lo van a encontrar. No pude encontrar nada similar, ¡así que comencé este proyecto!

1

Esto suena como una buena opción para Cocotb un proyecto de código abierto que abstrae VPI para proporcionar una interfaz Pythonic a su DUT. No tendría que escribir ningún banco de pruebas Verilog adicional o RTL de envoltura o llamar a tareas o funciones VPI de Verilog ya que los bancos de pruebas son Python puros.

Su banco de pruebas como se describe sería algo como esto:

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 

exención de responsabilidad: yo soy uno de los desarrolladores Cocotb y por lo tanto potencialmente sesgada, sin embargo también me reto a cualquiera de producir una funcionalidad similar a el banco de pruebas anterior tan rápido y con menos líneas de código (mantenible).

+0

¡Excelente! Si vuelvo a ver a Verilog, definitivamente le daré una oportunidad a Cocotb. – errordeveloper

Cuestiones relacionadas