risc-v中文社区

 找回密码
 立即注册
查看: 1240|回复: 0

[原创] chisel Vec 向量

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-21 21:04:19 | 显示全部楼层 |阅读模式
如果需要一个集合类型的数据,可以使用scala内建的Array,List,Set,Map等数据结构,另外,还可以
使用chisel专属的Vec[T](既然是chisel专属的数据结构,那么T必须是Data类型的子类)和Bundle,
Bundle中可以用不同的元素,但Vec[T]中则要求每个元素的类型,位宽必须一样。
从语法角度来看Vec:
package object chisel3包对象下:
object Vec extends VecFactory //这说明Vec类的伴生对象object Vec继承自VecFactory(也叫Vec工厂)
在package chisel3中:
trait VecFactory extends SourceInfoDoc {
  def apply[T <: Data](n: Int, gen: T)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Vec[T] = {
    if (compileOptions.declaredTypeMustBeUnbound) {
      requireIsChiselType(gen, "vec type")  //说明gen必须要是Vec这种chisel类型
    }
    new Vec(gen.cloneTypeFull, n)
  }
  ...
}
补充:在sealed class Vec[T<ata] private[chisel3](getn: =>T,val length:Int)类中看到有二个def apply
这两个apply是用来从Vec“集合”中取出元素的方法。
正因为Vec[T]的伴生对象有一个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[T],它有一个apply:
def apply[T<ata](elts:Seq[T]):Vec[T] = macro VecTransform.apply_els
它接收一个Seq[T]作为参数来构造Vec,其中的Seq[T]包括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[T]也是一种序列,所以它也有map,flatmap,zip,foreach,filter,exists,contains等方法。

还有一个向量,称为混合向量,MixedVec[T],只不过它包含的可以不全都是一样的,比如位宽不同,它的
工厂方法是通过重复参数或序列来构造的。
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)})

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-4 13:52 , Processed in 0.022310 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表