找回密码
 立即注册
首页 资源区 代码 chisel学习笔记——基本类型

chisel学习笔记——基本类型

杆树 4 天前
Chisel学习笔记(二)——基本类型

因为是对着chisel book学的,这篇实际上是加上我的理解的chisel book的翻译
1.信号类型与常量

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

  • Bits
  • SInt
  • UInt
此外,还定义了逻辑类型Bool。
1.1类型定义

一个Chisel类型的定义有两部分:位宽与类型
比如看下面的例子:
  1. Bits(7.W)
  2. SInt(8.W)
  3. UInt(9.W)
复制代码
分别定义了7bits的Bits类型,8bits的有符号数,9bits的无符号数
1.2 常量定义

而一个Chisel常量类型的定义则有三部分:位宽、类型和值
比如看下面的例子:
  1. -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的字符串类型来表达,如:
  1. "hff".U
  2. "o377".U
  3. "b1111_1111".U
复制代码
都代表十进制的255
2. 组合逻辑

​        首先有必要介绍Scala的一个特性——类型推断,类似C++的auto,对应的关键字为val。这个特性使得我们可以不用像Verilog一样,对每一个变量显式声明它的类型、位宽(位宽实际上作为Bits、SInt、UInt类型的一项属性存在)。
​        先看一个例子:
  1. val logic = a & b | c
复制代码
上面的代码描述了下面这样一个电路:
1.png

​        代码中,logic的类型为val,如前述,这不是一个实际的类型,只是表示logic是一个变量,而logic的变量由Scala推断得出。
​        另外,还可以先将一个变量定义为Wire,然后再用一种持续赋值的方法来进行“连接”:
  1. val w = Wire(UInt())
  2. w := a & b
复制代码
​        可以通过类似下标访问的方法来提取某一位或一个区间:
  1. val bit31 = x(31)
  2. val bit0to7 = x(7, 0)
复制代码
​        还可以进行拼接:
  1. val word = bits1 ## bits2
复制代码
​        下面两张表介绍了Chisel中定义的一些硬件算子:
[table][tr]OperatorDescriptionData Types[/tr][tr][td]*、/、%[/td][td]乘、除、取模[/td][td]UInt、SInt[/td][/tr][tr][td]+、-[/td][td]加、减[/td][td]UInt、SInt[/td][/tr][tr][td]===、=/=[/td][td]等于、不等于[/td][td]UInt、SInt,返回Bool[/td][/tr][tr][td]>、>=、
您需要登录后才可以回帖 登录 | 立即注册