2012-11-02 47 views
3

我正在將一些SystemVerilog代碼移植到SystemC/C++。我使用std :: bitset來表示位向量,但我可以看到它已經不能提供訪問切片的方法。如何在C++中執行SystemVerilog風格的位矢量切片分配?

例如,如果我想設置REG1至位REG2的4-8 SystemVerilog的代碼:

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]; 

有沒有更好的方法?

+0

我會寫一個函數'subbit(常量的std :: bitset的&位,SIZE_T開始,爲size_t結束)'掩蓋了你想要的位,他們轉移到右側,'begin'是位0等,然後返回該值。它取決於你。 – GManNickG

+0

注意這裏有一個根本的不一致:範圍可以在運行時指定,但bitset大小在編譯時指定。除非你保證範圍用積分常數表達式表示,否則你不能肯定地說(沒有運行時檢查)結果範圍足夠小以適應目標比特集。也就是說,你必須在運行時檢查'end - begin <= N'。您可以提供一個備用函數'subbit_c (std :: bitset ) - > std :: bitset '以確保匹配類型。 – GManNickG

回答

4

現在你正在使用SystemC的,你爲什麼不使用sc_bv <>原生地代表HDL信號?由於SystemC具有一組數據類型來表示HDL位/邏輯方式和字邏輯運算符,因此將SystemVerilog/Verilog數據類型映射到C/C++代碼應該更加容易。

sc_bv<4> reg1; 
sc_bv<16> reg2; 
reg1 = reg2.range(7,4); 
+0

謝謝,我不知道關於sc_bv,我會檢查出來。 – Rich

+0

是的,到目前爲止,這只是做我想要的。它也支持常量和變量範圍。 – Rich

3

如果你想在位集操作 - 然後用to_string函數:

bitset<4> reg1; 
bitset<16> reg2; 
reg1 = bitset<4>(reg2.to_string().substr(4,4)); 

這不是非常有效的方式,但應該工作。

如果您沒有比32位或64位大的位集 - 然後使用to_ulongto_ullong版 - 應該會更高效。

還考慮使用std::vector<bool>而不是std::bitset<>。鄉親們在這裏有傾向每次他們看到std::vector<bool>時間作出downvote,但它可能是更有效的位置:

vector<bool> reg1(4); 
vector<bool> reg2(16); 
reg1.assign(reg2.begin() + 4, reg2.begin() + 8);