首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的Verilog VPI模块打开音频文件

简单的Verilog VPI模块打开音频文件
EN

Stack Overflow用户
提问于 2011-06-16 13:12:30
回答 3查看 3.2K关注 0票数 5

我想要写一个VPI/PLI接口,它将打开音频文件(即wav、aiff等)并将数据呈现给Verilog模拟器。目前我正在使用Icarus,希望使用libsndfile来处理输入文件格式和数据类型转换。

我不太清楚在C代码中使用什么.已经看过IEEE 1364-2001,仍然搞不清楚我应该使用哪些功能。

理想情况下,我希望有一个verilog模块,具有数据端口(串行或并行),时钟输入和启动/停止引脚。我想实现两个模块,一个用于从文件中回放,另一个用于记录正在测试的过滤器的输出。

我可以用C语言完成所有这些工作,只需在我的测试平台中实例化模块,否则我必须编写一个函数(例如,$read_audio_data**)和包装器模块,以便在每个时钟脉冲上调用它?*)

嗯,或者可能我需要创建模块,然后为它获取一个句柄,并以某种方式将值/vect传递给句柄?

我不太关心如何设置文件名,因为我可能不会在verilog代码中这样做。我可能暂时坚持24位整数样本,libsndfile应该能很好地处理转换。也许,我现在会坚持串行(甚至可以做类似I2S的方式),并在Verilog中进行反序列化(如果需要的话)。

我还看过Icarus 插入式,它实现了一个读取PNG文件的摄像机,尽管图像处理比音频处理有更多的方面。因此,在我看来,这段代码现在看起来有点过于复杂了--我都没能让它运行。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-17 16:41:44

我建议这样做:

  1. 找出你的C/Verilog界面
  2. 使用该接口实现音频文件访问,但不要担心VPI。
  3. 用VPI实现C/Verilog胶

接口可能非常简单。一个函数打开音频文件并指定任何必要的参数(样本大小、大/小端点等),另一个函数返回下一个示例。如果您需要在相同的模拟中支持从多个文件中读取,则需要向PLI函数传递某种句柄,以识别您正在读取的文件。

Verilog的用法可以很简单,如:

代码语言:javascript
复制
initial $OpenAudioFile ("filename");

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

图像-vpi示例看起来是一个合理的示例。在C代码中使用的基本习惯用法是:

参数访问

代码语言:javascript
复制
// 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检索值

代码语言:javascript
复制
s_vpi_value v;
v.format = vpiIntVal;
vpi_get_value (handle, &v);
// value is in v.value.integer

向Verilog写入值

代码语言:javascript
复制
s_vpi_value v;
v.format = vpiIntVal;
v.value.integer = 0x1234;
vpi_put_value (handle, &v, NULL, vpiNoDelay);

要读取或写入大于32位的值,需要使用vpiVectorVal而不是vpiIntVal,并对s_vpi_vector结构进行编码。

票数 3
EN

Stack Overflow用户

发布于 2011-06-23 13:20:17

我已经花了几天的时间来实现PLI测试平台,如果有人读了这篇文章,他们可能会发现它很有用--这是我的源代码。有一个自述文件,下面是一些基本结果的截图;)

使用git clone git://github.com/errordeveloper/sftb获取代码回购或从github.com下载代码。

我也在我的新博客上写过这方面的文章,所以希望如果有人搜索这类东西,他们会找到的。我找不到类似的东西,于是开始了这个项目!

票数 2
EN

Stack Overflow用户

发布于 2014-01-04 00:10:05

这听起来很适合科克特,这是一个开源项目,它将VPI抽象成为您的DUT提供Pythonic接口。您不必编写任何额外的Verilog或包装器RTL,也不必从Verilog调用VPI任务或函数,因为testbench是纯Python的。

如所述,您的测试工作台如下所示:

代码语言:javascript
复制
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

免责声明:我是科克特开发人员之一,因此可能存在偏见,但我也会要求任何人以更少的(可维护的)代码行快速地生成类似于上面的testbench的功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6372455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档