chisel学习笔记
文章平均质量分 87
chisel学习笔记!!!
耐心的小黑
七月份就上班了,比较忙!
展开
-
chisel相比verilog优势之二:高级参数化---diplomacy机制
一、Dipomacy 概论diplomacy是一个chisel开发团队开发的chisel库,主要实现两个功能:1)实现模块之间的参数协商。参数在模块之间传递时可以根据需求协商与检查,更加灵活且不容易出错。2)快速实现设计拓扑的参数化。使用verilog实现设计拓扑的参数化是非常困难的一件事,往往包含着大量的define,容易出错,且写起来困难。dipomacy是怎么做的呢?它是将模块之间的组织关系抽象成一张有向无环图。模块具有结点,相互之间的连接关系是边。如下图所示:将模块A与模块B的bundle原创 2021-10-02 16:56:32 · 2394 阅读 · 0 评论 -
chisel(Rocket Chip)中如何参数化芯片系统
2021.9.5 有些地方添加了一点自己的理解!!!0 绪论前面已经介绍了chisel的初级和高级参数化。如何把这些东西有效的在系统中组织起来呢?如何在系统中快捷的使用他们?这篇文章主要解决这个问题。主要涉及到几个东西,一一介绍吧。原理:trait和cake pattern原理:参数的++级联应用:使用trait和cake pattern构造模块,使用++级联参数作为trait的开关注意的是此处介绍的应用形式只是trait pattern中rocket chip推荐的一种参数组织办法.转载 2021-09-05 14:20:19 · 2142 阅读 · 2 评论 -
scala面向对象基础---类继承和特质
一、特质介绍因为Scala没有多重继承,为了提高代码复用率提出了特质的概念,在定义上它主要有以下几个特点(结合单例对象):特质用关键字“trait”为开头来定义的,它与单例对象很像,两者都不能有入参。但是,单例对象天生就是具体的,特质天生就是抽象的,不过不需要用“abstract”来说明。因为特质是抽象的,所以可以包含抽象成员(成员可以全是抽象,或者全是具体,或者有抽象也有具体),而单例对象却不行。两者都不能用new来实例化,因为特质是抽象的,而单例对象已经是具体的对象。类、单例对象和特质三者一原创 2021-07-30 09:49:52 · 1101 阅读 · 0 评论 -
scala访问修饰符
一、访问修饰符 private,protected,publicScala 访问修饰符有:private,protected,public;如果没有指定访问修饰符,默认情况下,Scala 对象的访问级别都是 public。1、私有(Private)成员用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的class、object或者package内部可见,同样的规则还适用内部类。类的例子package p1{ class A{ private val clas原创 2021-07-26 22:21:56 · 972 阅读 · 0 评论 -
Scala面向对象基础--类和对象
一、类的定义与对象创建在Scala里,类是用关键字“class”开头的代码定义,它是用于创建对象的蓝图。一个类就是一个类型,不同的类就是不同的类型,一个对象的类型就是创建它用的那个类。在类里可以定义val或var类型的变量,它们被称为“字段”;还可以定义函数,它们被称为“方法”;此外还可以定义:常量、类型、对象、特质、类等等,这些在类里定义的东西统称为“成员”。外部想要访问对象的成员时,可以使用句点符号“ . ”,通过“对象.成员”的形式来访问。此外,用new构造出来的对象可以赋给变量,让变量名成为该原创 2021-07-25 20:57:02 · 1290 阅读 · 0 评论 -
chisel 仲裁器Arbiter和队列Queue(ready-valid接口)
一、ready-valid接口Arbiter和Queue都使用了ready-valid接口,该类型的端口在单一数据信号的基础上又添加了ready和valid信号以使用ready-valid握手协议。它包含3个信号:ready:高有效时表示数据接收者consumer已经准备好接收信号,由consumer驱动。valid:高有效时表示数据生产者producer已经准备好待发送的数据了,由producer驱动。bits:是要在producer与consumer之间传输的数据。需要注意的是,valid原创 2021-07-19 10:06:20 · 3295 阅读 · 0 评论 -
chisel(Rocket Chip)中(Site/Here/Up)机制原理(config源码解读)
0 绪论前面已经介绍了chisel的初级和高级参数化。如何把这些东西有效的在系统中组织起来呢?如何在系统中快捷的使用他们?这篇文章主要解决这个问题。主要涉及到几个东西,一一介绍吧。原理:trait和cake pattern原理:参数的++级联应用:使用trait和cake pattern构造模块,使用++级联参数作为trait的开关注意的是此处介绍的应用形式只是trait pattern中rocket chip推荐的一种参数组织办法,实际上还有很多其他组织方式。1 什么是trait和cak原创 2021-07-16 21:56:07 · 2267 阅读 · 1 评论 -
chisel相比verilog优势之二:高级参数化---Site/Here/Up机制
0 前言这篇讲chisel的高级参数化特性。个人感觉chisel相比于verilog优势可以总结为自顶向下的设计思想替代自底向上的设计思路。从参数化上体验尤为明显。高级参数化分为两部分讲,数值的参数化以及拓扑的参数化。说起参数化,我们希望芯片设计中什么样的参数化机制才是好的 ?大致有以下三个方面。可以变化的参数在顶层暴露,便于统一管理增删参数的时候尽量不动源代码参数要方便的查找,并尽量保证不会混用传统的verilog在参数化的时候逐级传递其实一来不利于管理,而来也容易出错。所以chisel转载 2021-07-15 21:40:38 · 2345 阅读 · 0 评论 -
chisel的初级参数化(verilog也可以)
0 简介这篇文章讲chisel的参数化。chisel的参数化东西是比较多的,打算分两次讲,将其分为初级参数化手段以及高级参数化手段,一次初级参数化,然后两篇高级参数化。初级参数化比较简单,但是作为后续内容的理解,还是需要讲一下。其中部分内容直接引用自《Digital Design With Chisel》。初级参数化有两种手段:采用类构造函数的参数化,以及采用类模板的参数化。为什么叫初级参数化?因为其背后的思想和Verilog无区别,都是给每个module传入参数,再例化module即可。1 基于转载 2021-07-15 21:07:07 · 1091 阅读 · 0 评论 -
chisel相比verilog优势之一:复用特性
0 绪论世界由于人这个最大的无厘头变量,还是比技术本身复杂难懂很多。各种技术的兴起与发展总是有其背后的理由的。这篇文章是这个系列的第三篇文章,主要来说明Chisel比Verilog在某些方面具有优势的理由。换句话说。为什么要用Chisel? 它相比于Verilog好在哪儿?在我看来,Chisel相对于Verilog来讲,最大的优势特性有两个:Chisel的代码复用Chisel的设计参数化分两次讲。这次主要讲第一个原因:Chisel的代码复用。对于数字电路来讲,设计模块主要就是设计两个东西:端转载 2021-07-15 21:00:42 · 3519 阅读 · 1 评论 -
chisel的信号名命名机制
一、前言Chisel向来很难可靠地捕捉信号的名称。造成这种情况的原因是:主要依靠反射查找名称使用@chiselName宏,该宏具有不可靠的行为Chisel 3.4引入了一个自定义Scala编译器插件,它允许在声明信号名时实现可靠和自动的捕获。此外,该版本还包括大量使用的一个新的 prefixing API,该API可以更稳定地命名通过函数调用以编程方式生成的信号。二、编译器插件在Chisel 3.4中,我们可以在build.sbt文件中添加上下面这一行,以改善信号的命名。// chisel原创 2021-07-11 17:06:58 · 1328 阅读 · 1 评论 -
chisel Reset的三种类型和同步异步寄存器
一、三种类型介绍从Chisel3.2.0开始,Chisel 3支持同步和异步复位,这意味着我们可以生成同步复位和异步复位寄存器。寄存器的类型取决于与其相关的复位信号的类型。Bool - constructed with Bool(). 同步复位信号AsyncReset - constructed with AsyncReset(). 异步复位信号Reset - constructed with Reset(). 自动推断类型的抽象reset二、类型推断三、隐式的ResetModule原创 2021-07-10 22:32:03 · 2376 阅读 · 1 评论 -
chisel格雷码二进制转换
一、格雷码简介格雷码是一个叫弗兰克*格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码常用于通信,FIFO 或者 RAM 地址寻址计数器中。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为虽然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的 3 转换为 4 时二进制码的每一位都要变,能使数字电路产生原创 2021-06-30 22:21:26 · 988 阅读 · 0 评论 -
chisel Vec/集合及其高阶函数使用(以FIR滤波器为例)
一、FIR Filter现在假设我们需要实现一个FIR滤波器,其实就是实现以下功能:二、系数个数固定的写法class My4ElementFir(b0: Int, b1: Int, b2: Int, b3: Int) extends Module { val io = IO(new Bundle { val in = Input(UInt(8.W)) val out = Output(UInt(8.W)) }) val x_n1 = RegNext(io.in, 0.原创 2021-06-28 14:37:50 · 2756 阅读 · 7 评论 -
chisel可选值/模式匹配实例
一、scala可选值语法可选值就是类型为Option[T]的一个值。其中,Option是标准库里的一个密封抽象类。T可以是任意的类型,例如标准类型或自定义的类。并且T是协变的,简单来说,就是如果类型T是类型U的超类,那么Option[T]也是Option[U]的超类。Option类有一个子类:Some类。通过“Some(x)”可以构造一个Some的对象,其中参数x是一个具体的值。根据x的类型,可选值的类型会发生改变。例如,Some(10)的类型是Option[Int],Some(“10”)的类型是Opt原创 2021-06-28 08:59:39 · 1538 阅读 · 2 评论 -
chisel边沿检测电路实现(Reg延迟特性)
一、代码设计chisel代码import chisel3._import chisel3.util._import chisel3.stage._class EdgeDetect(resetValue: Option[UInt] = None) extends Module { val io = IO(new Bundle { val in = Input(UInt(1.W)) val pos = Output(UInt(1.W))原创 2021-06-27 21:25:33 · 766 阅读 · 0 评论 -
chisel有限状态机(FSM)书写方法
状态机也是常用电路,但是Chisel没有直接构建状态机的原语。不过,chisel3.util包里定义了一个Enum特质及其伴生对象。伴生对象里的apply方法定义如下:def apply(n: Int): List[UInt]它会根据参数n返回对应元素数的List[UInt],每个元素都是不同的,所以可以作为枚举值来使用。最好把枚举状态的变量名也组成一个列表,然后用列表的模式匹配来进行赋值。有了枚举值后,可以通过“switch…is…is”语句来使用。其中,switch里是相应的状态寄存器,而每个i原创 2021-06-26 10:43:02 · 1299 阅读 · 0 评论 -
chisel使用自定义/标准库中的函数简化设计(更新)
函数是编程语言的常用语法,即使是Verilog这样的硬件描述语言,也会用函数来构建组合逻辑。对于Chisel这样的高级语言,函数的使用更加方便,还能节省不少代码量。不管是用户自己写的函数、Chisel语言库里的函数还是Scala标准库里的函数,都能帮助用户节省构建电路的时间。一、用函数抽象组合逻辑与Verilog一样,对于频繁使用的组合逻辑电路,可以定义成Scala的函数形式,然后通过函数调用的方式来使用它。这些函数既可以定义在某个单例对象里,供多个模块重复使用,也可以直接定义在电路模块里。例如://原创 2021-06-21 20:01:51 · 1665 阅读 · 0 评论 -
chisel多时钟域设计(注释)
在数字电路中免不了用到多时钟域设计,尤其是设计异步FIFO这样的同步元件。在Verilog里,多时钟域的设计很简单,只需声明多个时钟端口,然后不同的always语句块根据需要选择不同的时钟作为敏感变量即可。在Chisel里,则相对复杂一些,因为这与Scala的变量作用域相关,而且时序元件在编译时都是自动地隐式跟随当前时钟域。本章将介绍多时钟域设计的语法,这其实很简单。一、没有隐式端口的模块继承自Module的模块类会获得隐式的全局时钟与同步复位信号,即使在设计中用不上它们也没关系。如果读者确实转载 2021-06-21 19:10:14 · 1510 阅读 · 0 评论 -
chisel黑盒(调用verilog书写的模块)
因为Chisel的功能相对Verilog来说还不完善,所以设计人员在当前版本下无法实现的功能,就需要用Verilog来实现。在这种情况下,可以使用Chisel的BlackBox功能,它的作用就是向Chisel代码提供了用Verilog设计的电路的接口,使得Chisel层面的代码可以通过模块的端口来进行交互。一、例化黑盒如果读者尝试在Chisel的模块里例化另一个模块,然后生成Verilog代码,就会发现端口名字里多了“io_”这样的字眼。很显然,这是因为Chisel要求模块的端口都是由字段“io”来引用转载 2021-06-21 17:26:15 · 2600 阅读 · 5 评论 -
chisel打印函数(printf/println)使用详解(更新)
主体内容摘自:https://blog.csdn.net/qq_34291505/article/details/87905379?spm=1001.2014.3001.5501一、chisel的printf 基本介绍Chisel提供了一个“ printf ”函数来打印信息,用于电路调试。它有Scala和C两种风格。如果在when语句块里,只有条件成立时才运行。隐式的全局复位信号有效时也不会触发。printf函数会转换成Verilog的系统函数“$fwrite”,包含在宏定义块“ ifndef SYN原创 2021-06-25 14:43:09 · 2832 阅读 · 3 评论 -
chisel生成Verilog与基本测试(更新)
主体内容摘自:https://blog.csdn.net/qq_34291505/article/details/87880730经过前三章的内容,读者已经了解了如何使用Chisel构建一个基本的模块。本章的内容就是在此基础上,把一个Chisel模块编译成Verilog代码,并进一步使用Verilator做一些简单的测试。一、生成Verilog前面介绍Scala的内容里说过,Scala程序的入口是主函数。所以,生成Verilog的程序自然是在主函数里例化待编译的模块,然后运行这个主函数。例化待编译模原创 2021-06-21 16:27:02 · 6707 阅读 · 3 评论 -
chisel常用的硬件原语(更新)
主体内容摘自:https://blog.csdn.net/qq_34291505/article/details/87862433前两章介绍了基本的数据类型和硬件类型,已经足够编写基本的小规模电路。至于要如何生成Verilog,会在后续章节讲解。如果要编写大型电路,当然也可以一砖一瓦地搭建,但是费时费力,完全体现不出软件语言的优势。Chisel在语言库里定义了很多常用的硬件原语,读者可以直接导入相应的包来使用。让编译器多干活,让程序员少费力。一、多路选择器因为多路选择器是一个很常用的电路模块,所以Ch原创 2021-06-21 15:30:17 · 3734 阅读 · 1 评论 -
chisel数据类型和硬件类型的联系与区别(更新)
主体内容摘自:https://blog.csdn.net/qq_34291505/article/details/87714172之前介绍过Chisel的数据类型,其中常用的就五种:UInt、SInt、Bool、Bundle和Vec[T]。硬件类型最基本的是IO、Wire和Reg三种,还有指明端口方向的Input、Output和Flipped。数据类型必须配合硬件类型才能使用,它不能独立存在,因为编译器只会把硬件类型生成对应的Verilog代码。从语法规则上来讲,这两种类型也有很大的区别,编译器会原创 2021-06-25 13:20:10 · 1250 阅读 · 1 评论 -
chisel线网(wire)和寄存器(reg)详解(更新)
主体内容摘自:https://blog.csdn.net/qq_34291505/article/details/87714172在Verilog里,模块内部主要有“线网(wire)”和“四态变量(reg)”两种硬件类型,它们用于描述数字电路的组合逻辑和时序逻辑。在Chisel里,也按这个思路定义了一些硬件类型,包括基本的线网和寄存器。在verilog中我们经常会对线网和寄存器赋值,以完成信号的传递或者电路的连接。在chisel中也是,线网和寄存器最常见的操作都是被赋值,因为只有这样我们才能实现各种我原创 2021-06-25 13:43:55 · 5857 阅读 · 1 评论 -
chisel端口(IO)与模块(Module)使用详解(更新)
一、端口(类似于verilog中的input、output)Ⅰ、定义端口列表定义一个模块前一定要先定义好端口。整个端口列表是由方法“IO[T <: Data](iodef: T)”来定义的,通常其参数是一个Bundle类型的对象,而且引用的字段名称必须是“io”。因为端口存在方向,所以还需要方法“Input[T <: Data](source: T)”和“Output[T <: Data](source: T)”来为每个端口表明具体的方向。注意,“Input[T <: Data]原创 2021-06-25 13:02:38 · 3595 阅读 · 1 评论 -
chisel常见数据类型详解(更新)
以下内容均摘自:https://blog.csdn.net/qq_34291505一、Chisel的常见问题在学习Chisel前,应该熟悉一些常见问题,这些问题在编写Chisel的任何时候都应该牢记。①Chisel是寄宿在Scala里的语言,所以它本质还是Scala。为了从Chisel转变成Verilog,语言开发人员开发了一个中间的标准交换格式——Firrtl,它跟Vrilog是同一级别的,两者都比Chisel低一级。编写的Chisel代码首先会经过Firrtl编译器,生成Firrtl代码,也就是一原创 2021-02-18 13:08:33 · 6864 阅读 · 1 评论 -
详细介绍如何在linux中配置chisel环境
一、安装java和scala1、安装java安装javasudo apt install openjdk-11-jre-headless安装javacsudo apt install openjdk-11-jdk-headless测试是否安装成功:java --version或javac --version2、安装scala1)下载传送门:https://www.scala-lang.org/download/2.12.12.html2)解压缩文件包,可将其移动至/usr/l原创 2021-06-18 00:26:12 · 3118 阅读 · 3 评论 -
scala重点知识点总结
以下内容均摘自:https://blog.csdn.net/qq_34291505一、Scala基本数据类型Scala是静态语言,在编译期间会检查每个对象的类型。对于类型不匹配的非法操作,在编译时就能被发现。对于动态语言而言,这种非法操作需要等到运行时才能被发现,此时可能造成严重错误。所以,静态语言相比诸如Python这样的动态语言在某些方面是有优势的。对于Chisel而言,我们就需要这种优势。因为Chisel需要编译成Verilog,我们不能产生非法的Verilog语句并且等到模块运行时才去发现它。原创 2021-02-18 11:23:53 · 1613 阅读 · 1 评论 -
新型敏捷硬件设计语言---Chisel初识
一、最好的宿主——什么是Scala“如果今天我要选用Java之外的一门语言,我将会选择Scala。” —— James Gosling,Java之父在今天众多的编程语言中,Java常常是软件开发者的首选语言。而能让Java之父给出如此评价的Scala,想必有其吸引人之处。那么,Scala究竟是一门什么样的语言呢?Scala是一门基于JVM(Java Virtual Machine)运行的语言,而且它与Java互相兼容,在设计之初就考虑了与Java的无缝衔接,两者能互相调用。但是它的设计者的目的,是转载 2021-02-18 08:54:32 · 6032 阅读 · 2 评论