Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_Bitset_System Verilog - Fatal编程技术网

C++ 如何在C++;?

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

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