• Chisel3


    https://mp.weixin.qq.com/s/e8vJ8claauBtiuedxYYaJw

     
    实现可以动态索引的表。
     
    参考链接:
    https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/Tbl.scala
     
    1. 引入Chisel3
     
     
    2. 继承自Module类
     
     
    3. 定义输入输出接口
     
    创建各项输入输出接口。
     
    val addr = Input(UInt(8.W))
    a. 使用8.W表示位宽为8位;
    b. 使用UInt创建无符号整型数;
    c. 使用Input/Output表示接口方向;
    d. val 关键字表明定义的变量是所属匿名Bundle子类的数据成员;
     
    4. 内部连接
     
     
    1) 创建一个向量,并赋予初值:
     
     
    其中:Range(0, 256).map(_.asUInt(8.W))
    a. 创建一个[0, 256)的Range,不包含256(exclusive)。
     
    b. 调用Range的map方法,针对Range的每一个元素执行map的参数所指代的方法:
    c. 转换函数f: A => B
     
    定义为:
    _.asUInt(8.W))
     
    其中“_”指代传入的参数,更容易理解的写法为:
    (a) => a.asUInt(8.W))
     
    亦即,针对每一个传入的参数a(这里a是Range内的每一个值),调用a.asUInt(8.W),并将其返回值作为返回值。
     
    2) 索引向量并输出对应值:io.out := r(io.addr)
     
     
    5. 生成Verilog
     
     
    可以直接点运行符号运行。
     
    也可以使用sbt shell执行:
     
    生成Verilog如下:
     
    6. 测试
     
     
     
    7. 附录
     
    Tbl.scala:
    import chisel3._
     
    class Tbl extends Module {
    val io = IO(new Bundle {
    val addr = Input(UInt(8.W))
    val out = Output(UInt(8.W))
    })
    // val r = VecInit(Range(0, 256).map(_.asUInt(8.W)))
    val r = VecInit(Range(0, 8).map((a) => a.asUInt(8.W)))
    io.out := r(io.addr)
    }
     
    object TblMain {
    def main(args: Array[String]): Unit = {
    chisel3.Driver.execute(Array("--target-dir", "generated/Tbl"), () => new Tbl)
    }
    }
     
     
  • 相关阅读:
    android 多渠道打包
    第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
    Android:支持不同分辨率的屏幕设计 .
    动画效果编程基础--AnimationAndroid
    Android使用尺寸资源 dimens .
    android手机分辨率整理
    线程和进程
    js和html的结合方式
    成员变量和局部变量
    MySQL基础知识
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10093526.html
Copyright © 2020-2023  润新知