第十七章 Chisel基础——数据类型

2023-11-10

一、Chisel的常见问题

在学习Chisel前,应该熟悉一些常见问题,这些问题在编写Chisel的任何时候都应该牢记。

①Chisel是寄宿在Scala里的语言,所以它本质还是Scala。为了从Chisel转变成Verilog,语言开发人员开发了一个中间的标准交换格式——Firrtl,它跟Vrilog是同一级别的,两者都比Chisel低一级。编写的Chisel代码首先会经过Firrtl编译器,生成Firrtl代码,也就是一个后缀格式为“.fir”的文件,然后由这个Firrtl文件再去生成对应的Verilog代码。如果读者有兴趣看一看Firrtl的格式,其实与Verilog很接近,只不过是由机器生成的、很死板的代码。Firrtl编译器也并不是只针对Chisel,有兴趣和能力的读者也可以开发针对Java、Python、C++等语言的Firrtl编译器。因为Firrtl只是一种标准的中间媒介,如何从一端到另一端,完全是自定义的。另外,Firrtl也并不仅仅是生成Verilog,同样可以开发工具生成VHDL、SystemVerilog等语言。

②Scala里的语法,在Chisel里也基本能用,比如Scala的基本值类、内建控制结构、函数抽象、柯里化、模式匹配、隐式参数等等。但是读者要记住这些代码不仅要通过Scala编译器的检查,还需要通过Firrtl编译器的检查。

③Verilog的最初目的是用于电路验证,所以它有很多不可综合的语法。Firrtl在转变成Verilog时,只会采用可综合的语法,因此读者完全不用担心用Chisel写出来的电路不可综合。只要能正确生成Verilog,那就能被综合器生成电路。

④Chisel目前不支持四态逻辑里的x和z,只支持0和1。由于只有芯片对外的IO处才能出现三态门,所以内部设计几乎用不到x和z。而且x和z在设计中会带来危害,忽略掉它们也不影响大多数设计,还简化了模型。当然,如果确实需要,可以通过黑盒语法与外部的Verilog代码互动,也可以在下游工具链里添加四态逻辑。

⑤Chisel会对未被驱动的输出型端口和线网进行检测,如果存在,会进行报错。报错选项可以关闭和打开,取决于读者对设计模型的需求。推荐把该选项打开,尽量不要残留无用的声明。

⑥Chisel的代码包并不会像Scala的标准库那样被编译器隐式导入,所以每个Chisel文件都应该在开头至少写一句“import chisel3._”。这个包包含了基本的语法,对于某些高级语法,则可能需要“import chisel3.util._”、“import chisel3.experimental._”、 “import chisel3.testers._”等等。

⑦应该用一个名字有意义的包来打包实现某个功能的文件集。例如,要实现一个自定义的微处理器,则可以把顶层包命名为“mycpu”,进而再划分成“myio”、“mymem”、“mybus”、“myalu”等子包,每个子包里包含相关的源文件。

⑧Chisel现在仍在更新中,很可能会添加新功能或删去老功能。因此,本教程介绍的内容在将来并不一定就正确,读者应该持续关注Chisel3的GitHub的发展动向。

二、Chisel的数据类型

Chisel定义了自己的一套数据类型,读者应该跟Scala的九种基本值类区分开来。而且Chisel也能使用Scala的数据类型,但是Scala的数据类型都是用于参数和内建控制结构,构建硬件电路还是得用Chisel自己的数据类型,在使用时千万不要混淆。当前Chisel定义的数据类型如下图所示,其中绿色方块是class,红色是object,蓝色是trait,箭头指向的是超类和混入的特质: 

Chisel的数据类型关系图

所有数据类型都继承自抽象基类Data,它混入了两个特质HasId和NamedComponent。如果读者查看Chisel3的源代码,就会看到很多参数传递时都用下界表明了是Data的子类。在实际硬件构成里,并不会用到Data,读者也不用关心它的具体实现细节。更多的,应该关注Data类的两大子类:聚合类Aggregate和元素类Element。

