Question

Je voudrais écrire une interface VPI / PLI qui ouvrira les fichiers audio (i.e. wav, aiff, etc.) et présentez les données au simulateur Verilog. J'utilise Icarus en ce moment et je souhaite utilisez libsndfile pour gérer les formats de fichiers d'entrée et la conversion des types de données.

Je ne sais pas trop quoi utiliser dans le code C ... j'ai regardé IEEE 1364-2001 et toujours confus quelles fonctions suis-je censé utiliser.

Idéalement, j'aimerais avoir un module verilog avec port de données (série ou parallèle), entrée d'horloge et la broche de démarrage / arrêt. Je voudrais implémenter deux modules, un pour la lecture à partir d'un fichier, et un autre enregistrerait la sortie d'un filtre en cours de test.

Puis-je tout faire en C et instancier simplement le module dans mon banc de test ou je devrai écrire une fonction (disons $read_audio_data) et un module wrapper pour l'appeler à chaque impulsion d'horloge ??

Hm, ou peut-être dois-je créer le module, puis obtenir une poignée pour celui-ci et passer valeur / vect à la poignée en quelque sorte?

Je ne suis pas vraiment préoccupé par la façon dont les noms de fichiers seront définis, car je ne le ferait pas à partir du code verilog de toute façon. Et je vais probablement m'en tenir aux échantillons entiers 24 bits pour le moment et libsndfile censé gérer la conversion assez bien. Peut-être que je m'en tiendrai à la série pour le moment (peut-être même le faire dans le style I2S) et le désérialiser dans Verilog si nécessaire.

J'ai également examiné le plug-in d'Icare qui implémente une caméra vidéo qui lit les fichiers PNG, bien qu'il y ait beaucoup plus d'aspects au traitement d'image que l'audio. Par conséquent, ce code me semble un peu trop compliqué pour le moment - ni j'ai réussi à obtenir pour l'exécuter.

Était-ce utile?

La solution

Je suggère de l'aborder comme ceci:

  1. découvrez votre interface C / Verilog
  2. implémentez l'accès aux fichiers audio avec cette interface à l'esprit, mais sans vous soucier de VPI
  3. implémenter la colle C / Verilog à l'aide de VPI

L'interface peut probablement être assez simple. Une fonction pour ouvrir le fichier audio et spécifier les paramètres nécessaires (taille de l'échantillon, gros / petit boutiste, etc.), et une autre fonction renvoie l'échantillon suivant. Si vous avez besoin de prendre en charge la lecture à partir de plusieurs fichiers dans la même simulation, vous devrez passer une sorte de descripteur aux fonctions PLI pour identifier le fichier à partir duquel vous lisez.

L'utilisation de Verilog pourrait être aussi simple que:

initial $OpenAudioFile ("filename");

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

L'exemple image-vpi ressemble à un exemple raisonnable pour commencer. Les idiomes de base à utiliser dans le code C sont:

Accès aux arguments

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

Récupération des valeurs de Verilog

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

Écriture de valeurs dans Verilog

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

Pour lire ou écrire des valeurs supérieures à 32 bits, vous devrez utiliser vpiVectorVal au lieu de vpiIntVal, et dé / encoder une structure s_vpi_vector.

Autres conseils

J'ai passé quelques jours à implémenter le banc de test PLI, si quelqu'un lit ceci et qu'il peut le trouver utile - voici mon code source .Il y a un fichier readme et ci-dessous est la capture d'écran de quelques résultats de base;)

Utilisez git clone git://github.com/errordeveloper/sftb pour obtenir le référentiel de code ou téléchargez-le sur github.com.

Ecran d'un petit fragment du Sunday Morning de Velvet Underground dans gtkwave

J'ai également écrit à ce sujet dans mon nouveau blog , donc j'espère si quelqu'un cherche ce genre de chose, il le trouvera. Je n'ai rien trouvé de similaire, c'est pourquoi j'ai commencé ce projet!

Cela semble être un bon choix pour Cocotb un projet open-source qui résume VPI pour fournir unInterface pythonique avec votre DUT.Vous n'auriez pas à écrire de testbench ou de wrapper RTL supplémentaire de Verilog ou d'appeler des tâches ou des fonctions VPI à partir de Verilog car les bancs de test sont du Python pur.

Votre banc de test tel que décrit ressemblerait à ceci:

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

Clause de non-responsabilité : je suis l'un des développeurs Cocotb et donc potentiellementbiaisé, mais je mettrais aussi au défi quiconque de produire des fonctionnalités similaires au banc de test ci-dessus aussi rapidement et avec moins de lignes de code (maintenable).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top