1.模块与端口操作

  • Chisel语言概述
    • 敏捷型开发语言
    • 学习资料以及链接
    • 端口及模块连接
      • 端口声明
    • Switch结构
    • 批量连接端口
    • 使用Module中使用函数

Chisel语言概述

Chisel 是一门敏捷型的硬件描述语言,在近些年越来越火,网络上的学习资源也较为丰富。最近由于项目需求,需要入门Chisel,同时在CSDN记录自己的心得。

敏捷型开发语言

何为敏捷型开发语言呢?换言之可以提升效率的语言。Chisel可以认为是为了提高Verilog这一传统硬件描述语言而设计开发的,最早诞生于伯克利的一个实验室,并且接受了流片的检验,在企业界包括华为海思在内的公司都开始使用这一语言来进行开发,学术界中科院的包云岗教授团队已经在“一人一芯”计划中使用Chisel来开发,并设计了一套验证评估工具,用来开发,据报道15万行得的Verilog语句,只需要大概3万行Chisel语言句即可实现。据笔者了解,Chisel语言可以用更高级的语法结构来生成Veilog代码,相当于是比Verilog高一个层次的代码,但是控制的粒度相对于HLS(高层次综合语言)来说又要更细化一些,因此生成的中间代码具有更好的可读性,硬件资源的控制更好一些。

即控制粒度:
HLS>Chisel>Verilog

目前学术界十分关注这一语言,相信未来这一语言将会获得更大的关注度。

学习资料以及链接

1.官方文档Chisel_Book.pdf(英文版),博客的主要依据
2.官方文档Chisel_Book.pdf(中文版)
3.一个学习资源总结

端口及模块连接

入门介绍的坑后面来补,今天先直接开始上手模块,端口声明的例子如下

端口声明


使用下面代码声明如下模块,按照自底向上的层次实现封装;