聚合类Aggregate的常用子类是向量类Vec[T]和包裹类Bundle。Vec[T]类用于包含相同的元素,元素类型T可以是任意的Data子类。因为Vec[T]混入了特质IndexedSeq[T],所以向量的元素能从下标0开始索引访问。Bundle类用于被自定义的类继承,这样自定义的类就能包含任意Data的子类对象,常用于协助构造模块的端口,故而衍生出了一些预定义的端口子类。混合向量类MixedVec[T]是Chisel3.2以上版本添加的语法,它与Vec[T]的不同在于可以包含不同类型的元素。

Element类衍生出了Analog、Bits和Clock三个子类,单例对象DontCare和特质Reset。Analog用于在黑盒中模拟inout端口,目前在实际Chisel里并无其他用途。Bits类的两个子类SInt和UInt是最常用的两个数据类型,它们是用补码表示的有符号整数和无符号整数。不仅用来协助定义端口位宽,还用来进行赋值。FixedPoint类提供的API带有试验性质,而且将来可能会发生改变,所以不常用。Bool类是Chisel自己的布尔类型,区别于Scala的Boolean。Bool类是UInt类的子类,因为它可以看成是1bit的UInt,而且它被混入Reset特质,因为复位信号都是用Bool类型的线网或寄存器使能的。此外,Bits类混入了特质ToBoolable,也就是说FixedPoint、SInt和UInt都能转换成多bit的Bool类型。Clock类表示时钟,Chisel里的时钟是专门的一个类型,并不像Verilog里那样是1bit的线网。复位类型Reset也是如此。单例对象DontCare用于赋值给未驱动的端口或线网,防止编译器报错。

三、数据字面量

能够表示具体值的数据类型为UInt、SInt和Bool。实际可综合的电路都是若干个bit,所以只能表示整数,这与Verilog是一致的。要表示浮点数,本质还是用多个bit来构建,而且要遵循IEEE的浮点标准。对于UInt,可以构成任意位宽的线网或寄存器。对于SInt,在Chisel里会按补码解读,转换成Verilog后会使用系统函数$signed,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十七章 Chisel基础——数据类型 的相关文章

