2017-12-19 11 views
0

私はSystemC TLMライブラリを使用しています。 2つの整数を持つペイロードを、その2つの整数の演算を実行するモジュールに送信したいと思います。私の質問は、単にペイロードを設定してデコードする方法です。SystemC転送レベルモデリングtlm_generic_payloadから2つの整数を抽出

はドゥロスは

virtual void b_transport(tlm::tlm_generic_payload& trans, sc_time& delay) 
{ 
    tlm::tlm_command cmd = trans.get_command(); 
    sc_dt::uint64 adr = trans.get_address()/4; 
    unsigned char* ptr = trans.get_data_ptr(); 
    unsigned int  len = trans.get_data_length(); 
    unsigned char* byt = trans.get_byte_enable_ptr(); 
    unsigned int  wid = trans.get_streaming_width(); 

あなたはメモリ位置へのポインタを送信しますようだから、それは私には見えるデコード

を設定し、ここで https://www.doulos.com/knowhow/systemc/tlm2/tutorial__1/

セットアップ

tlm::tlm_command cmd = static_cast(rand() % 2); 
if (cmd == tlm::TLM_WRITE_COMMAND) data = 0xFF000000 | i; 

trans->set_command(cmd); 
trans->set_address(i); 
trans->set_data_ptr(reinterpret_cast<unsigned char*>(&data)); 
trans->set_data_length(4); 
trans->set_streaming_width(4); 
trans->set_byte_enable_ptr(0); 
trans->set_dmi_allowed(false); 
trans->set_response_status(tlm::TLM_INCOMPLETE_RESPONSE); 

socket->b_transport(*trans, delay); 

デコードの両方にドキュメントを提供しました2つの整数が書かれています。

| ---------------------------------- int1 ---------- --------------- | ---------------------------------- --int2 ------------------------

| ptr + 0x0 | ptr + 0x(wid)| ptr + 0x(2 * wid )| ptr + 0x(3 * wid)| ptr + 0x(4 * wid)| ptr + 0x(5 * wid)| ptr + 0x(6 * wid)| ptr + 0x

---------- |

(7 * wid)|

この文書に関する私の解釈は正しいですか?

どのように最初の4つのメモリ位置[3:0]を取得し、それらをint32に結合し、2番目の4 [7:4]を取得して2番目の整数にすることができますか?

+0

通常、生のTLM-2.0の上にユーザーフレンドリーなAPIを提供するSCMLのような高水準ライブラリを使用する必要があります。一般的なペイロードはツールの相互運用性のために設計されているため、EDAベンダーが提供する高度なAPIをエンドユーザが使いやすくする必要があります。 – random

+0

はscmlオープンソースですか? v2.3.2のインクルードファイルはどこですか? –

+0

https://www.synopsys.com/cgi-bin/slcw/kits/reg.cgiからダウンロードできます。他の同様のライブラリがあります。たとえば、greenlib:https://github.com/GreenSocs/greenlib – random

答えて

0

あなたが書かれた二つの整数があるメモリ位置 へのポインタを送信しますようだから、私には見えます。 この文書の解釈は正しいですか?

はい

それらを取り戻すためにあなたがちょうどそれらをコピーする必要があります。

int32_t val0, val1; 
memcpy(&val0, ptr, sizeof(int32_t)); 
memcpy(&val1, ptr + sizeof(int32_t), sizeof(int32_t)); 

または

int32_t val[2]; 
memcpy(val, ptr, sizeof val); 

のようなものしかし、必ずイニシエータは長い有効なポインタの下にメモリを保持します十分なスタック上にデータを保持するのを避けるほうが良いかもしれません。ペイロードのデータ長属性に有効な値があるかどうかを確認することを忘れないでください。できるだけ早くそれらの問題を検出する必要があります。

関連する問題