https://mp.weixin.qq.com/s/X5EStKor2DU0-vS_wIO-fg
四位加法器。通过FullAdder级联实现。
参考链接:
https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/Adder4.scala
1. 引入Chisel3
2. 继承自Module类
3. 定义输入输出接口
创建输入和输出接口;
.W))
a. 使用4.W表示位宽为4位;
b. 使用UInt创建无符号整型数;
c. 使用Input/Output表示接口方向;
关键字表明定义的变量是所属匿名Bundle子类的数据成员;
4. 内部连接
创建4个全加器,并与输入和输出接口相连。
最终的和(Sum)由4个全加器的和组合而成:
sum
)
)
).asUInt
这里为什么使用组合呢?
还有其他两种写法:
a. 直接连接io.Sum的每一位:
sum
sum
sum
sum
这种写法会报异常:对io.Sum(0)会调用:
返回的并不是Sum的第0位,而是新建的已经做了ReadOnlyBinding的Bool()。
而不能作为左值),即只能作为“:=”方法的参数。
b. 到最后统一组合一次:
.asUInt()
这样做是可以的,我认为这种写法更好。只是生成的Verilog不如人意:
生成了三个组合,而不是直接一个组合。
5. 生成Verilog
可以直接点运行符号运行。
也可以使用sbt shell执行:
生成Verilog如下:
略
6. 测试
参考链接:
https://github.com/ucb-bar/chisel-tutorial/blob/release/src/test/scala/examples/Adder4Tests.scala
略
7. 附录
Adder4.scala:
import chisel3._ import chisel3.util._ //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.Sum := Cat(Adder3.io.sum, Adder2.io.sum, Adder1.io.sum, Adder0.io.sum) io.Cout := Adder3.io.cout } object Adder4Main { def main(args: Array[String]): Unit = { chisel3.Driver.execute(Array("--target-dir", "generated/Adder4"), () => new Adder4) // chisel3.Driver.execute(args, () => new FullAdder) } }