« Perl/Tk | Main | Joel on Software »

2007.01.13

sc_fifoの問題

sc_fifoには、write()、read() メンバ関数が用意されていて、
それを使ってアクセスができる。
しかし、channel経由でアクセスする場合は、->演算子を使う。

なぜ?

というわけで、最初の実験。
まずはsc_fifoへのアクセス方法を押さえよう。

#include

SC_MODULE(fifo_test1)
{
sc_in clk;

void process(void);

SC_CTOR(fifo_test1) {
SC_THREAD(process);
sensitive << clk;
}

sc_fifo > fifo;
};

void fifo_test1::process(void)
{
sc_int<16> rdata;

fifo.write(1);
fifo.write(2);
fifo.write(3);

wait();

std::cout << fifo.read() << std::endl;
std::cout << fifo.read() << std::endl;
std::cout << fifo.read() << std::endl;

sc_stop();
}

これはOK。ちゃんと1,2,3と表示される。

fifo.write(1); を fifo->write(1);に変えると

fifo_test1.cpp:10: error: base operand of `->' has non-pointer type `sc_core::sc_fifo >'
*** Error code 1

というエラーになる。
つまり、ある関数内部で、sc_fifoを宣言して、その中でアクセスする時は
read()/write()メンバ関数を使えばよい。


#include

SC_MODULE(fifo_test2)
{
sc_in clk;

void process(void);

SC_CTOR(fifo_test2) {
pfifo = new sc_fifo >;
SC_THREAD(process);
sensitive << clk;
}

~fifo_test2() {
delete pfifo;
}

sc_fifo > *pfifo;
};

void fifo_test2::process(void)
{
sc_int<16> rdata;

pfifo->write(1);
pfifo->write(2);
pfifo->write(3);

wait();

std::cout << pfifo->read() << std::endl;
std::cout << pfifo->read() << std::endl;
std::cout << pfifo->read() << std::endl;

sc_stop();
}

ポインタ経由のアクセスだと、->が普通にメンバ関数を呼び出している
ここまでは直感通り。

次に、sc_fifo_portsが何をしているか調べよう。

|

« Perl/Tk | Main | Joel on Software »

Comments

Posted by: free background check columbus ohio | 2015.06.26 at 06:28 AM

Posted by: free background check mn | 2015.07.06 at 03:11 AM

Posted by: free background check mn | 2015.10.09 at 08:46 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/13468655

Listed below are links to weblogs that reference sc_fifoの問題:

« Perl/Tk | Main | Joel on Software »