Bits:初始化
Bits意味这一组有Bool类型组成的向量,类似与我们在Verilog中的多比特位宽变量。在SpinalHDL中,声明一个Bits变量可采用如下形式(“[]”中为可选项):
相较于Veriog,Bits变量的初始化给了更多灵活的方式用于针对不同的场景:
操作符
针对Bits变量,SpinalHDL提供了一系列的操作运算符,如下表所示:
这里值得注意的是:&、|、^操作符中x,y的宽度必须保持一致,否则在生成RTL代码时将提示不能正常编译(可使用resized方法自动扩展剪裁位宽),相当于把RTL中的位宽不匹配警报消除在设计阶段。
对于逻辑右移操作,同时x>>y,y变量类型的不同所产生的结果也不同,看下述代码:
其生成的RTL代码为:
可以看到 ,data_out1位宽为13个bit,而data_out2位宽为16个比特。结合定义,对比可以看出:若y为Int类型(scala原生类型),所谓的移位操作更像是截断处理,而若y为UInt类型,则和Verilog中的移位操作含义基本相同。此外,虽然生成的RTL代码里采用的是>>>,但由于是无符号数,故而与逻辑右移相同。
由于SpinalHDL会检测":="左右两侧位宽是否相同,所以若在编写时使用错误在生成rtl时即可发现,不会等到仿真时摸不着头脑。
比较操作符
比较操作符Bits变量和Bool变量相同:
类型转换
Bits类型可以与其他类型之间进行相互转换,SpinalHDL提供的方法如下:
部分赋值/提取操作符
与Verilog/Systemverilog相同,Bits也支持部分读取/赋值操作:
对于x(offset,width bits),其意味着从offset比特位开始,向上截取width比特位宽,上述示例第5行等效于myBits2:=myBits(3 downto 2)。
其他方法
为方便代码设计,SpinalHDL针对Bits也提供了一些其他方法:
原作者:玉骐
|