joe 发表于 2021-8-21 21:04:19

chisel Vec 向量

如果需要一个集合类型的数据,可以使用scala内建的Array,List,Set,Map等数据结构,另外,还可以
使用chisel专属的Vec(既然是chisel专属的数据结构,那么T必须是Data类型的子类)和Bundle,
Bundle中可以用不同的元素,但Vec中则要求每个元素的类型,位宽必须一样。
从语法角度来看Vec:
package object chisel3包对象下:
object Vec extends VecFactory //这说明Vec类的伴生对象object Vec继承自VecFactory(也叫Vec工厂)
在package chisel3中:
trait VecFactory extends SourceInfoDoc {
def apply(n: Int, gen: T)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Vec = {
    if (compileOptions.declaredTypeMustBeUnbound) {
      requireIsChiselType(gen, "vec type")//说明gen必须要是Vec这种chisel类型
    }
    new Vec(gen.cloneTypeFull, n)
}
...
}
补充:在sealed class Vec private(getn: =>T,val length:Int)类中看到有二个def apply
这两个apply是用来从Vec“集合”中取出元素的方法。
正因为Vec的伴生对象有一个apply工厂方法,它接收二个参数,第一个参数是Int类型,表示元素的个数,第二个
是元素类型,所以,可:
val myVec = Vec(3,UInt(8.W))
一般来说,不要单独定义和处理chisel类型,往往都是用Wire/Input/Output/Reg等硬件类型进行包裹
val myVec = Wire(Vec(3,UInt(8.W)))
在chisel中,还有一个object VecInit,它有一个apply:
def apply(elts:Seq):Vec = macro VecTransform.apply_els
它接收一个Seq作为参数来构造Vec,其中的Seq包括seq,array,list,tuple,queue等集合,多个类型相同的参数
也可以。一般来说,VecInit的这个apply方法的参数,往往字面值的数据作为参数,用于初始化寄存器组,ROM,RAM,
或用来构造多个模块:
val vec1 = VecInit(1.U,2.U,3.U)
val vec2 = VecInit(Seq.fill(8)(0.U(8.W)))
因为Vec也是一种序列,所以它也有map,flatmap,zip,foreach,filter,exists,contains等方法。

还有一个向量,称为混合向量,MixedVec,只不过它包含的可以不全都是一样的,比如位宽不同,它的
工厂方法是通过重复参数或序列来构造的。
val vec1 = MixedVec(UInt(8.W),UInt(16.W))
val vec2 = MixedVec(Array.fill(8)(0.U(8.W)))
val vec3 = MixedVec(Array(UInt(8.W),UInt(12.W),UInt(16.W)))
val vec4 = MixedVec((1 to 10) map { i => UInt(i.W)})

页: [1]
查看完整版本: chisel Vec 向量