在数字系统建模中常常需要对固定宽度的整型数据进行操作。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使用的例子:
sc_int和sc_uint可以相互赋值,系统自动完成转换,转换规则如下:当一个无符号整uint1(sc_uint<M>)数被赋值给有符号整数int1(sc_int<N>)时,uint1首先被扩展(高位直接填零)为64位,然后从低位开始取N位赋值给int1。当int1被赋值给uint1时,系统首先将它按符号(负数高位填1,整数填0)扩展为64位,然后从低位开始取M位赋值给uint1。
下面给出一个例子:
输出的结果显示int1=-1(0xFF);uint2=65535(0xFFFF)。
sc_int和sc_unit可以与C++固有整型数混合使用。
本文关键字:暂无联系方式电脑-单片机-自动控制,电子学习 - 基础知识 - 电脑-单片机-自动控制