当前位置:网站首页>吃透Chisel语言.04.Chisel基础(一)——信号类型和常量
吃透Chisel语言.04.Chisel基础(一)——信号类型和常量
2022-07-04 12:49:00 【github-3rr0r】
Chisel基础(一)——信号类型和常量
开始肯定是介绍Chisel的基础内容了,《Chisel基础》这一部分主要会介绍数字设计中的两个基本组件:组合电路和触发器。这俩基本组件都不复杂,但是组合在一起就可以得到规模很大、功能也很强大的数字电路了。
在数字逻辑电路系统里面,一般使用的都是二进制信号,也就是说单个比特或者说单个信号只允许有两种可能的值,也就是大家熟知的0和1。不过在数字设计中,可能还会用一些其他的术语,比如:低(low)/高(high),假(false)/真(true),或者置无效(de-asserted)/置有效(asserted)。这几组术语都分别对应0和1,但是需要注意最后一组de-asserted和asserted,我这里翻译为置无效和置有效,原因是有些场景下是低电平有效,有些场景下是高电平有效,因此他们和0/1的对应关系得看具体场景。
第一部分我们就简单地看看Chisel中的信号类型和常量,在上一篇文章中也有相关介绍,其中还包括和Verilog之间的对比。
三种基本信号类型
Chisel中主要有三种基本数据类型来描述信号、组合逻辑和寄存器:Bits、UInt和SInt。其中UInt和SInt都是从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.U和4.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_1111和b11111111就是等价的。
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中定义了类型Bool。Bool类型的值可以表示一个true或者false的值,定义一个Bool类型的变量可以这样:
Bool()
而常量Bool值则可以通过Scala逻辑值转换得到,方法为xx.B:
true.B
false.B
边栏推荐
- 2022 Shandong Province safety officer C certificate examination question bank and online simulation examination
- 【Antd】Antd 如何在 Form.Item 中有 Input.Gourp 时获取 Input.Gourp 的每一个 Input 的value
- Ws2811 m is a special circuit for three channel LED drive and control, and the development of color light strip scheme
- C语言课程设计题
- Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型(转)
- 205. 同构字符串
- 以房抵债能否排除强制执行
- 学习项目是自己找的,成长机会是自己创造的
- 德明利深交所上市:市值31亿 为李虎与田华夫妻档
- IDEA快捷键大全
猜你喜欢

Applet live + e-commerce, if you want to be a new retail e-commerce, use it!

免费、好用、强大的轻量级笔记软件评测:Drafts、Apple 备忘录、Flomo、Keep、FlowUs、Agenda、SideNote、Workflowy

小程序直播 + 电商,想做新零售电商就用它吧!
Three schemes to improve the efficiency of MySQL deep paging query

Byte interview algorithm question

392. Judgement subsequence

JVM 内存布局详解,图文并茂,写得太好了!

面试官:Redis中哈希数据类型的内部实现方式是什么?

Understanding and difference between viewbinding and databinding

Automatic filling of database public fields
随机推荐
1200. 最小绝对差
CommVault cooperates with Oracle to provide metallic data management as a service on Oracle cloud
Understanding and difference between viewbinding and databinding
中邮科技冲刺科创板:年营收20.58亿 邮政集团是大股东
易周金融 | Q1保险行业活跃人数8688.67万人 19家支付机构牌照被注销
Haproxy high availability solution
.Net之延迟队列
Fs7867s is a voltage detection chip used for power supply voltage monitoring of digital system
[C question set] of VII
205. 同构字符串
HAProxy高可用解决方案
Scripy framework learning
逆向调试入门-PE结构-资源表07/07
Detailed explanation of Fisher information quantity detection countermeasure sample code
基于链表管理的单片机轮询程序框架
一次 Keepalived 高可用的事故,让我重学了一遍它
以房抵债能否排除强制执行
美国土安全部长:国内暴力极端主义是目前美面临的最大恐怖主义威胁之一
FS7867S是一款应用于数字系统供电电源电压监控的电压检测芯片
C语言宿舍管理查询软件