chisel学习笔记——基本类型

这篇具有很好参考价值的文章主要介绍了chisel学习笔记——基本类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

​ 代码中,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类似:文章来源地址https://www.toymoban.com/news/detail-807396.html

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

到了这里,关于chisel学习笔记——基本类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机组成与设计】Chisel取指和指令译码设计

    本次试验分为三个部分: 目录 设计译码电路 设计寄存器文件 实现一个32个字的指令存储器 输入位32bit的一个机器字,按照课本MIPS 指令格式,完成add、sub、lw、sw指令译码,其他指令一律译码成nop指令。输入信号名为Instr_word,对上述四条指令义译码输出信号名为add_op、sub_o

    2024年02月05日
    浏览(26)
  • TypeScript 学习笔记(一):基本类型、交叉类型、联合类型、类型断言

    TS中实现对象属性必选、对象属性在开发过程中十分常见,前端在传参数时,有些参数比必传,有些是选传,我们可以定一个多个对象来实现传参,但是这让代码变得冗余。我们可以通过TS定义数据类型来实现。 TypeScript中文网 1. 数组 2. 布尔 3. 数值 当我们给num赋值为123但没有

    2024年02月15日
    浏览(32)
  • 学习笔记整理-JS-02-基本类型

    1. JavaScript 中两大数据类型 基本数据类型 Number String Boolean Undefined Null 复杂数据类型 Object Array Function RegExp Date Map Set Symbol 等等 typeof 运算法 使用 typeof 运算法可以检测值或者变量的类型 类型名 typeof检测结果 值举例 数字类型 number 5 字符串类型 string ‘张三’ 基本类型值 布尔

    2024年02月13日
    浏览(35)
  • 【Unity】Unity Shader学习笔记(四)创建和使用、基本语法、属性基本类型、数值精度

    由于着色器是依赖于材质的,所以创建着色器之前通常要先创建一个材质(Material)。然后再创建一个Shader。 结果如下: 然后给材质指定Shader,再给物体指定材质。 建好Shader后双击打开,通常默认使用vs studio开发shader。一个Shader主要的内容都是写在 Shader {} 代码块中,其中包

    2024年02月16日
    浏览(31)
  • Qt-OpenCV学习笔记--基本函数操作--cv::convertTo(图像类型转换)

    不是所有格式的Mat型数据都能被使用。 目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。 如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor(

    2024年02月04日
    浏览(35)
  • C++ Primer 5th 阅读笔记:变量和基本类型

    内建类型 ,如整型,字符型等; 变量 ,为值绑定的一个名字; 表达式和语句 ,操作值。 分支和循环 ,允许我们条件执行和重复执行; 函数 ,定义抽象计算单元。 自定义类型; 标准库。 学习语言的基本知识和标准库。 内建类型; 简要介绍自定义类。 定义了数据的意义

    2024年02月02日
    浏览(40)
  • TS学习01-基本数据类型

    布尔值 数字 字符串 数组 第一种: 在元素类型后面接上 [] 第二种 数组泛型-Array元素类型 元组 Tuple 表示一个已知元素数量和类型的数组· 当访问越界元素,会使用 联合类型 代替 枚举 enum 对 JavaScript 标准数据类型的一个补充。 默认从 0开始为元素编号;可以手动指定成员值

    2024年02月14日
    浏览(19)
  • 【Python 笔记(二)——基本语句 变量类型 字符串 序列 列表与元组 字典与集合】

    在 Python 中,基本语句可以帮助我们完成一些基本的操作,如控制流程、定义函数等。以下是 Python 中的几种基本语句: if 语句 if 语句用于判断某个条件是否成立,如果条件成立则执行相应的代码块。 for 语句 for 语句用于遍历序列中的元素,依次执行相应的代码块。 while 语

    2024年02月08日
    浏览(32)
  • TypeScript 学习笔记(六):索引签名类型、映射类型

    keyof 可以用于获取某种类型的所有键,其返回类型是联合类型。 keyof 与 Object.keys 略有相似,只不过 keyof 取 interface 的键 通过例子可以看到,这里的keyof Info其实相当于\\\"name\\\" | “age”。通过和泛型结合使用,TS 就可以检查使用了动态属性名的代码: 接口 基本数据类型 类 如果

    2024年02月17日
    浏览(32)
  • kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口

    kotlin与java语言一样,编译成字节码后,在JVM虚拟机中运行。kotlin语言的特性依赖于kotlin的语法编译器。与kotlin类似的语言还有: Scala:大数据领域开发语言 Groovy:基于 JVM 平台的动态脚本语言, 在安卓开发中用来编写依赖关系、插件等 2019年谷歌宣布Kotlin成为安卓第一开发语

    2024年02月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包