C++ 如何在C++;?
我正在将一些SystemVerilog代码移植到SystemC/C++。我使用std::bitset来表示位向量,但我可以看到它已经不能提供访问切片的方法 例如,如果我想用SystemVerilog代码将reg1设置为reg2的第4-8位:C++ 如何在C++;?,c++,bitset,system-verilog,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] = r
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];
位集reg1;
位集reg2;
reg1[0]=reg2[4];
reg1[1]=reg2[5];
reg1[2]=reg2[6];
reg1[3]=reg2[7];
有更好的方法吗?如果您想对位集进行操作,请使用to_string函数:
bitset<4> reg1;
bitset<16> reg2;
reg1 = bitset<4>(reg2.to_string().substr(4,4));
现在您正在使用SystemC,为什么不使用sc_bv以本机方式表示HDL信号?因为SystemC有一组数据类型来表示HDL位/逻辑和字逻辑运算符,所以将SystemVerilog/Verilog数据类型映射到C/C++代码应该更容易
sc_bv<4> reg1;
sc_bv<16> reg2;
reg1 = reg2.range(7,4);
sc_bv reg1;
sc_bv reg2;
reg1=reg2.范围(7,4);
我将编写一个函数子位(const std::bitset&bits,size\u t begin,size\u t end)
来屏蔽所需的位,将它们向右移动,使begin
位于位0,依此类推,然后返回该值。具体到哪里取决于您。请注意,这里有一个基本的不一致之处:可以在运行时指定范围,但位集大小是在编译时指定的。除非您保证范围由整数常量表达式表示,否则您无法确定(没有运行时检查)结果范围是否足够小,以适合目标位集。也就是说,您必须在运行时检查end-begin std::bitset
,以确保类型匹配。谢谢,我不知道sc_bv,我会检查它。是的,到目前为止,这正是我想要的。它还支持常量和变量范围。
sc_bv<4> reg1;
sc_bv<16> reg2;
reg1 = reg2.range(7,4);