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是将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使用的例子:
- sc_int<32> a,b,c;
- …..
- c=a&b;//a和b按位与的结果赋值给c
- c=a>>4;//将a按位右移4位赋给c
- a+=b;//a和b相加结果赋给a
- cout<<(a,b.range(1,0))<<endl;//将a和b的最低2位串连后输出
- sc_log my_data;
- ……
- sc_uint<8> myint;
- mydata = myint[7];//选择myint的最高位赋值给mydata
- sc_int<4> x,y;
- sc_int<8> z;
- z=(x,y);//将x和y串连后赋值给z
- x=z.range(7,4);//取z的高4位赋值给x。
- 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。
下面给出一个例子:
- sc_int<8> int1,int2;
- sc_uint<16> uint1,uint2;
- ……
- uint1=0xFFFF;
- int1=uint1;
- cout<<int1<<endl;
- int2=0xFF;
- uint2=int2;
- cout<<uint2<<endl;
输出的结果显示int1=-1(0xFF);uint2=65535(0xFFFF)。
sc_int和sc_unit可以与C++固有整型数混合使用。