您当前的位置:五五电子网电子知识电子学习基础知识电脑-单片机-自动控制SystemC-sc_int和sc_uint 正文
SystemC-sc_int和sc_uint

SystemC-sc_int和sc_uint

点击数:7137 次   录入时间:03-24 09:00:52   整理:http://www.55dianzi.com   电脑-单片机-自动控制

      在数字系统建模中常常需要对固定宽度的整型数据进行操作。C++的固有数据类型int的宽度是与所使用的机器有关的,但通常是32位的。使用C++固有数据类型显然可以提高仿真速度,但只能实现对8/16/32位的数据的操作,为此,SystEMC中引入了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。

      SystEMC使用模板类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是将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 位减操作 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_logIC 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++固有整型数混合使用。




本文关键字:暂无联系方式电脑-单片机-自动控制电子学习 - 基础知识 - 电脑-单片机-自动控制