• Chisel3


    https://mp.weixin.qq.com/s/Aye-SrUUuIP6_o67Rlt5OQ

     
    全加器
     
    逻辑图如下:
     
    参考链接:
     
     
    1. 引入Chisel3
     
     
    2. 继承自Module类
     
     
    3. 定义输入输出接口
     
    创建输入和输出接口,包括:
    a. 输入接口:加数a/b,输入进位cin;
    b. 输出接口:和数sum, 输出进位cout;
     
    这些接口都是无符号整型数:val a = Input(UInt(1.W))
    a. 使用1.W表示位宽为1位;
    b. 使用UInt创建无符号整型数;
    c. 使用Input/Output表示接口方向;
    d. val 关键字表明定义的变量是所属匿名Bundle子类的数据成员;
     
    4. 内部连接
     
    a. "=" 是Scala的赋值操作符,即方法调用 io.a.^(io.b) 的返回值:
     
    b. ":=" 是Data类的连接方法:
    即如下两行是等价的
    从中也可以看到"<>"是bulkConnect方法,即批量连接;
     
    c. ^ & |也都是方法名;
     
    5. 生成Verilog
     
     
    可以直接点运行符号运行。
     
    也可以使用sbt shell执行:
     
    生成Verilog如下:
     
    6. 测试
     
    参考链接:
     
    创建FullAdderTester.scala:
     
     
    7. 附录
     
    FullAdder.scala:
    import chisel3._
    
    class FullAdder extends Module {
      val io = IO(new Bundle {
        val a    = Input(UInt(1.W))
        val b    = Input(UInt(1.W))
        val cin  = Input(UInt(1.W))
        val sum  = Output(UInt(1.W))
        val cout = Output(UInt(1.W))
      })
    
      // Generate the sum
      val a_xor_b = io.a ^ io.b
      io.sum := a_xor_b ^ io.cin
      // Generate the carry
      val a_and_b = io.a & io.b
      val b_and_cin = io.b & io.cin
      val a_and_cin = io.a & io.cin
      io.cout := a_and_b | b_and_cin | a_and_cin
    }
    
    object Main {
      def main(args: Array[String]): Unit = {
        chisel3.Driver.execute(Array("--target-dir", "generated/FullAdder"), () => new FullAdder)
    //    chisel3.Driver.execute(args, () => new FullAdder)
      }
    }
     
    FullAdderTester.scala:
     
    import chisel3.iotesters.{PeekPokeTester, Driver, ChiselFlatSpec}
    
    class FullAdderTester(c: FullAdder) extends PeekPokeTester(c) {
      for (t <- 0 until 4) {
        val a    = rnd.nextInt(2)
        val b    = rnd.nextInt(2)
        val cin  = rnd.nextInt(2)
        val res  = a + b + cin
        val sum  = res & 1
        val cout = (res >> 1) & 1
        poke(c.io.a, a)
        poke(c.io.b, b)
        poke(c.io.cin, cin)
        step(1)
        expect(c.io.sum, sum)
        expect(c.io.cout, cout)
      }
    }
    
    object FullAdderTester {
      def main(args: Array[String]): Unit = {
        chisel3.iotesters.Driver(() => new FullAdder)(c => new FullAdderTester(c))
      }
    }
     
  • 相关阅读:
    ElasticSearch 2 (1)
    Vagrant (2) —— 基本安装与配置(下)
    Vagrant (1) —— 基本安装与配置(上)
    Vagrant (3) —— 复制/备份Vagrant Box
    vue中$forceUpdate的使用
    vue+ElementUi 选择框选中之后翻页进行状态保持及默认选中
    loonflow 工单系统
    一些后端知识
    前端学习计划
    async/await函数的执行顺序的理解
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10061022.html
Copyright © 2020-2023  润新知