文章目录
1.1、描述
Vec是一种复合类型,它在一个单一的名称下定义了一组索引信号(任何SpinalHDL基本类型)。
1.2、声明
声明向量的语法如下:
1.2.1、实例
// Create a vector of 2 signed integers
val myVecOfSInt = Vec(SInt(8 bits), 2)
myVecOfSInt(0) := 2
myVecOfSInt(1) := myVecOfSInt(0) + 3
// Create a vector of 3 different type elements
val myVecOfMixedUInt = Vec(UInt(3 bits), UInt(5 bits), UInt(8 bits))
val x, y, z = UInt(8 bits)
val myVecOf_xyz_ref = Vec(x, y, z)
// Iterate on a vector
for(element <- myVecOf_xyz_ref) {
element := 0 // Assign x, y, z with the value 0
}
// Map on vector
myVecOfMixedUInt.map(_ := 0) // Assign all elements with value 0
// Assign 3 to the first element of the vector
myVecOf_xyz_ref(1) := 3
1.3、运算符
Vec类型支持以下运算符:
1.3.1、比较(Comparison)
// Create a vector of 2 signed integers
val vec2 = Vec(SInt(8 bits), 2)
val vec1 = Vec(SInt(8 bits), 2)
myBool := vec2 === vec1 // Compare all elements
1.3.2、类型转换(Type cast)
// Create a vector of 2 signed integers
val vec1 = Vec(SInt(8 bits), 2)
myBits_16bits := vec1.asBits
1.3.3、杂项(Misc)
// Create a vector of 2 signed integers
val vec1 = Vec(SInt(8 bits), 2)
println(vec1.getBitsWidth) // 16
1.3.4、Lib辅助函数(Lib helper functions)
注意:您需要导入 “
spinal.lib._
” 以将这些函数放在作用域中。
import spinal.lib._
// Create a vector with 4 unsigned integers
val vec1 = Vec(UInt(8 bits), 4)
// ... the vector is actually assigned somewhere
val c1: UInt = vec1.sCount(_ < 128) // vec中有多少个值小于128
val c2: UInt = vec1.sCount(0) // vec中有多少个值等于零
val b1: Bool = vec1.sExists(_ > 250) // 有没有大于250的元素
val b2: Bool = vec1.sContains(0) // vec里有零吗?
val u1: UInt = vec1.sFindFirst(_ < 10) // 获取第一个小于10的元素的索引
val u2: UInt = vec1.reduceBalancedTree(_ + _) // 将所有元素相加。
注意:
sXXX
前缀用于消除与接受lambda函数作为参数的同名Scala函数的歧义。
警告:SpinalHDL的定点支持仅部分使用/测试,如果您发现任何错误或认为某些功能缺失,请创建Github问题。此外,请勿在代码中使用未记录的功能。
文章评论