1.入门Chisel心得与笔记:模块与端口操作
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心得与笔记:模块与端口操作相关推荐
- FFmpeg从入门到精通读书笔记(1)
笔者才开始学习音视频开发,FFmpeg从入门到精通读书笔记系列主要是基于阅读刘歧.赵文杰编著的<FFmpeg从入门到精通>以及雷霄骅博士博客总结写的入门心得体会. 官方文档资料 FFmpe ...
- python基础学习[python编程从入门到实践读书笔记(连载一)]
写在前面:本文来自笔者关于<python编程从入门到实践>的读书笔记与动手实践记录. 程序员之禅 文章目录 02变量和简单数据类型 03 列表简介 04 操作列表 05 if语句 06 字 ...
- 深度学习入门之PyTorch学习笔记:卷积神经网络
深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 4.1 主要任务及起源 4.2 卷积神经网络的原理和结构 4.2.1 卷积层 1. ...
- 深度学习入门之PyTorch学习笔记:深度学习框架
深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 2.1 深度学习框架介绍 2.1.1 TensorFlow 2.1.2 Caffe 2.1.3 Theano 2.1.4 ...
- [Matlab]入门教程基础向笔记(B站视频)
[Matlab]入门教程基础向笔记(B站视频) 快捷操作 clc:清除命令行窗口历史操作 用⬆(上箭头)表示快捷输入上一段代码 计算细节 矩阵相乘 A*B:表示现代中的相乘运算 A.B:表示各个数字分 ...
- python web开发入门_python大佬整理的python web开发从入门到精通学习笔记
原标题:python大佬整理的python web开发从入门到精通学习笔记 Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通 ...
- 深度学习入门之PyTorch学习笔记:多层全连接网络
深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 3.1 PyTorch基础 3.2 线性模型 3.2.1 问题介绍 3.2.2 一维线性回归 3.2 ...
- 深度学习入门之PyTorch学习笔记:深度学习介绍
深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...
- 深度学习入门之PyTorch学习笔记
深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 5 循环神经网络 6 生成对抗网络 7 深度学习实战 参考资料 绪论 深度学习如今 ...
最新文章
- 数据库字段名不统一的教训
- Linux 命令之 chmod -- 改变文件或目录权限
- 模拟恶劣网络环境常用的几种解决方案
- OpenGL基础10:变换
- 2021-1-31linux学习纪要
- Activemq 下载地址
- 电脑编程工作工资多少?
- 【STM32技巧】HX711称重芯片详细说明
- 最新小程序反编译的获取流程
- 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
- 关于惠普系列电脑无法开机以及其他问题解决的总结
- 微信小程序OnPullDownRefresh下拉刷新不触发问题
- 编写Makefile
- 启动本地mysql的几种方式
- Core Telephony
- 【回归预测-BP预测】基于灰狼算法优化BP神经网络实现数据回归预测附matlab代码
- flash 位图缓冲
- 利用pandas整理订单,并根据地址对比进行分类
- 掘金量化如何运行策略
- 基因数据处理50之cs-bwamem、bwa、snap、bwa-mem与art比较