随机推荐

  • 【C++】教大家在七夕new一个对象

    new是啥 new 是C 的关键字之一 它一般用来在堆上创建对象 但它与一般的创建对象的方法不同 它在创建对象时 会返回这个对象的指针 堆是啥 还有 和栈有什么区别 栈是由编译器自动分配和释放的 一般存放函数的参数值 局部变量的值等 速度较
  • c++primer 第十七章笔记 01tuple类型

    tuple类型 tuple看作一个 快速而随意 的数据结构 三个成员都设置为0 tuple
  • flowable实战(四):构建命令行程序

    实际上前面那些都是前置知识 真正上手的话其实还是一脸懵的情况 这里我也是按照文档生成一个最简单的demo 这个demo就是一个简单的Maven工程 你只要启动main方法就可以看到效果 github实例代码地址 这里如果直接下载代码 如果不
  • TCP的乱序和丢包判断(附Reordering更新算法)-实例case

    写前一篇文章TCP的乱序和丢包判断 附Reordering更新算法 理论的时候 我觉得我在一边拉一边吃 玩的都是排泄物 言之无味 不知所云 我想把一些能看得见摸得着的东西独立出来 就成了本文 如果有一天我忘掉了TCP的细节 我想我直接把本文
  • ADB无线连接/wifi调试 安卓设备

    一般 对android设备使用adb命令前 需要先用数据线连接设备后 才可以继续使用 此篇文章 我们来讲另外一种android设备的连接方式 无线连接 一 无线连接设置的具体步骤如下 第一步 先用USB数据线 将手机和电脑连接在一起 1 数
  • Python兼职接单也能月入过万,整理了70个练手的小项目,赶快学起来

    下面是一些的python兼职单子截图 心动了吗 快去抓紧时间学习起来吧 上述这份完整版的Python全套学习资料已经上传CSDN官方 朋友们如果需要可以直接划到文末免费领取 保证100 免费 关于Python技术储备 学好Python 不论
  • SpringSecurity学习笔记(一)springSecurity的整体架构

    参考视频 编程不良人 1 什么是SpringSecurity 首先我们要知道SpringSecurity是Spring家族中的一员 是基于spring框架提供的一套web应用安全性的完整解决方案 包括可高度定制的认证 授权 鉴权等一系列的流
  • 元宇宙沉浸式互动展示系统开发定制平台

    2021年公认是元宇宙元年 今年元宇宙的发展更是得到了社会各界的广泛关注 元宇宙首次被写入地方 十四五 规划 各大数字科技巨头 政府机构也都纷纷入局元宇宙 随着元宇宙的变现能力和商业化前景已经得到证实 元宇宙概念与广告营销业的深度融合优势开
  • 计算机毕业设计ssm基于java语言的自行车在线租赁系统k22rh9 (附源码)轻松不求人

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 ssm mybatis Ma
  • Java 自定义注解及使用场景

    Java自定义注解一般使用场景为 自定义注解 拦截器或者AOP 使用自定义注解来自己设计框架 使得代码看起来非常优雅 本文将先从自定义注解的基础概念说起 然后开始实战 写小段代码实现自定义注解 拦截器 自定义注解 AOP 一 什么是注解 A
  • 小程序+uniapp部分问题

    微信小程序showModal中content的内容如何换行 在需要换行的位置加上 r n 即可实现内容的换行 注 微信开发者工具可能看不到效果 但是真机实测是会换行的 wx showModal title 提示 content 未达到最低使
  • 百度云加速配置SSL证书方法

    配置前提 确保域名在HTTP普通网站可以正常打开 并且域名已经解析到百度加速 一 登录沃通数字证书商店下载 SSL证书文件并且解压 选择nginx文件夹 百度云加速只需要用到nginx文件夹 二 登录百度云加速 https su baidu
  • 子系统 Arch Linux

    去年 还是前年不记得了 微软推出了子系统 官方支持的是Ubuntu 由于我对Ubuntu这样的重量级Linux没啥好感 当时只是安装了一下 就没怎么玩了 现在又有机会重新安装了Win10 去年在Arch社区得知Github上有关于Arch子
  • java Json转string方法

    Java中Json转string方法 Java利用Json lib包进行json对象转换成string JSONArray转换string方法实例 public static void main String args throws JSO
  • springboot配置类编写

    以配置一个DataSource为例 其他的类似 接下来我就给大家介绍具体步骤 1 首先写两个类 并添加注解 ConfigurationProperties 表明这是一个配置类 其中一个为dataSource的配置类 一个为jdbc的配置类
  • 为什么docker容器启动不了?

    sudo docker run d centos bin bash创建容器之后 使用docker ps a 发现容器已经停止 再使用docker start id 启动容器之后 观察ps a 的操作时间 发现容器其实已经启动过 但是马上就停
  • wsl 修改 hostname

    我在使用Windows 的 wsl 功能的时候发现在默认情况下 wsl 的 hostname 是和当前 windows 系统的主机名称保持一致的 当我尝试使用 hostname 修改主机名时 发现并不能完全修改 在重新进入后又会恢复成原来的
  • IDEA忽略文件,防止git提交不想提交的文件的探索

    使用IDEA开发有 一段时间了 从陌生到熟悉的过程算是很平稳的度过 感谢IntelliJ IDEA交流群 群号244908708 里面的群友对我提供的帮助 感谢群主的github上面提供的资料 这篇文章是探索git忽略文件提交的一些方面的研
  • 麦克风音频服务器未响应,耳机和麦克风都没坏,插上电脑后为什么不能语音聊天?...

    耳机和麦克风都没坏 插上电脑后为什么不能语音聊天 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 耳机和麦克风都没坏 插上电脑后为什么不能语音聊天 先确认你的电脑
  • 第十七章 Chisel基础——数据类型

    一 Chisel的常见问题 在学习Chisel前 应该熟悉一些常见问题 这些问题在编写Chisel的任何时候都应该牢记 Chisel是寄宿在Scala里的语言 所以它本质还是Scala 为了从Chisel转变成Verilog 语言开发人员开