忍者ブログ
凡人の日々の経過を記録
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



構造体もランダムを生成することができる.

次のような構造体がすでにあるとする。


struct data_t {
sc_uint<12> addr;
unsigned char payload[5];
};


addrとpayload[5]の6つの変数の値をランダムとするには、次を別途用意する。

template<>
class scv_extensions<data_t> : public scv_extensions_base<data_t>
{
public:
sc_extensions<sc_uint12> > addr;
sc_extensions<unsigned char [5]> payload;

SCV_EXTENSIONS_CTOR( data_t ) {
SCV_FIELD( addr );
SCV_FIELD( paylaod );
}
};



使い方はつぎのようになる。


scv_smart<data_t> data_p( "data_p" );

data_p->addr.keep_out(0, 100);
for (int i=0; i<5; ++i)
data_p->payload[i].keep_only( 0, 100 );

for (int i=0; i<10; ++i) {
data->next();

printf( "addr = %d, ", (int)data_p->addr );
printf( "payload = " );
printf( "%d, ", (int)data_p->payload[0] );
printf( "%d, ", (int)data_p->payload[1] );
printf( "%d, ", (int)data_p->payload[2] );
printf( "%d, ", (int)data_p->payload[3] );
printf( "%d\n", (int)data_p->payload[4] );
}



実行結果
------------------------------------
addr = 31, payload = 84, 33, 24, 48, 65
addr = 85, payload = 41, 16, 72, 21, 81
addr = 99, payload = 80, 9, 53, 68, 20
addr = 64, payload = 68, 47, 13, 53, 53
addr = 38, payload = 58, 68, 83, 4, 11
addr = 33, payload = 98, 71, 90, 41, 80
addr = 58, payload = 24, 19, 58, 62, 99
addr = 96, payload = 21, 18, 27, 69, 47
addr = 25, payload = 70, 49, 23, 24, 41
addr = 11, payload = 71, 42, 55, 9, 19
------------------------------------

拍手[0回]

PR


ランダム生成してみた。

まずは、基本から。



scv_smart_ptr<int> data_p( "data" );

data_p->keep_only( 0, 10 ); // 0~10までをランダム生成とする設定

for (int i=0; i<10; i++) {
data_p->next(); // 次の値に
printf( "data = %d\n", data_p->read() ); // 値を取得
}


実行結果はつぎのとおり。
-----------
data = 1
data = 10
data = 6
data = 8
data = 10
data = 2
data = 9
data = 3
data = 0
data = 7
-----------


拍手[0回]



とりあえず、実行してみた。



#include "scv.h"

int sc_main( int argc, char* argv[] )
{
int data = 1234;
int bitwidth = scv_get_extensions(data).get_bitwidth();

scv_get_extensions( data ).print();

printf( "bitwidth=%d\n", bitwidth );

return 0;
}



実行結果はつぎのとおり。
-------------------
1234
bitwidth=32
-------------------

とりあえず、実行できた!!!
どうやら、インクルードはscv.hのみで間に合うようで、systemc.hは省略できるようだ。
ここでは試しにscv_get_extensionsというのを使ってみたが、あまり使う用途はなさそう。



sc_uint<15> a;
int bitwidth = scv_get_extensions(a).get_bitwidth();


これはbitwidth=15になった。

拍手[0回]



さっそく実行してみた。

SystemCとSCVのインストール先は、それぞれ
/usr/local/systemc-2.1
/usr/local/scv
とした。
SCVのインストールで/usr/local/scv/include/scv/*.h ファイルのパーミッションが700になってしまって普通のユーザが読み込めない状態になってしまっていた.
これだとコンパイルできないので、パーミッションを644に変更した。
こういうところ、ちょっと手抜きか。。

まずはメイクファイルを作成した.
基本はSystemCのメイクファイルで、そこにSCVのインクルードの指定(-I)とライブラリの指定(-L -l)を追加した.

-I/usr/local/scv/include -I/usr/local/systemc-2.1/include
-L/usr/local/scv/lib-linux -lscv -L/usr/local/systemc-2.1/lib-linux -lsystemc


あとSCVは.so(ダイナミックリンクライブラリ)をつかっているのでLD_LIBRARY_PATHの指定が必要となる.

とりあえず、.bash_profileあたりに次を書いて済ませることにした。

LD_LIBRARY_PATH=/usr/local/scv/lib-linux/:$(LD_LIBRARY_PATH)
export LD_LIBRARY_PATH


注意として、メイクファイルでライブラリを指定するときに、-lscvのあとに-lsystemcを書かないとだめみたい。
逆にすると"unreferenced ..."というエラーメッセージがたくさん出てしまった。


拍手[0回]



SCVというものをこれから勉強していきたいと思っている。

拍手[0回]




Powered by 忍者ブログ  Design by © まめの
Copyright © [ ずくのない凡人の日記 ] All Rights Reserved.
http://bambooflow.blog.shinobi.jp/