因为是对着chisel book学的,这篇实际上是加上我的理解的chisel book的翻译
Chisel提供了三种基本的类型来描述信号、寄存器、组合逻辑:
此外,还定义了逻辑类型Bool。
一个Chisel类型的定义有两部分:位宽与类型
比如看下面的例子:
Bits(7.W)
SInt(8.W)
UInt(9.W)
分别定义了7bits的Bits类型,8bits的有符号数,9bits的无符号数
而一个Chisel常量类型的定义则有三部分:位宽、类型和值
比如看下面的例子:
-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的字符串类型来表达,如:
"hff".U
"o377".U
"b1111_1111".U
都代表十进制的255
首先有必要介绍Scala的一个特性——类型推断,类似C++的auto,对应的关键字为val。这个特性使得我们可以不用像Verilog一样,对每一个变量显式声明它的类型、位宽(位宽实际上作为Bits、SInt、UInt类型的一项属性存在)。
先看一个例子:
val logic = a & b | c
上面的代码描述了下面这样一个电路:

代码中,logic的类型为val,如前述,这不是一个实际的类型,只是表示logic是一个变量,而logic的变量由Scala推断得出。
另外,还可以先将一个变量定义为Wire,然后再用一种持续赋值的方法来进行“连接”:
val w = Wire(UInt())
w := a & b
可以通过类似下标访问的方法来提取某一位或一个区间:
val bit31 = x(31)
val bit0to7 = x(7, 0)
还可以进行拼接:
val word = bits1 ## bits2
下面两张表介绍了Chisel中定义的一些硬件算子:
| Operator | Description | Data Types |
|---|---|---|
| *、/、% | 乘、除、取模 | UInt、SInt |
| +、- | 加、减 | UInt、SInt |
| ===、=/= | 等于、不等于 | UInt、SInt,返回Bool |
| >、>=、<、<= | 大于、不小于、小于、不大于 | UInt、SInt,返回Bool |
| <<、>> | 左移、右移(UInt逻辑移位、SInt算术移位) | UInt、SInt |
| ~ | 非 | UInt、SInt、Bool |
| &、|、^ | 与、或、非 | UInt、SInt、Bool |
| ! | 逻辑非 | Bool |
| &&、|| | 逻辑与、或 | Bool |
| Function | Description | Data Types |
|---|---|---|
| v.andR、v.orR、v.xorR | AND、OR、XOR reduction | UInt、SInt、returns Bool |
| v(n) | 提取1bit | UInt、SInt |
| v(end, start) | 提取区间 | UInt、SInt |
| Fill(n, v) | 将v复制n遍 | UInt、SInt |
| a ## b | 拼接 | UInt、SInt |
| Cat(a, b, ...) | 拼接 | UInt、SInt |
| Mux(sel, a, b) | 多路选择器 | sel:Bool,a、b:任何相同的Chisel类 |
Chisel提供的寄存器接口是高度抽象和封装的。寄存器的时钟被连接到一个全局时钟,复位被连接到一个全局同步复位,只留下了输入、输出两个接口供使用。虽然自由度变低了,但使用也相对简化了,实际上只有初始化、连接输入、连接输出三件事要做:
val reg = RegInit(0.U(8.W))
reg := d
val q = reg
或者也可以这样写:
val reg = RegNext(d, 0.U(8.W))
val q = reg
Bundle是异构的类型集合,可以通过继承Bundle类来定义:
class MyBundle extends Bundle{
val d1 = UInt(8.W)
val d2 = Bool()
}
然后在使用前进行声明,Bundle内数据的访问实际上就是对类属性的访问:
val mb = Wire(new MyBundle())
mb.d1 := 2.U
mb.d2 := true.B
Vec是同构的类型集合,通过Vec类定义,下标访问:
val vec = Wire(Vec(3, UInt(4.W)))
vec(0) := 1.U
vec(1) := 2.U
vec(2) := 3.U
val q = vec(0)
还可以通过初始化函数定义,这种方法直接产生Wire,不需要再转换:
val d = 3.U(4.W)
val vec = VecInit(1.U(4.W), 2.U, d)
Vec默认是一组Wire,但也有RegFile型的:
val rf = Reg(Vec(32, 0.U(32.W)))
val rf = RegInit(VecInit(Seq.fill(32)(0.U(32.W))))
Bundle与Vec可以互相包含:
class VecBundle extends Bundle{
val d1 = UInt(8.W)
val v1 = Vec(3, UInt(4.W))
}
BundleVec = Wire(Vec(3, new VecBundle()))
另外,Bundle与Vec还有一个重要的用途。Chisel3不支持对一个变量部分赋值,比如说这样写是会报错的:
val dat = Wire(UInt(8.W))
dat(7:4) := "h1".U(4.W)
dat(3:0) := "h2".U(4.W)
作为替代,可以用Vec和Bundle实现分段
上面提到的各种类型支持了多样的设计,但许多还不能直接对应到硬件结构。Wire、Reg、IO分别对应了连线,寄存器,输入输出端口。组合逻辑的信号需要用Wire显式声明,Reg与前述是一样的,IO是输入输出端口。
Wire与IO的用法与Reg类似:
val w = Wire(UInt(8.W))
w := 8.U(8.W)
val v = WireDefault(8.U(8.W))
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU