Простой Verilog VPI модуль для открытия аудио файлов

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

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

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

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

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

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

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

3 ответа

Решение

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

  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.

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

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

Скриншот небольшого фрагмента из воскресного утра Velvet Underground в gtkwave

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

Это похоже на то, что 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 и, таким образом, потенциально предвзят, однако я бы также призвал любого создать функциональность, аналогичную описанной выше, для тестирования, как можно быстрее и с меньшим количеством строк (поддерживаемых) кода.

Другие вопросы по тегам