首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中进行SystemVerilog风格的位向量片赋值?

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

Stack Overflow用户
提问于 2012-11-03 03:04:39
回答 2查看 1.7K关注 0票数 4

我正在将一些SystemVerilog代码移植到SystemC/C++。我使用std::bitset来表示位向量,但是我可以看到它已经不能提供访问切片的方法了。

例如,如果我想用SystemVerilog代码将reg1设置为reg2的第4-8位:

代码语言:javascript
复制
bit [3:0] reg1;
bit [15:0] reg2;
reg1 = reg2[7:4];

我如何使用std::bitset做到这一点?

代码语言:javascript
复制
bitset<4> reg1;
bitset<16> reg2;
reg1[0] = reg2[4];
reg1[1] = reg2[5];
reg1[2] = reg2[6];
reg1[3] = reg2[7];

有没有更好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-05 22:39:43

既然你正在使用SystemC,为什么不使用sc_bv<>来原生地表示高密度脂蛋白信号呢?由于SystemC有一组数据类型来表示HDL位/逻辑和字逻辑运算符,因此将SystemVerilog/Verilog数据类型映射到C/C++代码应该更容易。

代码语言:javascript
复制
sc_bv<4> reg1;
sc_bv<16> reg2;
reg1 = reg2.range(7,4);
票数 5
EN

Stack Overflow用户

发布于 2012-11-03 03:14:38

如果你想对位集进行操作,那么使用to_string函数:

代码语言:javascript
复制
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>都倾向于投反对票,但在这里可能会更有效率:

代码语言:javascript
复制
vector<bool> reg1(4);
vector<bool> reg2(16);
reg1.assign(reg2.begin() + 4, reg2.begin() + 8);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13201507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档