首页 > 其他分享 >chisel学习笔记——基本类型

chisel学习笔记——基本类型

时间:2022-12-19 15:13:09浏览次数:33  
标签:Wire val Chisel SInt chisel 笔记 学习 UInt Vec

Chisel学习笔记(二)——基本类型

因为是对着chisel book学的,这篇实际上是加上我的理解的chisel book的翻译

1.信号类型与常量

Chisel提供了三种基本的类型来描述信号、寄存器、组合逻辑:

  • Bits
  • SInt
  • UInt

此外,还定义了逻辑类型Bool。

1.1类型定义

一个Chisel类型的定义有两部分:位宽与类型

比如看下面的例子:

Bits(7.W)
SInt(8.W)
UInt(9.W)

分别定义了7bits的Bits类型,8bits的有符号数,9bits的无符号数

1.2 常量定义

而一个Chisel常量类型的定义则有三部分:位宽、类型和值

比如看下面的例子:

-3.S(4.W)

​ 这个定义代表一个4bits的有符号数3,其中-3、4都是Scala原生的整型,而通过.S、.W转换为Chisel定义的有符号数与宽度类型

​ 对于上面的例子应该这样理解,首先4.W将Scala整型4转换为Chisel width,然后作为参数传入.S构成Chisel四位有符号数类型,然后把Scala整型-3转换为Chisel四位有符号数-3。

对于常量的定义,还可以使用其它的进制(16、8、2),这种情况下应该用Scala的字符串类型来表达,如:

"hff".U
"o377".U
"b1111_1111".U

都代表十进制的255

2. 组合逻辑

​ 首先有必要介绍Scala的一个特性——类型推断,类似C++的auto,对应的关键字为val。这个特性使得我们可以不用像Verilog一样,对每一个变量显式声明它的类型、位宽(位宽实际上作为Bits、SInt、UInt类型的一项属性存在)。

​ 先看一个例子:

val logic = a & b | c

上面的代码描述了下面这样一个电路:

image-20221214154338304

​ 代码中,logic的类型为val,如前述,这不是一个实际的类型,只是表示logic是一个变量,而logic的变量由Scala推断得出。

​ 另外,还可以先将一个变量定义为Wire,然后再用一种持续赋值的方法来进行“连接”:

val w = Wire(UInt())
w := a & b

​ 可以通过类似下标访问的方法来提取某一位或一个区间:

val bit31 = x(31) 
val bit0to7 = x(7, 0)

​ 还可以进行拼接:

val word = bits1 ## bits2

​ 下面两张表介绍了Chisel中定义的一些硬件算子:

Operator Description Data Types
*、/、% 乘、除、取模 UInt、SInt
+、- 加、减 UInt、SInt
===、=/= 等于、不等于 UInt、SInt,返回Bool
>、>=、<、<= 大于、不小于、小于、不大于 UInt、SInt,返回Bool
<<、>> 左移、右移(UInt逻辑移位、SInt算术移位) UInt、SInt
~ UInt、SInt、Bool
&、|、^ 与、或、非 UInt、SInt、Bool
! 逻辑非 Bool
&&、|| 逻辑与、或 Bool
Function Description Data Types
v.andR、v.orR、v.xorR AND、OR、XOR reduction UInt、SInt、returns Bool
v(n) 提取1bit UInt、SInt
v(end, start) 提取区间 UInt、SInt
Fill(n, v) 将v复制n遍 UInt、SInt
a ## b 拼接 UInt、SInt
Cat(a, b, ...) 拼接 UInt、SInt
Mux(sel, a, b) 多路选择器 sel:Bool,a、b:任何相同的Chisel类

3. 寄存器

​ Chisel提供的寄存器接口是高度抽象和封装的。寄存器的时钟被连接到一个全局时钟,复位被连接到一个全局同步复位,只留下了输入、输出两个接口供使用。虽然自由度变低了,但使用也相对简化了,实际上只有初始化、连接输入、连接输出三件事要做:

val reg = RegInit(0.U(8.W))
reg := d
val q = reg

或者也可以这样写:

val reg = RegNext(d, 0.U(8.W))
val q  = reg

4. Bundle和Vec

Bundle是异构的类型集合,可以通过继承Bundle类来定义:

class MyBundle extends Bundle{
    val d1 = UInt(8.W)
    val d2 = Bool()
}

