当前位置:网站首页>吃透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 basic supplement
- Oracle was named the champion of Digital Innovation Award by Ventana research
- Xilinx/system-controller-c/boardui/ unable to connect to the development board, the solution of jamming after arbitrary operation
- Applet live + e-commerce, if you want to be a new retail e-commerce, use it!
- 自主工业软件的创新与发展
- Redis - how to install redis and configuration (how to quickly install redis on ubuntu18.04 and centos7.6 Linux systems)
- 中邮科技冲刺科创板:年营收20.58亿 邮政集团是大股东
- 基于STM32+华为云IOT设计的酒驾监控系统
- JVM series - stack and heap, method area day1-2
- C语言宿舍管理查询软件
猜你喜欢

逆向调试入门-PE结构-资源表07/07

2022年山东省安全员C证考试题库及在线模拟考试

Interviewer: what is the internal implementation of hash data type in redis?

JVM series - stack and heap, method area day1-2

结合案例:Flink框架中的最底层API(ProcessFunction)用法

Haproxy high availability solution

苹果5G芯片研发失败:继续依赖高通,还要担心被起诉?

MySQL 45 lecture - learn the actual combat notes of MySQL in Geek time 45 lecture - 06 | global lock and table lock_ Why are there so many obstacles in adding a field to the table

一次 Keepalived 高可用的事故,让我重学了一遍它

Getting started with the go language is simple: go implements the Caesar password
随机推荐
ASP. Net core introduction I
基于STM32+华为云IOT设计的酒驾监控系统
C语言集合运算
基于YOLOv1的口罩佩戴检测
美国土安全部长:国内暴力极端主义是目前美面临的最大恐怖主义威胁之一
2022 Shandong Province safety officer C certificate examination question bank and online simulation examination
C语言课程设计题
英视睿达冲刺科创板:年营收4.5亿 拟募资9.79亿
Web knowledge supplement
MySQL5免安装修改
. Net delay queue
Five "potential errors" in embedded programming
unity不识别rider的其中一种解决方法
Dgraph: large scale dynamic graph dataset
Openharmony application development how to create dayu200 previewer
1200. 最小绝对差
FS7867S是一款应用于数字系统供电电源电压监控的电压检测芯片
SCM polling program framework based on linked list management
嵌入式编程中五个必探的“潜在错误”
2022KDD预讲 | 11位一作学者带你提前解锁优秀论文