4

SystemVerilogコードをSystemC/C++に移植しています。std :: bitsetを使用してビットベクトルを表現していますが、スライスにアクセスするためのメソッドを提供するには不十分であることがすでにわかります。

たとえば、SystemVerilogコードを使用してreg1をreg2のビット4〜8に設定する場合:

bit [3:0] reg1;
bit [15:0] reg2;
reg1 = reg2[7:4];

std :: bitsetでこれを行うにはどうすればよいですか?

bitset<4> reg1;
bitset<16> reg2;
reg1[0] = reg2[4];
reg1[1] = reg2[5];
reg1[2] = reg2[6];
reg1[3] = reg2[7];

もっと良い方法はありますか?

4

2 に答える 2

5

SystemCを使用しているので、sc_bv <>を使用してHDL信号をネイティブに表現してみませんか?SystemCにはHDLビット/論理およびワード論理演算子を表すデータ型のセットがあるため、SystemVerilog/Verilogデータ型をC/C++コードにマッピングする方が簡単です。

sc_bv<4> reg1;
sc_bv<16> reg2;
reg1 = reg2.range(7,4);
于 2012-11-05T14:39:42.610 に答える
4

ビットセットを操作する場合は、to_string関数を使用します。

bitset<4> reg1;
bitset<16> reg2;
reg1 = bitset<4>(reg2.to_string().substr(4,4));

これはあまり効率的な方法ではありませんが、機能するはずです。

32ビットまたは64ビットより大きいビットセットがない場合は、to_ulongまたはを使用したバージョンを使用するto_ullongと、より効率的になります。

また、std::vector<bool>の代わりに使用することを検討してstd::bitset<>ください。ここの人々は、見るたびに反対票を投じる傾向がありますがstd::vector<bool>、ここではより効率的である可能性があります。

vector<bool> reg1(4);
vector<bool> reg2(16);
reg1.assign(reg2.begin() + 4, reg2.begin() + 8);
于 2012-11-02T19:14:37.803 に答える