当前位置:网站首页>吃透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
边栏推荐
- C language Dormitory Management Query Software
- Introduction to XML II
- 面试官:Redis中哈希数据类型的内部实现方式是什么?
- Lick the dog until the last one has nothing (state machine)
- C语言职工管理系统
- 1200. 最小绝对差
- Oracle was named the champion of Digital Innovation Award by Ventana research
- C语言图书租赁管理系统
- WS2818M是CPC8封装,是三通道LED驱动控制专用电路外置IC全彩双信号5V32灯可编程led灯带户外工程
- 2022g3 boiler water treatment examination question simulation examination question bank and simulation examination
猜你喜欢
Byte interview algorithm question
MySQL45讲——学习极客时间MySQL实战45讲笔记—— 06 | 全局锁和表锁_给表加个字段怎么有这么多阻碍
2022危险化学品经营单位主要负责人练习题及模拟考试
吃透Chisel语言.12.Chisel项目构建、运行和测试(四)——Chisel测试之ChiselTest
unity不识别rider的其中一种解决方法
中邮科技冲刺科创板:年营收20.58亿 邮政集团是大股东
Oracle was named the champion of Digital Innovation Award by Ventana research
华昊中天冲刺科创板:年亏2.8亿拟募资15亿 贝达药业是股东
MySQL 5 installation and modification free
CommVault cooperates with Oracle to provide metallic data management as a service on Oracle cloud
随机推荐
Interviewer: what is the internal implementation of hash data type in redis?
程序员转方向
2022年山东省安全员C证考试题库及在线模拟考试
锐成芯微冲刺科创板:年营收3.67亿拟募资13亿 大唐电信是股东
Qt如何实现打包,实现EXE分享
美国土安全部部长警告移民“不要踏上危险的旅程”
Automatic filling of database public fields
德明利深交所上市:市值31亿 为李虎与田华夫妻档
WS2818M是CPC8封装,是三通道LED驱动控制专用电路外置IC全彩双信号5V32灯可编程led灯带户外工程
舔狗舔到最后一无所有(状态机)
JVM 内存布局详解,图文并茂,写得太好了!
C language programming topic reference
XML入门二
Haproxy high availability solution
Redis —— How To Install Redis And Configuration(如何快速在 Ubuntu18.04 与 CentOS7.6 Linux 系统上安装 Redis)
C语言课程设计题
2022 Shandong Province safety officer C certificate examination question bank and online simulation examination
Variable promotion and function promotion in JS
博士申请 | 西湖大学学习与推理系统实验室招收博后/博士/研究实习等
How to choose a technology stack for web applications in 2022