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

Chisel基础(一)——信号类型和常量

开始肯定是介绍Chisel的基础内容了,《Chisel基础》这一部分主要会介绍数字设计中的两个基本组件:组合电路和触发器。这俩基本组件都不复杂,但是组合在一起就可以得到规模很大、功能也很强大的数字电路了。

在数字逻辑电路系统里面,一般使用的都是二进制信号,也就是说单个比特或者说单个信号只允许有两种可能的值,也就是大家熟知的0和1。不过在数字设计中,可能还会用一些其他的术语,比如:低(low)/高(high),假(false)/真(true),或者置无效(de-asserted)/置有效(asserted)。这几组术语都分别对应0和1,但是需要注意最后一组de-assertedasserted,我这里翻译为置无效和置有效,原因是有些场景下是低电平有效,有些场景下是高电平有效,因此他们和0/1的对应关系得看具体场景。

第一部分我们就简单地看看Chisel中的信号类型和常量,在上一篇文章中也有相关介绍,其中还包括和Verilog之间的对比。

三种基本信号类型

Chisel中主要有三种基本数据类型来描述信号、组合逻辑和寄存器:BitsUIntSInt。其中UIntSInt都是从Bits拓展得到的。

这三种类型的是信号/位的向量。UInt用于表示无符号整数对应的位向量,而SInt表示的是有符号整数对应的位向量,而Chisel所用的有符号整数编码方式为二进制补码,这个在计算机通识课里都学过。

下面的Chisel代码分别定义了一个8位Bits、一个8位无符号整数和一个10位有符号整数:

Bits(8.W)
UInt(8.W)
SInt(10.W)

这些位向量的宽度都是通过Chisel宽度类型Width来定义的,表达式n.W可以把一个Scala整数转换成一个Width,进而用于位向量的定义:

n.W
Bits(n.W)

注意:当前版本的Chisel中的Bits已经没有对应的操作了,因此对我们来说没多大用处了,知道有这么个东西就行。

Chisel常量

常量可以用类似Width定义的方法来定义,直接用Scala的整数转换为Chisel类型就行:

0.U		// 定义了一个UInt类型的常量0
-3.S	// 定义了一个SInt类型的常量-3

定义常量的时候也可以带上宽度,用的还是Chisel的Width类型:

3.U(4.W)	// 定义了一个位宽为4的UInt类型常量3

可能你会觉得3.U4.W这种记法很奇特,那你可以把它当成是一个整数常量后跟了一个类型。这种记法就类似于C、Java和Scala中的3L,表示一个值为3的长整型。

定义指定宽度常量时的一个常见问题

我们可能在定义指定宽度的常量时,忘了宽度后面的.W标识符,比如1.U(32)。这种表示法不会定义一个32位宽度的常量1,相反,表达式(32)会被解释为1.U这个数在位置32上的位提取,也就是会得到一个单比特常量0,显然不是我们预期的事情,所以千万不能省略.W

Chisel中用其他进制表示常量

Chisel是从Scala拓展来的,Scala中的类型推断Chisel受益不少,因此很多地方的类型信息是可以省略的。在位宽上这种类型推断也适用,Chisel会自动推断正确的位宽,所以从这点上来说用Chisel描述硬件电路也比Verilog和VHDL更简洁、可读性更强。

对于十进制以外的进制的常量,常量都是用字符串来定义的,根据字符串开头的字符来确定进制。其中h为十六进制,o为八进制,b为二进制,下面的代码分别用这三种进制来表示常量255:

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

可以注意到,上面的定义都没有用(n.W)来指定宽度,因为这是可以省略的,Chisel会自动推断最小宽度来表示这个常量,这里就都是8位(255的二进制表示为8位二进制数)。

还可以注意到,"b1111_1111"中的下划线,这里是用于给数字进行分组的,让代码更可读,在编译器看来下划线是被省略的,比如b_1_1_11_1111b11111111就是等价的。

Chisel中用ASCII字符表示常量

ASCII编码(计算机通识课内容)的字符也可以用于Chisel的常量定义:

val aChar = 'A'.U

结果为UInt<7>(65),即7位无符号数65。注意字符串是不能这么用的,比如:

val aChar = "AA".U		// 错误用法

报错为chisel3.internal.ChiselException: Invalid base A,也就是说对于字符串,Chisel会将第一个字符看作是某进制字符串的基底。

Chisel中的逻辑值

为了表示逻辑值,Chisel中定义了类型BoolBool类型的值可以表示一个true或者false的值,定义一个Bool类型的变量可以这样:

Bool()

而常量Bool值则可以通过Scala逻辑值转换得到,方法为xx.B

true.B
false.B
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值