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

If your want to operate on bitsets - then use to_string function:

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

This is not very efficient way, but should work.

If you do not have bitsets bigger than 32 or 64 bits - then use version with to_ulong or to_ullong - it should be more efficient.

Also consider to use std::vector<bool> instead of std::bitset<>. Folks here have tendency to make downvote every time they see std::vector<bool>, but it could be more efficient here:

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