自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

github-3rr0r的博客

计算机体系结构,CPU设计实现,Chisel,以及摸鱼

  • 博客(58)
  • 收藏
  • 关注

原创 吃透Chisel语言.40.Chisel实战之单周期RISC-V处理器实现(下)——具体实现和最终测试

上一篇文章中我们对本项目的需求进行了分析,并得到了初步的设计,这一篇文章我们就可以基于该设计来实现我们的单周期RISC-V处理器了。实现之后也必须用实际代码来测试一下,至少也得能运行递归版本的斐波那契数列计算。完整项目代码可以在本人的Github仓库获取:[github-3rr0r/RV32ISC: A RISC-V RV32I ISA Single Cycle CPU](https://github.com/github-3rr0r/RV32ISC)。接下来我们直接进入正题!

2022-12-18 12:56:29 3956 9

原创 吃透Chisel语言.39.Chisel实战之单周期RISC-V处理器实现(上)——需求分析和初步设计

首先明确我们要做的是什么,这个在标题里面已经说明了,我们要做的是一个单周期RISC-V处理器。但光是个短语不足以支撑我们开展项目,我们需要对项目目标做进一步的明确,也就是需求分析。需求分析结束之后,就可以开始我们的初步设计了!

2022-12-14 18:04:04 2394 1

原创 吃透Chisel语言.38.Chisel实战之以FIFO为例(三)——几种FIFO的变体的Chisel实现

上一篇文章对实现串口通信的最小系统做了简单阐述,然后从发送端开始,实现了基于单字节FIFO缓冲区的发送端,接着类似地实现了接收端,最后将二者综合在一起,实现了发送“Hello World!”信息的串口通信demo。虽然代码量相对之前来说多了很多,但是因为模块化设计且利用了Chisel的特性,因此条理也很清晰。这一篇文章,我们继续实现FIFO队列的几种变体,进一步实践Chisel开发。...

2022-08-12 00:10:02 1655 6

原创 吃透Chisel语言.37.Chisel实战之以FIFO为例(二)——基于FIFO的串口通信:串口发送“Hello World!”

上一篇文章介绍了FIFO Buffer的概念,然后用Chisel实现了单Buffer的FIFO,接着又用单Buffer实现了完整的FIFO Buffer,即气泡Buffer。这种方法很简单,在数据率低于时钟频率的时候很好用,比如在作为串口的解耦合缓冲区的时候,这一篇文章就会介绍如何基于FIFO实现串口并实现串口发送“Hello World!”。...

2022-08-10 15:01:47 1351

原创 吃透Chisel语言.36.Chisel实战之以FIFO为例(一)——FIFO Buffer和Bubble FIFO的Chisel实现

这一部分,我们将以FIFO以及FIFO的各种变体为例,进行Chisel数字设计的实战。这一部分的实战会以小规模的数字设计为例,比如一个FIFO Buffer,它是大规模数字设计中的常用构件块。再比如串行接口(串口),它本身也可以用到FIFO Buffer。这一篇文章就从最基本的FIFO Buffer开始。...

2022-08-08 23:31:35 1548 7

原创 吃透Chisel语言.35.Chisel进阶之硬件生成器(四)——利用函数式编程特性

上一篇文章我们提取了之前实现的几种tick生成模块的共同特征,利用Chisel的面向对象编程特性,实现了一个抽象类`Ticker`。对于这个`Ticker`,我们通过继承的方法实现了几种不同的版本,还可以用统一的测试接口对这些版本进行测试,整个代码清晰了很多,对于实现和测试成本也小了很多。Scala作为支持函数式编程的语言,Chisel自然也可以利用函数式编程的特性,这一篇文章我们就共同学习利用函数式编程的硬件生成。...

2022-08-08 13:43:13 1187 4

原创 吃透Chisel语言.34.Chisel进阶之硬件生成器(三)——利用面向对象编程特性:以Ticker为例

上一篇文章中,我们利用了Scala中的IO操作、循环以及序列上的`map`函数轻松实现了Chisel逻辑表的生成,效率远高于用Verilog或VHDL和其他脚本语言配合使用。不过Scala作为一种高级编程语言,其面向对象编程和函数式编程特性会为开发带来更多便利。Chisel自然也继承了Scala的语言特性,接下来的两篇文章将分别讲解如何利用Chisel的面向对象编程特性和函数式编程特性,这一篇文章从面向对象特性开始。...

2022-08-05 14:26:44 781 1

原创 吃透Chisel语言.33.Chisel进阶之硬件生成器(二)——Chisel组合逻辑电路生成:以BCD编码表为例

上一篇文章我们学习了两种类型的变量在Chisel之中的使用,然后分别介绍了Chisel中四种参数化的方法,对于我们构建可复用的模块有重大意义。这一部分的关键是将Chisel作为写硬件生成器的语言,而不仅仅是作为描述硬件的语言,这个参数化就是作为硬件生成器的开始。这一篇文章将以逻辑表的例子介绍Chisel中组合逻辑电路的生成,作为用Chisel写硬件生成器的例子。...

2022-08-04 23:30:27 988

原创 吃透Chisel语言.32.Chisel进阶之硬件生成器(一)——Chisel中的参数化

Chisel区别于其他硬件描述语言的最强大的地方在于,我们可以用Chisel写**硬件生成器**。对于老一点的硬件描述语言,比如VHDL和Verilog,我们通常使用其他的编程语言(比如Java或Python)来生成硬件。但是在Chisel中,构造硬件时可以利用Scala和Java库的强大能力。因此,我们既可以在Chisel中直接描述硬件,也可以用Chisel写硬件生成器,这一部分我们就仔细学习一下Chisel中如何写硬件生成器,第一篇文章从Chisel中的参数化开始。...

2022-08-03 13:46:26 1737 3

原创 吃透Chisel语言.31.Chisel进阶之通信状态机(三)——Ready-Valid接口:定义、时序和Chisel中的实现

上一篇文章以Popcount为例,介绍了带数据通路的有限状态机FSMD的写法与实现,对于后面写复杂的系统有很关键的指导意义。我们可以注意到,在FSMD的实现中,状态机之间的通信我们使用了`Ready-Valid`握手协议,这是一种常见的通信接口协议,但每次都这么写显然有点复杂。而Chisel中自带了`Ready-Valid`相关的函数`DecoupledIO`,用于对数据信号进行`Ready-Valid`协议的封装,这一篇文章我们就来学习这个重要又方便的函数。...

2022-08-01 23:33:47 1943

原创 吃透Chisel语言.30.Chisel进阶之通信状态机(二)——FSMD:以Popcount为例

上一篇文章以闪光灯为例,介绍了通信状态机的写法,用于将大的复杂的状态机分解为小的多个相互通信的状态机来实现,可以保证使用资源更少,维护、修改也更容易。不过上一篇文章中的通信状态机之间的通信都是控制信号,还未涉及数据信号。这一篇文章就一起学习带数据通路的状态机,并以Popcount计数器为例进行介绍。...

2022-08-01 14:46:10 1271

原创 吃透Chisel语言.29.Chisel进阶之通信状态机(一)——通信状态机:以闪光灯为例

上一部分我们学习了单个有限状态机的Chisel描述方法,但是单个有限状态机通常很难描述稍微有点复杂的数字设计。在这种情况下,可以把问题划分为两个或更多的小的、简单的FSM。这个FSM之间使用信号进行通信,某个FSM的输出是另一个FSM的输入,这个FSM又观察另一个FSM的输出。把一个大的FSM分割成简单的小FSM的做法叫作分解FSM。通信FSM通常直接根据设计规格直接设计,因为如果用首先单个FSM实现设计的话就太大了。这一篇文章就一起来学习通信状态机的设计实现。...

2022-07-28 00:29:34 932

原创 吃透Chisel语言.28.Chisel进阶之有限状态机(二)——Mealy状态机及与Moore状态机的对比

上一篇文章我们介绍了基本有限状态机(FSM),即Moore机,对应的是输出只和当前状态有关的有限状态机,这一篇我们则学习输出依赖于输入的状态机,即Mealy有限状态机,通过上升沿检测的例子来阐明相关特性,进一步比较Moore机和Mealy机的区别。...

2022-07-27 14:17:29 2187

原创 吃透Chisel语言.27.Chisel进阶之有限状态机(一)——基本有限状态机(Moore机)

有限状态机(FSM,Finite-State Machine)是数字设计中的基本构建块,数字设计中很多状态逻辑都可以抽象为FSM。这一部分将对FSM的Chisel实现进行详细介绍,除了基本有限状态机(Moore有限状态机)以外,还会学习Mealy有限状态机和并将二者进行对比。这一篇文章就首先介绍Moore有限状态机。...

2022-07-26 23:13:23 1853

原创 吃透Chisel语言.26.Chisel进阶之输入信号处理(二)——多数表决器滤波、函数抽象和异步复位

上一篇文章我们用简简单单几行代码就实现了异步输入信号的同步化和去抖动,足够应付按钮和开关的异步抖动输入了。这一篇文章我们继续输入信号处理,进一步解决可能存在的噪音问题,尝试为输入信号加一个噪声滤波器,并用函数把这些处理方式抽象整合到一起,最后我们还会简单讨论一下复位信号的同步化。...

2022-07-26 13:54:24 998 2

原创 吃透Chisel语言.25.Chisel进阶之输入信号处理(一)——异步输入与去抖动

前面部分的教程已经将Chisel基本的语法讲得差不多了,从这一部分开始,我们将通过不同的需求来实践Chisel的进阶特性,第一部分我们从输入信号处理开始。从外部世界到我们的同步时序电路的输入信号通常都不是与时钟同步的。比如,输入信号可能来自于一个从0到1和从1到0的转换有抖动的源,比如说弹跳按钮和开关。另一方面输入信号可能是有噪声的,有毛刺,可能会触发同步电路中的一次转换。这一部分的内容就用来处理这些情况。首先我们从异步输入处理开始,讲解如何用数字电路去抖动。...

2022-07-26 00:06:15 1254

原创 吃透Chisel语言.24.Chisel时序电路(四)——Chisel内存(Memory)详解

上一篇文章介绍了移位寄存器的实现和两种常用的移位寄存器,在实现串口通信的时候会很有用,对后面的高速接口设计可能又会有一定启发。在数字设计中,不仅仅有寄存器可以保存电路的状态信号,内存(Memory,或叫作存储器,本文都用内存称呼)也是可以保存状态信息的,在处理器设计中内存还用于程序代码和数据的存放,因此十足重要。这一篇文章我们就一起来学习Chisel中的内存实现尤其是同步内存的实现和初始化。...

2022-07-24 13:50:25 2867 3

原创 吃透Chisel语言.23.Chisel时序电路(三)——Chisel移位寄存器(Shift Register)详解

上一篇文章介绍了Chisel计数器以及一些高级用法,内容很多,学下来肯定收获也会很多。除了计数器以外,还有一种寄存器的应用十分广泛,那就是移位寄存器。这一篇文章就详细介绍移位寄存器和Chisel中的移位寄存器,还会囊括并行输出、并行加载的移位寄存器。...

2022-07-24 09:45:33 2377 2

原创 吃透Chisel语言.22.Chisel时序电路(二)——Chisel计数器(Counter)详解:计数器、定时器和脉宽调制

上一篇文章我们学习了时序电路中最基础的寄存器,在Chisel中是如何实现并使用的。而时序电路中还有一种十分常见的结构,它就是计数器(Counter)。计数器在数字设计中很常见,可以用于循环计数、性能计数等场合,几乎是必不可少的组件。从本质上来说,计数器也是一个寄存器,这一篇文章我们就共同学习一下Chisel中的计数器及其波形特性以及包括定时器、脉冲宽度调制在内的应用。...

2022-07-23 19:27:23 2575 4

原创 吃透Chisel语言.21.Chisel时序电路(一)——Chisel寄存器(Register)详解

上一部分我们学习了简单的组合电路,这一部分介绍时序电路,与组合电路相比多了时序和状态,但也相比来说也并不是很难的东西。而时序电路对于数字设计来说特别重要,我们当然可以构造一个单周期的复杂系统,比如实现一个单周期的RISC-V处理器。但是由于这一个周期要做的事情太多太多,因此周期很长,时钟频率上不去,性能自然高不了。而时序电路是流水线的基础,通过将复杂电路划分为若干流水线阶段,既可以提高时钟频率,又可以利用指令级并行,能够极大提升数字电路性能。因此,我们必须深刻理解时序,这一篇文章我们就从最基本的寄存器开始。

2022-07-20 13:40:54 2952

原创 吃透Chisel语言.20.Chisel组合电路(二)——Chisel编码器与解码器实现

上一篇文章讲了Chisel中组合电路的基本写法,还介绍了Chisel中的条件语句`when/elsewhen/otherwise`结构,需要注意的是Chisel中的条件语句块并非条件执行,而是对应着多路选择器。这一篇文章我们将会用Chisel实现编码器和解码器,同时引入Chisel中的`switch`语句。...

2022-07-17 11:17:49 1878 5

原创 吃透Chisel语言.19.Chisel组合电路(一)——Chisel组合电路与Chisel条件语句

上一部分讲解了Chisel中模块的语法和使用,这一部分将会对Chisel的组合电路进行介绍。组合逻辑电路是数字电路的基本构建块,是构建复杂数字系统不可或缺的元素。理论上来说所有的组合电路都可以用布尔表达式来编写,但是更常见、更高效的方法是用真值表。我们在实践中通常会让综合工具去提取并简化布尔表达式,而不需要自己去编写、简化得到晦涩难懂的精简的表达式。这一篇文章首先来学习Chisel中组合电路相关的语法。.........

2022-07-14 13:30:43 1940 4

原创 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块

上一篇文章讲述了用函数实现轻量级模块的方法,可以大幅度提升编码效率。Chisel中也提供了一些好用的函数,方便我们编写代码,也方便Chisel编译器优化生成的硬件电路。在Chisel中除了使用我们写的模块或函数硬件生成器,我们可能还需要使用现有的IP,而这些IP通常是用Verilog来写的,我们该如何使用这些IP呢?这一篇文章就来说说。...

2022-07-13 21:04:12 2075 8

原创 吃透Chisel语言.17.Chisel模块详解(四)——用函数实现轻量级模块

前面三篇文章我们学习了模块的实现语法、模块嵌套以及模块之间的连接方法,一般来说模块是Chisel中构造硬件描述的基本方法。但是Chisel中的模块和Verilog这类语言一样,定义模块会需要很多样板代码,又是从`Module`拓展,又是定义`IO`接口的,实例化和连接的时候又很费劲。不过Chisel中还是有简单的方法来定义轻量级模块的,那就是使用函数来实现。这一篇文章就讲讲如何用函数实现轻量级模块。...

2022-07-13 13:33:43 1259

原创 吃透Chisel语言.16.Chisel模块详解(三)——Chisel的整体连接(Bulk Connection),以流水线处理器为例

一般来说,一个Chisel模块都会有很多端口,为了连接多端口的模块,要是一根线一根线地连接就会很麻烦。而Chisel中提供了**整体连接**(Bulk Connection)操作符``,可以将bundle的部分给双向连接起来,这样我们在连接组件的时候就可以用一个操作符就行了,方便很多。这一篇文章我们就来讲讲这个``操作符的用法。...

2022-07-13 12:45:22 2279

原创 吃透Chisel语言.15.Chisel模块详解(二)——Chisel模块嵌套和ALU实现

稍微复杂点的硬件设计就需要用嵌套的模块层级来构建了,上一篇文章中实现的计数器其实就是个例子,计数器内部嵌套了一个寄存器、一个Mux和一个加法器。这一篇文章就仔细讲解模块之间是怎么连接到一起的,又是怎么组合成层级的大规模模块的,最后用Chisel实现一个ALU模块来实际应用一下Chisel模块实现的基本方法。......

2022-07-12 13:21:03 2238 9

原创 吃透Chisel语言.14.Chisel模块详解(一)——初识Chisel模块(Module)并实现一个计数器

Chisel模块详解这一部分会讲解组件在Chisel中是怎么描述的、又是如何整合到一起的,还提供了一些简单的组件的例子。不过这一部分涉及到的模块还都比较小,比如一个简单的加法器,只是用来展示定义、实例化和连接组件的基本原理。实际编写Chisel代码的时候,要写的模块肯定代码量大管饱,不像加法器一样就那么一两行。这一篇文章首先介绍Chisel的基本组件,也就是模块(Module)。...

2022-07-08 13:50:47 1925

原创 吃透Chisel语言.13.Chisel项目构建、运行和测试(五)——Chisel测试之波形测试(Waveform)和printf调试大法

我们已经学习了`ScalaTest`和`ChiselTest`这两种测试框架,他们在小规模数字设计和**单元测试**(Unit Testing)的时候很好用,就跟软件测试是一样的。单元测试集合也用于**回归测试**(Regression Testing)。但是为了调试更复杂的数字设计,我们需要一次性观测多个信号。数字设计中经典的调试方法就是把信号用波形(Waveform)的方法展现出来,波形中的信号会随着时间的推移显示。这篇文章我们首先从波形调试开始。...

2022-07-07 14:16:20 2843

原创 吃透Chisel语言.12.Chisel项目构建、运行和测试(四)——Chisel测试之ChiselTest

上一篇文章我们介绍了ScalaTest,它是Scala和Java的测试工具。而现在Chisel模块最新的标准测试工具是ChiselTest,它是基于ScalaTest的,允许我们用于Chisel测试。为了使用ChiselTest,我们同样需要在`build.sbt`里面包含`chiseltest`的库。...

2022-07-03 22:29:14 2342 10

原创 吃透Chisel语言.11.Chisel项目构建、运行和测试(三)——Chisel测试之ScalaTest

硬件设计中的测试通常叫作testbench,直译过来叫作测试工作台,后面还是用testbench来表达。testbench会实例化一个待测件DUT(Design Under Test,待测设计),驱动输入接口并观察输出接口,比较输出是否复合预期。接下来几篇文章我们就分别介绍Chisel中可能用到的四个测试方法,首先从`ScalaTest`开始。...

2022-07-03 13:58:57 1989

原创 吃透Chisel语言.10.Chisel项目构建、运行和测试(二)——Chisel中生成Verilog代码&Chisel开发流程

上一篇文章我们提到了怎么用sbt构建Chisel项目并运行Chisel代码,但是毕竟还是在电脑上运行的。而在实践中,我们写的Chisel代码最终应该综合到FPGA或ASIC上,所以必须把Chisel翻译到一个综合工具能处理的硬件描述语言,比如Verilog。那怎么用Chisel代码生成Verilog代码呢?Chisel的工具流又是怎样的呢?这篇文章来学习一下。.........

2022-07-03 11:42:55 3666 2

原创 吃透Chisel语言.09.Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行

上一大部分介绍了Chisel的基础语法,但除了教程开始的Demo以外,我们还没有开始写Chisel代码,这对于学习编程语言来说是大忌。不过好在Chisel基础语法部分内容并不算多,眼睛过一遍可能也掌握个大差不差了。但不能总这样,所以这一部分就来讲讲如何开始我们的Chisel项目。......

2022-07-02 21:26:46 3705 1

原创 吃透Chisel语言.08.Chisel基础(五)——Wire、Reg和IO,以及如何理解Chisel生成硬件

上一篇的结语中提到,`UInt`、`SInt`和`Bits`都是Chisel类型,它们本身是不直接表示硬件的,只有把它们封装成为`Wire`、`Reg`或`IO`才会生成电路。这件事可以这么理解,数字逻辑电路是由连线、逻辑门、寄存器和输入输出(包括时钟和复位信号)等组成的,其中连线对应`Wire`,逻辑门对应运算符,寄存器对应`Reg`,输入输出对应`IO`。那么在Chisel中它们到底怎么使用呢?又如何理解Chisel生成电路呢?这一篇文章一起学习一下。......

2022-07-02 17:56:11 2521

原创 吃透Chisel语言.07.Chisel基础(四)——Bundle和Vec

Chisel基础的前面三篇我们学习了数据类型、组合电路操作符和寄存器,虽然已经足够实现很复杂的数字电路了,但还是不够方便。比如我需要构建一个32个寄存器的寄存器组,那么我需要写32个`RegInit`吗?再比如我要将几个信号打包到一起,我又该怎么实现呢?Chisel中提供了两种构造用于给相关的信号分组,他们就是`Bundle`和`Vec`,其中:1. `Bundle`用于将不同类型的信号划分为一组;2. `Vec`用于表示一个可索引的、相同类型的信号的集合;这一部分我们就来详细讲解它们。......

2022-07-02 15:19:40 4214

原创 吃透Chisel语言.06.Chisel基础(三)——寄存器和计数器

Chisel基础的上一部分我们介绍了Chisel中的运算符和组合逻辑,但是要构造复杂的数字逻辑电路,光有组合电路是不够的,因为组合电路是没有状态信息的。这一部分就介绍用于描述数字电路状态信息的基本组件,也就是大家耳熟能详的**寄存器**(Register)。介绍完寄存器和寄存器上的操作之后,我们将会用寄存器实现一个计数器。......

2022-07-02 12:17:34 2159

原创 吃透Chisel语言.05.Chisel基础(二)——组合电路与运算符

组合逻辑电路从数学的角度来讲,就是用布尔代数的操作符来描述的数字逻辑电路,也就是一系列布尔代数运算符的组合。Chisel中,这些布尔代数的操作符跟C、Java、Scala以及其他编程语言中定义的是类似的,比如,`&`是**按位与**操作符,`|`是**按位或**操作符。这一部分就详细介绍Chisel中基本的位运算符、算术运算符、逻辑运算符、比较运算符等,以及Chisel中的一个高阶组合电路运算符——多路选择器。.........

2022-07-02 00:10:12 5579 4

原创 吃透Chisel语言.04.Chisel基础(一)——信号类型和常量

开始肯定是介绍Chisel的基础内容了,《Chisel基础》这一部分主要会介绍数字设计中的两个基本组件:组合电路和触发器。这俩基本组件都不复杂,但是组合在一起就可以得到规模很大、功能也很强大的数字电路了。第一部分我们就简单地看看Chisel中的信号类型和常量,在上一篇文章中也有相关介绍,其中还包括和Verilog之间的对比。......

2022-07-01 13:09:10 2792 1

原创 吃透Chisel语言.03.写给Verilog转Chisel的开发者(没有Verilog基础也可以看看)

一个CPU或者其他数字芯片,本质上都是一个大型的数字逻辑电路,如果设计一个硬件描述语言来设计CPU,必然需要支持所有数字逻辑电路的基本组件,Verilog如此,Chisel当然也不例外。这一篇文章我们就以组合逻辑电路为例,对比Chisel和Verilog的基本语法。......

2022-06-22 00:07:56 2517 4

原创 吃透Chisel语言.02.Chisel+VS Code+Ubuntu/WSL2开发环境搭建与使用

既然是学Chisel语言,那肯定得先把环境配置好,磨刀不误砍柴工嘛。而且有个测试环境的话,在后期的学习过程中自己去试运行代码段可以加深学习效果。这里推荐使用Ubuntu或者基于WSL2(Windows Subsystem Linux 2)的Ubuntu,本人使用的是WSL2上的Ubuntu 20.04.3 LTS,在使用体验上与Ubuntu几乎没有区别,且能同时使用Windows提供的诸多便利。...

2022-05-23 08:00:00 5836 27

原创 吃透Chisel语言.01.大家Verilog和VHDL用得好好的,为什么要整个Chisel语言出来?

说到数字芯片或微处理器的设计实现,你首先想到的语言是什么?可能会是Verilog和VHDL这种早在上世纪八十年代就开发出来的成熟硬件描述语言,也可能会是在Verilog基础上建立、结合了HVL的System Verilog,甚至还有近年来火热的基于C/C++/System C的HLS。但是跟你说起Chisel,你可能会一脸茫然。那么,Chisel是什么?为什么又突然冒出个Chisel出来?用Chisel有啥好处?这篇博客就来详细回答这些问题。...

2022-05-22 08:00:00 5879 6

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除