2011-06-16 48 views
5

我想編寫一個VPI/PLI接口,它將打開音頻文件(即wav,aiff等) 並將數據呈現給Verilog仿真器。目前我正在使用Icarus,並希望 使用libsndfile來處理輸入文件格式和數據類型轉換。簡單的Verilog VPI模塊打開音頻文件

我不太清楚在C代碼中使用什麼...已經看過IEEE 1364-2001,仍然 混淆我應該使用哪些函數。

理想情況下,我想有一個數據端口(串行或並行),時鐘輸入 和啓動/停止引腳的verilog模塊。我想實現兩個模塊,一個用於從文件中回放,另一個將記錄來自測試過濾器的輸出。

我可以做到這一切在C和剛剛實例化模塊在我的測試平臺,不然我就必須寫 功能(比如$read_audio_data)和包裝器模塊調用它在每個時鐘脈衝?

嗯,或者可能需要創建該模塊,然後獲取它的句柄並以某種方式將值/ vect 傳遞給句柄?

我不太關心如何設置文件名,因爲我可能 不會從verilog代碼中完成。 我可能會堅持24位整數樣本, libsndfile應該很好地處理轉換。 也許,我現在會堅持使用串行的方式(甚至可能會以類似I2S的方式進行),如果需要,還可以在Verilog中對其進行反序列化。

另外我看了看Icarus plug-in,它實現了一個讀取PNG文件的視頻攝像頭, 雖然有很多方面的圖像處理,然後有音頻。 因此,該代碼目前看起來有點過於複雜 - 我沒有設法讓它運行 。

回答

3

我建議接近它是這樣的:

  1. 找出你的C/Verilog的接口
  2. 實施時考慮該接口的音頻文件的訪問,但不擔心VPI
  3. 實現C /使用VPI的Verilog膠水

接口可能很簡單。打開音頻文件並指定任何必要參數(樣本大小,大/小端等等)的函數,以及另一個函數返回下一個樣本。如果您需要在同一個模擬中支持從多個文件中讀取數據,則需要將類型句柄傳遞給PLI函數以確定您正在讀取哪個文件。

initial $OpenAudioFile ("filename"); 

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

的圖像VPI樣品看起來像一個合理例子從開始:如

Verilog的使用可能是一樣簡單。在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結構進行解碼/編碼。

+0

我在實現'audio_data <= $ ReadSample;'時遇到了一些問題,所以我在$ ReaddSample(audio_cah1n1,audo_chan2);'fashion中做了它。它們的區別基本上是 它是函數還是任務,根據它們的行爲方式,函數看起來是一件非常糟糕的事情......似乎函數在仿真過程中的任何時候都可能會被調用,而且如果我正在計算C函數中的示例索引! – errordeveloper 2011-06-23 13:46:08

1

我已經花了幾天的時間來實現PLI測試平臺,如果有人讀這個,他們可能會發現它有用 - 這裏是我的source code。有一個自述文件和下面 是一些基本的結果的截圖;)

使用git clone git://github.com/errordeveloper/sftb獲得 代碼回購或從github.com下載。

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

我也曾在my new blog寫了關於這一點,所以希望 如果有人對這樣的事情搜索,他們將找到它。 我找不到任何類似的東西,因此開始了這個項目!

1

這聽起來很適合Cocotb這個開源項目,它抽象VPI爲您的DUT提供Pythonic接口。由於測試平臺是純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開發商之一,因此潛在偏見,但我也想挑戰任何人產生類似的功能上述測試平臺儘可能快並且具有較少的(可維護的)代碼行。

+0

優秀!如果我回到Verilog,我會試着給Cocotb一個嘗試! – errordeveloper 2014-01-10 06:31:07