2017-02-22 46 views
0

我正在尋找一個優雅的C++使用SystemC來連接位。concatenate位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

是位不變的休息嗎?系統verilog示例中的uint有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; 
}; 

您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)); 
+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 init_value \t) –