然后在使用前进行声明,Bundle内数据的访问实际上就是对类属性的访问:

val mb = Wire(new MyBundle())
mb.d1 := 2.U
mb.d2 := true.B

Vec是同构的类型集合,通过Vec类定义,下标访问:

val vec = Wire(Vec(3, UInt(4.W)))
vec(0) := 1.U
vec(1) := 2.U
vec(2) := 3.U
val q = vec(0)

还可以通过初始化函数定义,这种方法直接产生Wire,不需要再转换:

val d = 3.U(4.W)
val vec = VecInit(1.U(4.W), 2.U, d)

Vec默认是一组Wire,但也有RegFile型的:

val rf = Reg(Vec(32, 0.U(32.W)))
val rf = RegInit(VecInit(Seq.fill(32)(0.U(32.W))))

Bundle与Vec可以互相包含:

class VecBundle extends Bundle{
    val d1 = UInt(8.W)
    val v1 = Vec(3, UInt(4.W))
}
BundleVec = Wire(Vec(3, new VecBundle()))

另外,Bundle与Vec还有一个重要的用途。Chisel3不支持对一个变量部分赋值,比如说这样写是会报错的:

val dat = Wire(UInt(8.W))
dat(7:4) := "h1".U(4.W)
dat(3:0) := "h2".U(4.W)

作为替代,可以用Vec和Bundle实现分段

5. Wire、Reg、IO

​ 上面提到的各种类型支持了多样的设计,但许多还不能直接对应到硬件结构。Wire、Reg、IO分别对应了连线,寄存器,输入输出端口。组合逻辑的信号需要用Wire显式声明,Reg与前述是一样的,IO是输入输出端口。

Wire与IO的用法与Reg类似:

val w = Wire(UInt(8.W))
w := 8.U(8.W)
val v = WireDefault(8.U(8.W))

标签:Wire,val,Chisel,SInt,chisel,笔记,学习,UInt,Vec
From: https://www.cnblogs.com/nvmjom/p/16992198.html

相关文章

  • WCF学习-第一个示例
        最近需要用到WCF,所以对WCF进行了解。在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例。    本文的WCF服务应用功能很简单,却涵盖了一......
  • WCF学习-概述
    一、WCF概述1)什么是WCF?    WindowsCommunicationFoundation(WCF)是用于构建面向服务的应用程序的框架。借助WCF,可以将数据作为异步消息从一个服务终结点发......
  • MySQL笔记(一)之基础知识
    一、​​mysql​​数据类型​​mysql​​支持的所有的数据类型。1.1.字符串类型​​char(1)​​​是固定长度,我们设置长度是多少,只能输入多少。长度可以再​​0-255​​的......
  • 强烈推荐 | 北交大《图像处理与机器学习》免费视频课(附课件源码)
    导读本文主要推荐由北京交通大学黄琳琳教授主讲的《图像处理与机器学习》视频课程,希望对大家的学习有所帮助。(公众号:OpenCV与AI深度学习)背景介绍  俗话说:基础不牢,地动山......
  • Spring CredHub 教程学习
    SpringCredHub提供客户端支持,用于从CloudFoundry​平台中运行的CredHub服务器存储,检索和删除凭据。CredHub提供了一个HTTPAPI,用于安全地存储,生成,检索和删除各种类型的凭......
  • mysql学习------二进制日志管理
    MySQL二进制日志(BinaryLog) a、它包含的内容及作用如下:   包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)   包含关于每个更新数......
  • pycaret学习之关联规则挖掘
    关联规则学习是一种基于规则的机器学习方法,用于发现大型数据库中变量之间的有趣关系。它旨在使用一些有趣的度量来识别数据库中发现的强规则。例如,在超市销售数据中找到的......
  • java核心技术学习笔记——synchronized底层如何实现?什么是锁的升级、降级?
    在Java6之前,Monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。现代的(Oracle)JDK中,VM对此进......
  • javaMail笔记
    JavaMail        javaMail是提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套表中开发类库,支持常用的邮件协议,如SMTP,POO3,IMAP,开发人员使用javaMa......
  • 【机器学习】李宏毅——自监督式学习
    1、BERT简介首先需要介绍什么是自监督学习。我们知道监督学习是有明确的样本和对应的标签,将样本丢进去模型训练并且将训练结果将标签进行比较来修正模型,如下图:而自监督......