2

我正在编写一些代码,需要我读取文件,然后将其用作 SystemC 模块的输入。这意味着我应该读取一个文件,比如 abc.xxx,然后将其内容以二进制形式发送到一个端口(另一种解释方式:我想将一个文件读入缓冲区并通过一个SystemC 端口)。我的问题是:

1)我可以使用文本文件作为我的输入。读取文本文件,并将其文本内容存储在一个字符串中(这对我的目的来说已经足够了)。但是我如何通过 systemC 端口发送这个字符串呢?

2)上述解决方案仅适用于文本文件,我想使用文本文件的文本内容。但是就像我最初的查询一样,当我只想通过端口传输文件时该怎么办?

如果我的查询不完全清楚,我深表歉意。提前致谢!!

4

1 回答 1

1

如果我理解正确,您想从一个文件中获取输入SC_MODULE并将其发送到另一个文件SC_MODULE。您没有给出任何限制,因此假设您只想使用二进制 ASCII 编码发送文本,您可以使用 8 位宽度的 sc_port 无符号整数:sc_uint<8>逐个字符地发送字符串。

发送模块的程序。
对于正确的硬件传输,您需要一些握手信号:

  • 就绪信号:检查接收模块是否准备好接收新数据。sc_in<bool> rdy
  • 有效信号:向接收模块发出新数据在端口上的信号。sc_out<bool> vld
  • 和数据端口发送字节。小心使用受保护的字“数据”。sc_out<sc_int<8>> datap

现在让我们假设您要发送一个包含 10 个字符的文本文件,我认为 for 循环将是执行此操作的最简单和直观的方法。将此代码放在 SC_THREAD 中,因为它包含您只想执行一次的控制逻辑。假设此设计的时钟周期为 10 ns,您将得到如下结果:

// open file for reading
std::ifstream fp_in;
fp_in.open("data.txt", ios::in | ios::binary);
if (fp_in.is_open())
{
    cout  << "file opened for reading" << endl;
    fp_in.seekg(0, ios::beg ); // put file pointer to beginning of file
}
else {
    cout << "Unable to open data.txt for reading";
}

// read data from file and send
const int DATALENGHT = 10;
char buffer;
for(int i=0; i<DATALENGHT; ++i)
{
    while(rdy.read() != true) wait(10, SC_NS); // wait untill receiver is ready
    fp_in.read(buffer, 1);
    datap.write(buffer);
    vld.write(true);
    wait(10, SC_NS); // wait one clockcycle for the receiver to read it.
    vld.write(false);
    datap.write(0);   
}
fp_in.close();
于 2013-10-23T08:13:34.770 回答