学海荡舟手机网
导航

主页 > 电子设备技术 > 电器电路基础 > > 详细内容

SystemC-sc_int和sc_uint

 

  在数字系统建模中常常需要对固定宽度的整型数据进行操作。C++的固有数据类型int的宽度是与所使用的机器有关的,但通常是32位的。使用C++固有数据类型显然可以提高仿真速度,但只能实现对8/16/32位的数据的操作,为此,Syst中引入了sc_int和sc_uint来实现1到64比特中任意宽度的整型数据类型,又引入了sc_bigint和sc_biguint来实现任意宽度的整型操作。显然使用sc_int和sc_uint的仿真速度要比使用sc_bigint和sc_biguint要快,因此推荐的使用方法是在能够使用sc_int和sc_uint的时候尽量不要使用sc_bigint和sc_biguint。

      Syst使用模板类sc_int<W>和sc_uint<W>实现了sc_int和sc_uint,其中W为数据的宽度。虽然当W大于64也不会出现编译错误,但根据SystemC的有关文献,它的值应该不大于64,否则可能会产生不确定的运行结果。

  下面的语句是合法的:

      sc_int<34> a;// 定义了一个34位的有符号整型数
      sc_uint<60> b;// 定义了一个60位的无符号整型数

      下表列出了sc_int和sc_uint支持的操作类型。

  表2-5 sc_int和sc_uint支持的操作类型

操作类型

操作符 说明
位操作 按位取反。b=~a是将a的各个位取反后赋给b
& 按位与。c=a&b是将ab按位与的结果赋给c
| 按位或。c=a|b是将ab按位或的结果赋给c
^ 按位异或。c=a^b是将ab按位异或的结果赋给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)ab串连起来构成更大的数
范围选择 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
位减操作 and_reduce() a.and_reduce()返回的是a的所有位相与后得到的bool型数
nand_reduce() a.nand_reduce()返回的是a的所有位相与后取反得到的bool型数
or_reduce() a.or_reduce()返回的是a的所有位相或后得到的bool型数
nor_reduce() a.nor_reduce()返回的是a的所有位相或后取反得到的bool型数
xor_reduce() a.xor_reduce()返回的是a的所有位相异或后得到的bool型数
xnor_reduce() a.xor_reduce()返回的是a的所有位相异或后取非得到的bool型数

  下面给出了sc_int和sc_uint使用的例子:

  1. sc_int<32> a,b,c;  
  2. …..  
  3. c=a&b;//a和b按位与的结果赋值给c  
  4. c=a>>4;//将a按位右移4位赋给c  
  5. a+=b;//a和b相加结果赋给a  
  6. cout<<(a,b.range(1,0))<<endl;//将a和b的最低2位串连后输出  
  7.  
  8. sc_log my_data;  
  9. ……  
  10. sc_uint<8> myint;  
  11. mydata = myint[7];//选择myint的最高位赋值给mydata  
  12.  
  13. sc_int<4> x,y;  
  14. sc_int<8> z;  
  15. z=(x,y);//将x和y串连后赋值给z  
  16. x=z.range(7,4);//取z的高4位赋值给x。  
  17. bool temp=x.or_reduce;//将x的各个位相或后得到的bool值赋给temp  

  sc_int和sc_uint可以相互赋值,系统自动完成转换,转换规则如下:当一个无符号整uint1(sc_uint<M>)数被赋值给有符号整数int1(sc_int<N>)时,uint1首先被扩展(高位直接填零)为64位,然后从低位开始取N位赋值给int1。当int1被赋值给uint1时,系统首先将它按符号(负数高位填1,整数填0)扩展为64位,然后从低位开始取M位赋值给uint1。

 下面给出一个例子:

  1. sc_int<8>  int1,int2;  
  2. sc_uint<16> uint1,uint2;  
  3. ……  
  4. uint1=0xFFFF;  
  5. int1=uint1;  
  6. cout<<int1<<endl;  
  7. int2=0xFF;  
  8. uint2=int2;  
  9. cout<<uint2<<endl; 


      输出的结果显示int1=-1(0xFF);uint2=65535(0xFFFF)。
      sc_int和sc_unit可以与C++固有整型数混合使用。


相关文章