为支持任意宽度的比特操作,Syst定义了支持任意宽度的比特向量类型sc_bv<W>,其中W为比特向量的宽度。比特向量适用于只需要2值逻辑向量而不需要算术运算的场合。sc_bv面向比特操作优化,但不支持算术运算,它的仿真速度高于Syst整数类型sc_uint、sc_int、sc_bigint、sc_biguint。
sc_bv支持的操作见下表:
表2-7 sc_bv支持的操作类型
操作类型 |
操作符 | 说明 |
位操作 | ~ | 按位取反。b=~a是将a的各个位取反后赋给b |
& | 按位与。c=a&b是将a与b按位与的结果赋给c | |
| | 按位或。c=a|b是将a与b按位或的结果赋给c | |
^ | 按位异或。c=a^b是将a与b按位异或的结果赋给c | |
>> | 右移位 | |
<< | 左移位 | |
关系运算 | = = | 逻辑等于 |
!= | 逻辑不等于 | |
赋值操作 | &= | 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位 |
位减操作 | 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型数 |
比特向量的赋值需要使用’0’和’1’构成的字符串进行赋值。举例如下:
- sc_bv<6> val;
- val = "110011";
- 下面给出一些比特向量使用的例子:
- sc_bv<8> a,b;
- sc_bv<16> c;
- ……
- sc_bit bit_d;
- a=”11110100”; //对a赋值
- bool temp=a.xor_reduce();//将a的各个位异或后赋值给temp
- b=~a; //将a的各个位取反后赋值给b
- c=(a,b); //将a和b串连后赋值给c
- bit_d=c[15]; //取c的最高位
如果希望将sc_bv类型的数据显示在屏幕上,可以使用to_string()函数,如下面的例子。
sc_bv<16> a;
cout << "a = " << a.to_string()<<endl;
虽然sc_bv不支持算术运算,但是它可以方便的与sc_uint、sc_uint、sc_bigint、sc_biguint进行类型转换,如下面的例子:
sc_bv<4> bv_a;
…..
bv_a=”0000”;
sc_uint temp=a;
a++;
bv_a=a;
……
值得注意的是sc_bv与int直接不能进行相互转换,如下面的代码:
sc_bv<4> bv_a;
…..
bv_a=”0000”;
int temp=a;//错误。没有定义的重载操作
为支持宽度大于1的三态总线建模,SystemC定义了sc_lv<W>,它与sc_bv<W>的区别是它是sc_log类型的向量,因此它支持’0’、’1’、’X’、’Z’ 四值逻辑。sc_lv支持的运算与sc_bv一样,也支持to_string()函数,支持与sc_uint、sc_uint、sc_bigint、sc_biguint之间的相互转换。