我正在寻找一个优雅的C ++,使用SystemC来连接位。
系统Verilog示例在一个不错的行中:
bool my_variable;
uint bits_combination = {8'b0, {8{my_variable}}, 8'b1, 4'b0, 2'b1, 2'b0};
我对C ++的最佳解决方案:
bool my_variable;
sc_uint<32> bits_combination;
bits_combination.range(31,24) = 0;
bits_combination.range(23,16) = my_variable ? (1 << 8)-1 : 0;
bits_combination.range(15,8) = (1 << 8)-1;
bits_combination.range(7,4) = 0;
bits_combination.range(3,2) = (1 << 2)-1;
bits_combination.range(1,0) = 0;
将此行改进为非三元运算符也会有所帮助:
my_variable ? (1 << 8)-1 : 0
答案 0 :(得分:2)
看起来像
0b0000'0000'0000'0000'1111'1111'0000'1100 |
( 0b0000'0000'1111'1111'0000'0000'0000'0000 * myVariable )
答案 1 :(得分:2)
在SystemC中,逗号运算符重载以进行连接。但是没有像{8 {my_variable}}这样的复制运算符。
但是,您可以编写一个可以进行复制的函数。例如:
template <int N, int M>
sc_uint<N*M> replicate( sc_uint<M> val) {
sc_uint<N*M> res = 0;
for (int i = 0; i < N; ++i)
res = (res << M) | val;
return res;
};
所以SystemVerilog示例的SystemC版本可能如下所示:
sc_uint<1> my_variable = 1;
sc_uint<32> bits_concatenation = (sc_uint<8>(0), replicate<8>(my_variable), sc_uint<8>(1), sc_uint<4>(0), sc_uint<2>(1), sc_uint<4>(0) );