2017-02-22 36 views
0

Я ищу элегантный C++, использующий SystemC для конкатенации бит.concatenate bits C++

пример

Система 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 
+2

ли остальные биты постоянными? Uint в примере системы verilog имеет 34 бита? Если остальное не изменится, используйте ли его как маску и/или (255 << 16), если моя переменная истинна? –

ответ

2

Похожым

0b0000'0000'0000'0000'1111'1111'0000'1100 | 
(0b0000'0000'1111'1111'0000'0000'0000'0000 * myVariable) 
1

В операторе запятой 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; 
}; 

Так SystemC версия вашего образца SystemVerilog может выглядеть следующим образом:

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)); 
+0

Есть ли способ бросить sc_lv в sc_uint? Если это так, нам не нужна функция репликации. –

+0

Я не совсем понял идею sc_lv. Не могли бы вы подробно рассказать об этом? В общем, я думаю, что можно написать шаблонную функцию репликации, которая будет поддерживать различные типы данных. – random

+0

sc_lv - тип логической произвольной ширины это документация sc_lv http://www.lysium.de/docs/systemc-2.2/docs/html/classsc__dt_1_1sc__lv.html, она имеет c'tor для инициализации всех битов с тем же значением : шаблон sc_dt :: sc_lv < W > :: sc_lv \t (\t \t BOOL init_value \t) –