Chisel 语言学习 2 实例化模型和向量操作
系列文章主要用来记录学习Chisel和scala过程中遇到的难点或知识点
实例化模型:
带有进位的加法器
Chisel代码如下:
// A 4-bit adder with carry in and carry out
class Adder4 extends Module {
val io = IO(new Bundle {
val A = Input(UInt(4.W))
val B = Input(UInt(4.W))
val Cin = Input(UInt(1.W))
val Sum = Output(UInt(4.W))
val Cout = Output(UInt(1.W))
})
// Adder for bit 0
val Adder0 = Module(new FullAdder())
Adder0.io.a := io.A(0)
Adder0.io.b := io.B(0)
Adder0.io.cin := io.Cin
val s0 = Adder0.io.sum
// Adder for bit 1
val Adder1 = Module(new FullAdder())
Adder1.io.a := io.A(1)
Adder1.io.b := io.B(1)
Adder1.io.cin := Adder0.io.cout
val s1 = Cat(Adder1.io.sum, s0)
// Adder for bit 2
val Adder2 = Module(new FullAdder())
Adder2.io.a := io.A(2)
Adder2.io.b := io.B(2)
Adder2.io.cin := Adder1.io.cout
val s2 = Cat(Adder2.io.sum, s1)
// Adder for bit 3
val Adder3 = Module(new FullAdder())
Adder3.io.a := io.A(3)
Adder3.io.b := io.B(3)
Adder3.io.cin := Adder2.io.cout
io.Sum := Cat(Adder3.io.sum, s2).asUInt
io.Cout := Adder3.io.cout
}
向量操作
val myVec = Vec(Seq.fill( <number of elements> ) { <data type> })
eg:
val ufix5_vec10 := Vec(Seq.fill(10) { UInt(5.W) })
定义一个向量寄存器:
val reg_vec32 = Reg(Vec(Seq.fill(32){ UInt() }))
定义一个16位加法器(向量的值包含实例时,我们用io来定义):
val FullAdders =
Vec(Seq.fill(16){ Module(new FullAdder()).io })
为了使代码简洁,我们可以用下面这种写法:
val initValues = Seq.fill(4) { 0.U(8.W) }
val delays = RegInit(Vec(initValues))