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

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

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

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

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

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

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

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


person errordeveloper    schedule 16.06.2011    source источник


Ответы (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.

person Andy    schedule 17.06.2011
comment
У меня были небольшие проблемы с реализацией audio_data <= $ReadSample;, поэтому я сделал это в стиле $ReaddSample(audio_cah1n1, audo_chan2);. Разница в основном заключается в том, является ли это функцией или задачей, функции кажутся довольно неприятными в зависимости от того, как они себя ведут... кажется, что функции могут вызываться в какой-то момент в любой момент во время моделирования, и это нехорошо, если я считаю образец индекса в функции C! - person errordeveloper; 23.06.2011

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

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

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

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

person errordeveloper    schedule 23.06.2011

Похоже, это хорошо подходит для Cocotb, проекта с открытым исходным кодом, который абстрагирует VPI для предоставления интерфейса Pythonic для ваш ДУТ. Вам не нужно было бы писать какие-либо дополнительные тестовые стенды 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 и поэтому потенциально предвзят Я бы также призвал любого создать функциональность, аналогичную приведенному выше тестовому стенду, как можно быстрее и с меньшим количеством строк (поддерживаемого) кода.

person Chiggs    schedule 04.01.2014
comment
Отлично! Если я вернусь к Verilog, я обязательно попробую Cocotb! - person errordeveloper; 10.01.2014