SystemC-sc_bigint和sc_biguint


 

      在实际设计中,有时候需要宽度大于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++固有整型数据可以混合使用。