在实际设计中,有时候需要宽度大于64的整型数据类型,Syst引入了sc_bigint和sc_biguint。sc_bigint和sc_biguint的宽度可以从1到任意值,与sc_int和sc_unit相比其仿真速度要慢的多,因此如果不是必要,就不应该使用sc_bigint和sc_biguint而是尽量使用sc_int和sc_unit。
由于要考虑任意精度,sc_bigint和sc_biguint仿真速度大大下降。在sc_constants.h中,用户可以根据自己的需要定义SC_MAX_NBITS,以约束sc_bigint和sc_biguint的最大宽度,这样可以提供2~3倍的仿真速度增加,这个常量在默认的情况下是没有定义的,用户可以根据自己的需要进行修改。Syst推荐的SC_MAX_NBITS值应该为BITS_PER_DIGIT 的整数倍。BITS_PER_DIGIT在sc_nbdefs.h定义,它的值为30。
下面的代码将SC_MAX_NBITS定义为17倍的BITS_PER_DIGIT。
#define SC_MAX_NBITS 510 // 17 * BITS_PER_DIGIT
下表列出了sc_bigint和sc_biguint支持的操作类型。
表2-6 sc_bigint和sc_biguint支持的操作类型
操作类型 |
操作符 | 说明 |
位操作 | ~ | 按位取反。b=~a是将a的各个位取反后赋给b |
& | 按位与。c=a&b是将a与b按位与的结果赋给c | |
| | 按位或。c=a|b是将a与b按位或的结果赋给c | |
^ | 按位异或。c=a^b是将a与b按位异或的结果赋给c | |
>> | 右移位 | |
<< | 左移位 | |
算术操作 | + | 加 |
- | 减 | |
* | 乘 | |
/ | 整数除 | |
% | 取余 | |
关系运算 | = = | 逻辑等于 |
!= | 逻辑不等于 | |
< | 小于 | |
<= | 小于等于 | |
> | 大于 | |
>= | 大于等于 | |
赋值操作 | = | a=b 将b的值赋给a |
+= | a+=b等效于a=a+b | |
-= | a-=b等效于a=a-b | |
*= | a*=b等效于a=a*b | |
/= | a/=b等效于a=a/b | |
%= | a%=b等效于a=a%b | |
&= | a&=b等效于a=a&b | |
|= | a|=b等效于a=a|b | |
^= | a^=b等效于a=a^b | |
串连 | (,) | (a,b)将a和b串连起来构成更大的数 |
范围选择 | range(left,right) | a.range(x,y)选择了a的右数第y+1到第x+1位。Y可以是0 |
位选择 | [x] | a[x]选择了a的右数第x+1位 |
自动增加 | ++ | a++等效于a=a+1 |
自动减少 | -- | a--等效于a=a-1 |
下面给出sc_bigint和sc_biguint使用的例子:
sc_biguint<128> b1;
sc_biguint<64> b2;
sc_biguint<152> b3;
b3 = b1*b2;
b1*b2运算的结果有192位,只有低152位被赋值给b3。
sc_bigint和sc_biguint、sc_int和sc_unit、C++固有整型数据可以混合使用。