Я портирую некоторый код 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];
Есть ли способ лучше?
Теперь вы используете SystemC, почему бы вам не использовать sc_bv<> представлять сигналы HDL изначально? Поскольку SystemC имеет набор типов данных для представления битовых / логических и словесных логических операторов HDL, должно быть проще сопоставить типы данных SystemVerilog / Verilog с кодом C / C ++.
sc_bv<4> reg1;
sc_bv<16> reg2;
reg1 = reg2.range(7,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);