自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 问答 (1)
  • 收藏
  • 关注

原创 第二十五章 Chisel进阶——隐式参数的应用

用Chisel编写的CPU,比如Rocket-Chip、RISCV-Mini等,都有一个特点,就是可以用一个配置文件来裁剪电路。这利用了Scala的模式匹配、样例类、偏函数、可选值、隐式定义等语法。本章内容就是来为读者详细解释它的工作机制。一、相关定义要理解隐式参数是如何配置电路的,应该先了解与配置相关的定义。在阅读代码之前,为了能快速读懂、深入理解,读者最好复习一下模式匹配和隐式定义两章...

2019-02-25 21:55:14 10019 10

原创 第二十四章 Chisel基础——其它议题

本章讲解的内容比较繁杂,没有一个统一的中心思想。这些问题与实际编程没有太大关系,但是读者需要稍微留意。一、动态命名模块Chisel可以动态定义模块的名字,也就是转成Verilog时的模块名不使用定义的类名,而是使用重写的desiredName方法的返回字符串。模块和黑盒都适用。例如:class Coffee extends BlackBox { val io = IO(new ...

2019-02-25 19:53:17 7538 9

原创 第二十三章 Chisel基础——函数的应用

函数是编程语言的常用语法,即使是Verilog这样的硬件描述语言,也会用函数来构建组合逻辑。对于Chisel这样的高级语言,函数的使用更加方便,还能节省不少代码量。不管是用户自己写的函数、Chisel语言库里的函数还是Scala标准库里的函数,都能帮助用户节省构建电路的时间。一、用函数抽象组合逻辑与Verilog一样,对于频繁使用的组合逻辑电路,可以定义成Scala的函数形式,然后通过函数...

2019-02-25 03:27:43 11287 5

原创 第二十二章 Chisel基础——多时钟域设计

在数字电路中免不了用到多时钟域设计,尤其是设计异步FIFO这样的同步元件。在Verilog里,多时钟域的设计很简单,只需声明多个时钟端口,然后不同的always语句块根据需要选择不同的时钟作为敏感变量即可。在Chisel里,则相对复杂一些,因为这与Scala的变量作用域相关,而且时序元件在编译时都是自动地隐式跟随当前时钟域。本章将介绍多时钟域设计的语法,这其实很简单。一、没有隐式端口的模块...

2019-02-24 15:21:19 9237 7

原创 第二十一章 Chisel基础——黑盒

因为Chisel的功能相对Verilog来说还不完善,所以设计人员在当前版本下无法实现的功能,就需要用Verilog来实现。在这种情况下,可以使用Chisel的BlackBox功能,它的作用就是向Chisel代码提供了用Verilog设计的电路的接口,使得Chisel层面的代码可以通过模块的端口来进行交互。一、例化黑盒如果读者尝试在Chisel的模块里例化另一个模块,然后生成Verilog...

2019-02-23 21:12:58 9063 3

原创 第二十章 Chisel基础——生成Verilog与基本测试

经过前三章的内容,读者已经了解了如何使用Chisel构建一个基本的模块。本章的内容就是在此基础上,把一个Chisel模块编译成Verilog代码,并进一步使用Verilator做一些简单的测试。一、生成Verilog前面介绍Scala的内容里说过,Scala程序的入口是主函数。所以,生成Verilog的程序自然是在主函数里例化待编译的模块,然后运行这个主函数。例化待编译模块需要特殊的方法调...

2019-02-23 15:20:06 18847 8

原创 第十八章 Chisel基础——模块与硬件类型

Chisel在构建硬件的思路上类似Verilog。在Verilog中,是以“模块(module)”为基本单位组成一个完整的独立功能实体,所以Chisel也是按模块划分的,只不过不是用关键字“module”开头来定义模块,而是用一个继承自Module类的自定义class。在Verilog里,模块内部主要有“线网(wire)”和“四态变量(reg)”两种硬件类型,它们用于描述数字电路的组合逻辑和时...

2019-02-21 17:09:58 19656 7

原创 第十九章 Chisel基础——常用的硬件原语

前两章介绍了基本的数据类型和硬件类型,已经足够编写基本的小规模电路。至于要如何生成Verilog,会在后续章节讲解。如果要编写大型电路,当然也可以一砖一瓦地搭建,但是费时费力,完全体现不出软件语言的优势。Chisel在语言库里定义了很多常用的硬件原语,读者可以直接导入相应的包来使用。让编译器多干活,让程序员少费力。一、多路选择器因为多路选择器是一个很常用的电路模块,所以Chisel内建了几...

2019-02-21 17:09:03 24279 8

原创 第十七章 Chisel基础——数据类型

一、Chisel的常见问题在学习Chisel前,应该熟悉一些常见问题,这些问题在编写Chisel的任何时候都应该牢记。①Chisel是寄宿在Scala里的语言,所以它本质还是Scala。为了从Chisel转变成Verilog,语言开发人员开发了一个中间的标准交换格式——Firrtl,它跟Vrilog是同一级别的,两者都比Chisel低一级。编写的Chisel代码首先会经过Firrtl编译器...

2019-02-19 02:08:43 25162 1

原创 第十六章 Chisel入门——搭建开发环境

用于编写Chisel的Scala内容已经全部讲完了,下面就可以正式进入Chisel的学习之旅了。有兴趣的读者也可以自行深入研究Scala的其它方面,不管是日后学习、工作,或是研究Chisel发布的新版本,都会有不少的帮助。在学习Chisel之前,自然是要先讲解如何搭建开发环境。因为目前还没有Windows系统的开发环境,所以读者最好有一个Linux系统的虚拟机,或者Mac OS的电脑。在这里,...

2019-02-15 22:32:35 26368 17

原创 第十五章 Scala进阶——隐式转换与隐式参数

考虑如下场景:假设编写了一个向量类MyVector,并且包含了一些向量的基本操作。因为向量可以与标量做数乘运算,所以需要一个计算数乘的方法“ * ”,它应该接收一个类型为基本值类的参数。在向量对象myVec调用该方法时,可以写成诸如“myVec * 2”的形式。在数学上,反过来写“2 * myVec”也是可行的,但是在程序里却行不通。因为操作符的左边是调用对象,反过来写就表示Int对象“2”是方法...

2019-02-14 22:19:15 6845 8

原创 第十四章 Scala进阶——抽象成员

一、抽象成员类可以用“abstract”修饰变成抽象的,特质天生就是抽象的,所以抽象类和特质里可以包含抽象成员,也就是没有完整定义的成员。Scala有四种抽象成员:抽象val字段、抽象var字段、抽象方法和抽象类型,它们的声明形式如下:trait Abstract { type T // 抽象类型 def transform(x:...

2019-02-14 01:05:46 4433

原创 第十三章 Scala进阶——类型参数化

在面向对象的编程里,提高代码复用率的一个重要方法就是泛型。泛型是一种重要的多态,称为“全类型多态”或“参数多态”。在某些容器类里,通常需要存储其它类型的对象,但是具体是什么类型,事先并不知道。倘若对每种可能包含的类型都编写一个新类,那么这完全不现实。一是工作量巨大,二是自定义类型是什么完全无法预知。例如,列表的元素可以是基本类型,也可以是自定义的类型,不可能在编写列表类时把自定义类型也考虑进去。更...

2019-02-13 03:07:31 6060

原创 第十二章 Scala进阶——模式匹配

前一章提到过,Scala的内建控制结构里有一个match表达式,用于模式匹配或偏函数。模式匹配是Scala中一个强大的高级功能,并且在Chisel中被用于硬件的参数化配置,可以快速地裁剪、配置不同规模的硬件电路。所以,尽管模式匹配不是很容易就能掌握并熟练运用,但是学会它将会对软、硬件编程都大有帮助。一、样例类与样例对象定义类时,若在最前面加上关键字“case”,那么这个类就被称为样例类。S...

2019-02-12 01:03:33 6809

原创 第十一章 Scala基础——内建控制结构

对任何编程语言来说,都离不开判断、选择、循环等基本的程序控制结构。自然,Scala也实现了必需的基本控制结构,只不过这些内建控制结构的语法更贴近函数式的风格。本章内容将对这些语法逐一讲解,这些语法在Chisel里编写电路逻辑时也是经常出现的。一、if表达式用于判断的“if......else if......else”语法想必是所有编程语言都具备的。Scala的if表达式与大多数语言是一样...

2019-02-10 23:59:35 5808 1

原创 第十章 Scala基础——集合

不管是用Scala编写软件,还是用Chisel开发硬件电路,集合都是非常有用的数据结构。Scala里常见的集合有:数组、列表、集、映射、序列、元组、数组缓冲和列表缓冲。了解这些集合的概念并熟练掌握基本使用方法,对提高工作效率大有帮助。本章的内容便是逐一讲解这些集合类,所涉内容均为基础,对编写、阅读Chisel代码有用即可。如果想深入了解集合的原理,请读者自行学习。一、数组数组是最基本的集合...

2019-02-10 00:22:15 6987 5

原创 第九章 Scala基础——包和导入

一、包当代码过于庞大时,为了让整个系统层次分明,各个功能部分划分明显,常常需要把整体划分成若干独立的模块。与Java一样,Scala把代码以“包”的形式划分。包是以关键字“package”为开头来定义的。可以用花括号把包的范围包起来,这种风格类似C++和C#的命名空间,而且这种方法使得一个文件可以包含多个不同的包。也可以不用花括号标注范围,但包的声明必须在文件最前面,这样使得整个文件的内容...

2019-02-09 02:59:16 6769

原创 第八章 Scala基础——特质

一、什么是特质因为Scala没有多重继承,为了提高代码复用率,故而创造了新的编程概念——特质。特质是用关键字“trait”为开头来定义的,它与单例对象很像,两者都不能有入参。但是,单例对象天生就是具体的,特质天生就是抽象的,不过不需要用“abstract”来说明。所以,特质可以包含抽象成员,而单例对象却不行。另外,两者都不能用new来实例化,因为特质是抽象的,而单例对象已经是具体的对象。类...

2019-02-08 01:18:41 7548 3

原创 第七章 Scala基础——类继承

一、Scala的类继承在面向对象编程里,为了节省代码量,也为了反映实际各种类之间的联系,通常采取两种策略:包含和继承。包含代表了一种has-a的关系,也就是一个类包括了另一个类的实例。例如,午餐的菜单含有水果,那么就可以先编写一个水果类,然后再编写一个午餐类,并在午餐类里包含水果类的对象,但这两者没有必然联系。继承代表了一种is-a的关系,也就是从一个宽泛的类可以派生出更加具体的类。例如,编写...

2019-02-06 02:41:59 8924

原创 第六章 Scala基础——操作符即方法

一、操作符在Scala里的解释在诸如C++、Java等oop语言里,定义了像byte、short、int、char、float之类的基本类型,但是这些基本类型不属于面向对象的范畴。就好比C语言也有这些类型,但是C语言根本没有面向对象的概念。 比如只能说“1”是一个int类型的常量,却不能说它是一个int类型的对象。与之对应的,这些语言还定义了与基本类型相关的操作符。例如,有算术操作符加法“+”...

2019-02-04 21:43:02 9576 5

原创 第五章 Scala基础——类和对象

一、类前面两章介绍了Scala的变量和函数,那么就可以开始学习Scala里关于面向对象的内容。在Scala里,类是用关键字“class”开头的代码定义。它是对象的蓝图,一旦定义完成,就可以通过“new 类名”的方式来构造一个对象。而这个对象的类型,就是这个类。换句话说,一个类就是一个类型,不同的类就是不同的类型。在后续的章节中,会讲到类的继承关系,以及超类、子类和子类型多态的概念。在类...

2019-02-04 01:47:12 13443 6

原创 第四章 Scala基础——函数及其几种形式

一、定义一个函数Scala的函数定义以“def”开头,然后是一个自定义的函数名(推荐驼峰命名法),接着是用圆括号“( )”包起来的参数列表。在参数列表里,多个参数用逗号隔开,并且每个参数名后面要紧跟一个冒号以及显式声明的参数类型,因为编译器在编译期间无法推断出入参类型。写完参数列表后,应该紧跟一个冒号,再添加函数返回结果的类型。最后,再写一个等号“=”,等号后面是用花括号“{ }”包起来的函数...

2019-02-03 02:39:46 17204 9

原创 第三章 Scala基础——变量定义与基本类型

一、定义一个变量Scala在首次定义一个变量时,必须在变量名前面添加关键字“var”或者“val”。用“var”修饰的变量,可以重新赋予新的值,并且把原值抛弃,类似于Java的非final变量。在后续重新赋值时,就不用再写“var”了。而用“val”修饰的变量,则禁止被重新赋值,类似于Java的final变量,换句话说,就是只能读不能写的变量。变量名可以是任意的字母、数字和下划线的组合,但...

2019-02-01 23:43:25 22110 2

原创 第零章 序 Chisel教程汇总

笔者目前西安交通大学微电子硕士在读,研究方向为数字集成电路设计与体系结构。鉴于目前RISC-V的火热程度,笔者参与了课题组的RISC-V项目,并了解、学习了颇受关注的新型硬件构建语言——Chisel,当前参与的神经网络加速器设计便是使用Chisel开发的。这是一门敏捷开发语言,据称要比传统的Verilog语言快很多。在亲身使用过后,笔者发现确实快了不少。这主要得益于Scala作为高级语言的简洁风格...

2019-02-01 20:43:55 72870 18

原创 第二章 Scala入门——让你的代码跑起来

一、Scala的安装方法要使用Scala,首先需要保证已经安装好了Java 8。对于Linux操作系统,Java 8已经默认安装了,而使用Windows操作系统的用户,则需要在Java官网下载安装包进行安装。请在CMD、PowerShell或终端中运行“java -version”命令,如果得到以下信息,则说明Java 8已经安装成功。C:\Users\Administration&gt...

2019-02-01 20:23:13 24300 6

原创 第一章 新型敏捷硬件开发语言——Chisel和Scala

一、最好的宿主——什么是Scala “如果今天我要选用Java之外的一门语言,我将会选择Scala。”                                                                            —— James Gosling,Java之父在今天众多的编程语言中,Java常常是软件开发者的首选语言。而能让Java之父给出如...

2019-02-01 00:32:15 26048

空空如也

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

TA关注的人

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