Простой Verilog VPI модуль для открытия аудио файлов - PullRequest
5 голосов
/ 16 июня 2011

Я хотел бы написать интерфейс VPI / PLI, который будет открывать аудиофайлы (например, wav, aiff и т. Д.) И представлять данные в симуляторе Verilog.В настоящее время я использую Icarus и хочу использовать libsndfile для обработки форматов входных файлов и преобразования типов данных.

Я не совсем уверен, что использовать в коде C ... Посмотрел IEEE 1364-2001и все еще не понял, какие функции я должен использовать.

В идеале я хотел бы иметь модуль verilog с портом данных (последовательным или параллельным), входом тактовой частоты и контактом пуска / останова.Я хотел бы реализовать два модуля, один для воспроизведения из файла, а другой записывал бы выходные данные тестируемого фильтра.

Могу ли я сделать все это в C и просто создать экземпляр модуля вмой тестовый стенд, или мне придется написать функцию (скажем, $read_audio_data) и модуль-обертку, чтобы вызывать его для каждого тактового импульса ??

Hm, или, может быть, мне нужно создать модуль изатем получить дескриптор для него и как-нибудь передать значение / vect дескриптору?

Меня не очень волнует, как будут заданы имена файлов, так как я, вероятно, в любом случае не буду делать это из кода verilog.И я, вероятно, пока что буду придерживаться 24-битных целочисленных выборок, а libsndfile должен довольно хорошо обрабатывать преобразование.Возможно, я сейчас остановлюсь на serial (может быть, даже на I2S-подобной моде) и десериализую его в Verilog при необходимости.

Также я посмотрел на плагин Icarus , которая реализует видеокамеру, которая читает файлы PNG, хотя есть гораздо больше аспектов обработки изображений, чем звука.Следовательно, на данный момент этот код выглядит для меня немного сложнее - и мне не удалось заставить его работать.

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Предлагаю подойти к этому так:

  1. выяснить ваш интерфейс C / Verilog
  2. реализует доступ к аудиофайлам с учетом этого интерфейса, но не беспокоится о VPI
  3. реализовать клей C / Verilog, используя VPI

Интерфейс может быть довольно простым. Одна функция открывает аудиофайл и задает все необходимые параметры (размер семпла, большой / младший порядок и т. Д.), А другая функция возвращает следующий семпл. Если вам нужно поддерживать чтение из нескольких файлов в одной и той же симуляции, вам нужно будет передать своего рода дескриптор функциям PLI, чтобы определить, из какого файла вы читаете.

Использование Verilog может быть простым:

initial $OpenAudioFile ("filename");

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

Образец image-vpi выглядит как разумный пример для начала. Основные идиомы для использования в коде C:

Доступ к аргументу

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

Получение значений из Verilog

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

Запись значений в Verilog

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

Чтобы прочитать или записать значения больше 32 бит, вам нужно будет использовать vpiVectorVal вместо vpiIntVal и де / кодировать структуру s_vpi_vector.

1 голос
/ 04 января 2014

Звучит так, как будто подходит для Cocotb проекта с открытым исходным кодом, который абстрагирует VPI для обеспечения Pythonic-интерфейса для вашего DUT. Вам не придется писать какие-либо дополнительные тестовые наборы Verilog или RTL-обертки или вызывать задачи или функции VPI из Verilog, поскольку тестовые наборы являются чистым Python.

Ваш тестовый стенд, как описано, будет выглядеть примерно так:

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

Отказ от ответственности : я являюсь одним из разработчиков Cocotb и, таким образом, потенциально предвзят, однако я бы также бросил кому-нибудь вызов сделать функциональность, аналогичную описанной выше, как быстро, так и с меньшими затратами. строки (поддерживаемого) кода.

1 голос
/ 23 июня 2011

Я потратил несколько дней на внедрение тестового стенда PLI, если кто-то прочитает это, и они могут найти это полезным - вот мой исходный код . Есть файл readme и ниже скриншот некоторых основных результатов;)

Используйте git clone git://github.com/errordeveloper/sftb для получения Код репозитория или загрузите его с github.com.

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

Я также писал об этом в моем новом блоге , так что, надеюсь, если кто-то ищет такие вещи, они найдут это. Я не мог найти ничего подобного, поэтому начал этот проект!

...