class CompA extends Module {val io = IO(new Bundle {//每一个Module都需要含有IO()用于定义端口,//IO可以使用 new Bundle()初始化val a = Input(UInt (8.W))//Bundle可以理解为一个逻辑约束,其中可以用Input与Output来//说明是输入或是输出val b = Input(UInt (8.W))val x = Output(UInt (8.W))val y = Output(UInt (8.W))})
// function of A
}
class CompB extends Module {val io = IO(new Bundle {val in1 = Input(UInt (8.W))val in2 = Input(UInt (8.W))val out = Output(UInt (8.W))})
// function of B
}
class CompC extends Module {val io = IO(new Bundle {val in_a = Input(UInt (8.W))val in_b = Input(UInt (8.W))val in_c = Input(UInt (8.W))val out_x = Output(UInt (8.W))val out_y = Output(UInt (8.W))})// create components A and Bval compA = Module(new CompA ())//在高级层级的模块中直接使用new初始化一个已经声明好的模块val compB = Module(new CompB ())//Chisel的简洁性的体现// connect AcompA.io.a := io.in_a//使用初始的对象操作定义好的端口compA.io.b := io.in_bio.out_x := compA.io.x// connect BcompB.io.in1 := compA.io.ycompB.io.in2 := io.in_cio.out_y := compB.io.out
}
class CompD extends Module {val io = IO(new Bundle {val in = Input(UInt (8.W))val out = Output(UInt (8.W))})
// function of D
}
class TopLevel extends Module {val io = IO(new Bundle {val in_a = Input(UInt (8.W))val in_b = Input(UInt (8.W))val in_c = Input(UInt (8.W))val out_m = Output(UInt (8.W))val out_n = Output(UInt (8.W))})// create C and Dval c = Module(new CompC ())val d = Module(new CompD ())// connect Cc.io.in_a := io.in_ac.io.in_b := io.in_bc.io.in_c := io.in_cio.out_m := c.io.out_x// connect Dd.io.in := c.io.out_yio.out_n := d.io.out
}

Switch结构

需要调用

import chisel3.util._

在使用语句之前,如下的代码可以实现一个四路选择器

class Alu extends Module {val io = IO(new Bundle {val a = Input(UInt (16.W))val b = Input(UInt (16.W))val fn = Input(UInt (2.W))val y = Output(UInt (16.W))
})
// some default value is needed
io.y := 0.U
// The ALU selection
switch(io.fn) {is (0.U) { io.y := io.a + io.b }is (1.U) { io.y := io.a - io.b }is (2.U) { io.y := io.a | io.b }is (3.U) { io.y := io.a & io.b }}
}

批量连接端口

Chisel另外一点方便敏捷性设计的特点来自于 <> 运算符,可以十分便捷地实现模块之间的连接。使用的要求必须是

class Fetch extends Module {val io = IO(new Bundle {val instr = Output(UInt (32.W))val pc = Output(UInt (32.W))})// ... Implementation od fetch
}class Decode extends Module {val io = IO(new Bundle {val instr = Input(UInt (32.W))val pc = Input(UInt (32.W))val aluOp = Output(UInt (5.W))val regA = Output(UInt (32.W))val regB = Output(UInt (32.W))})// ... Implementation of decode
}class Execute extends Module {val io = IO(new Bundle {val aluOp = Input(UInt (5.W))val regA = Input(UInt (32.W))val regB = Input(UInt (32.W))val result = Output(UInt (32.W))})// ... Implementation of execute
}class TopLevel extends Module{val fetch = Module(new Fetch ())val decode = Module(new Decode ())val execute = Module(new Execute)fetch.io <> decode.iodecode.io <> execute.ioio <> execute.io
}

TopLevel可以实现将子模块便捷地联系起来,模块之间的关系调用
更为明显。

使用Module中使用函数

在一个Module中可以使用如下的函数声明来简化端口:

def adder (x: UInt , y: UInt) = {x + y
}val x = adder(a, b)
// another adder
val y = adder(c, d)

可以使用函数声明来调用寄存器的操作

def delay(x: UInt) = RegNext(x)val delOut = delay(delay(delIn))

1.入门Chisel心得与笔记:模块与端口操作相关推荐

  1. FFmpeg从入门到精通读书笔记(1)

    笔者才开始学习音视频开发,FFmpeg从入门到精通读书笔记系列主要是基于阅读刘歧.赵文杰编著的<FFmpeg从入门到精通>以及雷霄骅博士博客总结写的入门心得体会. 官方文档资料 FFmpe ...

  2. python基础学习[python编程从入门到实践读书笔记(连载一)]

    写在前面:本文来自笔者关于<python编程从入门到实践>的读书笔记与动手实践记录. 程序员之禅 文章目录 02变量和简单数据类型 03 列表简介 04 操作列表 05 if语句 06 字 ...

  3. 深度学习入门之PyTorch学习笔记:卷积神经网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 4.1 主要任务及起源 4.2 卷积神经网络的原理和结构 4.2.1 卷积层 1. ...

  4. 深度学习入门之PyTorch学习笔记:深度学习框架

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 2.1 深度学习框架介绍 2.1.1 TensorFlow 2.1.2 Caffe 2.1.3 Theano 2.1.4 ...

  5. [Matlab]入门教程基础向笔记(B站视频)

    [Matlab]入门教程基础向笔记(B站视频) 快捷操作 clc:清除命令行窗口历史操作 用⬆(上箭头)表示快捷输入上一段代码 计算细节 矩阵相乘 A*B:表示现代中的相乘运算 A.B:表示各个数字分 ...

  6. python web开发入门_python大佬整理的python web开发从入门到精通学习笔记

    原标题:python大佬整理的python web开发从入门到精通学习笔记 Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通 ...

  7. 深度学习入门之PyTorch学习笔记:多层全连接网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 3.1 PyTorch基础 3.2 线性模型 3.2.1 问题介绍 3.2.2 一维线性回归 3.2 ...

  8. 深度学习入门之PyTorch学习笔记:深度学习介绍

    深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...

  9. 深度学习入门之PyTorch学习笔记

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 5 循环神经网络 6 生成对抗网络 7 深度学习实战 参考资料 绪论 深度学习如今 ...

最新文章

  1. 数据库字段名不统一的教训
  2. Linux 命令之 chmod -- 改变文件或目录权限
  3. 模拟恶劣网络环境常用的几种解决方案
  4. OpenGL基础10:变换
  5. 2021-1-31linux学习纪要
  6. Activemq 下载地址
  7. 电脑编程工作工资多少?
  8. 【STM32技巧】HX711称重芯片详细说明
  9. 最新小程序反编译的获取流程
  10. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
  11. 关于惠普系列电脑无法开机以及其他问题解决的总结
  12. 微信小程序OnPullDownRefresh下拉刷新不触发问题
  13. 编写Makefile
  14. 启动本地mysql的几种方式
  15. Core Telephony
  16. 【回归预测-BP预测】基于灰狼算法优化BP神经网络实现数据回归预测附matlab代码
  17. flash 位图缓冲
  18. 利用pandas整理订单,并根据地址对比进行分类
  19. 掘金量化如何运行策略
  20. 基因数据处理50之cs-bwamem、bwa、snap、bwa-mem与art比较

热门文章

  1. 无线产品的多种无线加密方式及其区别
  2. 小白学python(爬虫知识3(数据保存xlwt)
  3. linux权限不够tee,Linux Tee命令
  4. 如何实现传统物业到智慧社区的转型?
  5. SSH登录慢的解决方案(例如等待很久才提示输入密码)
  6. [树形dp] Jzoj P5814 树
  7. Android使用adb安装和覆盖安装apk
  8. list-style
  9. Mac VirtualBox设置虚拟机网络
  10. macports 安装php,「macports」MacOS 中 MacPorts 安装和使用 - 金橙教程网