私は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番目の整数にすることができますか?
通常、生のTLM-2.0の上にユーザーフレンドリーなAPIを提供するSCMLのような高水準ライブラリを使用する必要があります。一般的なペイロードはツールの相互運用性のために設計されているため、EDAベンダーが提供する高度なAPIをエンドユーザが使いやすくする必要があります。 – random
はscmlオープンソースですか? v2.3.2のインクルードファイルはどこですか? –
https://www.synopsys.com/cgi-bin/slcw/kits/reg.cgiからダウンロードできます。他の同様のライブラリがあります。たとえば、greenlib:https://github.com/GreenSocs/greenlib – random