Как сделать назначение кусочкового вектора в стиле SystemVerilog в C ++?

Я портирую некоторый код SystemVerilog на SystemC / C ++. Я использую std :: bitset для представления битовых векторов, но уже вижу, что не хватает методов для доступа к срезу.

Например, если я хочу установить reg1 на биты 4-8 reg2 с кодом SystemVerilog:

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];

Есть ли способ лучше?

3

Решение

Теперь вы используете SystemC, почему бы вам не использовать sc_bv<> представлять сигналы HDL изначально? Поскольку SystemC имеет набор типов данных для представления битовых / логических и словесных логических операторов HDL, должно быть проще сопоставить типы данных SystemVerilog / Verilog с кодом C / C ++.

sc_bv<4> reg1;
sc_bv<16> reg2;
reg1 = reg2.range(7,4);
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);
3