5

オーディオ ファイル (wav、aiff など) を開き、Verilog シミュレータにデータを表示する VPI/PLI インターフェイスを作成したいと考えています。現在 Icarus を使用しており、libsndfile を使用して入力ファイル形式とデータ型変換を処理したいと考えています。

Cコードで何を使用すればよいかよくわかりません...IEEE 1364-2001を見て、どの関数を使用するべきかまだ混乱しています。

理想的には、データ ポート (シリアルまたはパラレル)、クロック入力、およびスタート/ストップ ピンを備えた Verilog モジュールが必要です。2 つのモジュールを実装したいと思います。1 つはファイルからの再生用で、もう 1 つはテスト対象のフィルターからの出力を記録します。

すべてを C で実行し、テストベンチでモジュールをインスタンス化するか、関数 (たとえば$read_audio_data) とラッパー モジュールを記述して、各クロック パルスでそれを呼び出す必要がありますか??

うーん、またはモジュールを作成してからハンドルを取得し、値/ベクトルをハンドルに渡す必要があるのでしょうか?

ファイル名がどのように設定されるかについては、あまり気にしていません。とにかく verilog コードからはそうしないでしょう。そして、当面は 24 ビット整数サンプルに固執し、 libsndfile変換を非常にうまく処理できるはずです。おそらく、今のところシリアルに固執し (I2S のような方法で行うことさえあるかもしれません)、必要に応じて Verilog でデシリアライズします。

また、PNG ファイルを読み取るビデオ カメラを実装する Icarusプラグインも調べましたが、画像処理にはオーディオよりも多くの側面があります。したがって、そのコードは現時点では少し複雑に見えます-実行することもできませんでした。

4

3 に答える 3

3

次のようにアプローチすることをお勧めします。

  1. C/Verilog インターフェイスを理解する
  2. そのインターフェイスを念頭に置いて音声ファイル アクセスを実装しますが、VPI については心配しません。
  3. VPI を使用して C/Verilog グルーを実装する

インターフェイスはおそらく非常にシンプルです。1 つの関数でオーディオ ファイルを開き、必要なパラメーター (サンプル サイズ、ビッグ/リトル エンディアンなど) を指定し、別の関数で次のサンプルを返します。同じシミュレーションで複数のファイルからの読み取りをサポートする必要がある場合は、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 構造体をデコード/エンコードする必要があります。

于 2011-06-17T16:41:44.790 に答える
2

PLI テストベンチの実装に数日を費やしました。誰かがこれを読んで役に立つと思うかもしれません。これが私のソース コードです。readme ファイルがあり、以下は基本的な結果のスクリーンショットです ;)

git clone git://github.com/errordeveloper/sftbコード リポジトリを取得するか、github.com からダウンロードするために使用します。

gtkwave での Velvet Underground の Sunday Morning の小さな断片のスクリーン ショー

これについては新しいブログでも書いているので、誰かがこの種のものを検索すれば見つけられることを願っています。似たようなものが見つからなかったので、このプロジェクトを開始しました!

于 2011-06-23T13:20:17.057 に答える
1

これは、VPI を抽象化して DUT に Python インターフェイスを提供するオープンソース プロジェクトであるCocotbにぴったりのように思えます。テストベンチは純粋な Python であるため、追加の Verilog テストベンチまたはラッパー RTL を作成したり、Verilog から VPI タスクまたは関数を呼び出したりする必要はありません。

説明したテストベンチは次のようになります。

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 人であり、偏見を持っている可能性がありますが、上記のテストベンチと同様の機能を、より少ない (保守可能な) コード行でできるだけ早く作成するよう、誰にでも挑戦したいと思います。

于 2014-01-04T00:10:05.113 に答える