如何在C ++中进行SystemVerilog风格的位向量切片赋值?

时间:2012-11-02 19:04:39

标签: c++ bitset system-verilog

我正在将一些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];

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

现在您正在使用SystemC,为什么不使用sc_bv&lt;&gt;本地表示HDL信号?因为SystemC有一组数据类型来表示HDL位/逻辑和字逻辑运算符,所以将SystemVerilog / Verilog数据类型映射到C / C ++代码应该更容易。

sc_bv<4> reg1;
sc_bv<16> reg2;
reg1 = reg2.range(7,4);

答案 1 :(得分:3)

如果你想对bitsets进行操作 - 那么使用to_string函数:

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

这不是一种非常有效的方法,但应该有效。

如果您没有大于32位或64位的位集 - 那么使用带有to_ulongto_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);