搜索
当前位置: 秒秒彩官网 > 读入原语 >

第十九章 Chisel基础——常用的硬件原语

gecimao 发表于 2019-06-27 16:34 | 查看: | 回复:

  前两章介绍了基本的数据类型和硬件类型,已经足够编写基本的小规模电路。至于要如何生成Verilog,会在后续章节讲解。如果要编写大型电路,当然也可以一砖一瓦地搭建,但是费时费力,完全体现不出软件语言的优势。Chisel在语言库里定义了很多常用的硬件原语,读者可以直接导入相应的包来使用。让编译器多干活,让程序员少费力。

  因为多路选择器是一个很常用的电路模块,所以Chisel内建了几种多路选择器。第一种形式是二输入多路选择器“Mux(sel, in1, in2)”。sel是Bool类型,in1和in2的类型相同,都是Data的任意子类型。当sel为true.B时,返回in1,否则返回in2。

  因为Mux仅仅是把一个输入返回,所以Mux可以内嵌Mux,构成n输入多路选择器,类似于嵌套的三元操作符。其形式为“Mux(c1, a, Mux(c2, b, Mux(..., default)))”。第二种就是针对上述n输入多路选择器的简便写法,形式为“MuxCase(default, Array(c1 - a, c2 - b, ...))”,它的展开与嵌套的Mux是一样的。第一个参数是默认情况下返回的结果,第二个参数是一个数组,数组的元素是对偶“(成立条件,被选择的输入)”。MuxCase在chisel3.util包里。

  第四种是chisel3.util包里的独热码多路选择器,它的选择信号是一个独热码。如果零个或多个选择信号有效,则行为未定义。其形式如下:

  内建的多路选择器会转换成Verilog的三元操作符“? :”,这对于构建组合逻辑而言是完全足够的,而且更推荐这种做法,所以when语句常用于给寄存器赋值,而很少用来给线网赋值。读者可能习惯用always语句块来编写电路,但这存在一些问题:首先,always既可以综合出时序逻辑又能综合出组合逻辑,导致reg变量存在二义性,常常使得新手误解reg就是寄存器;其次,if...else if...else不能传播控制变量的未知态x(某些EDA工具可以),使得仿真阶段无法发现一些错误,但是assign语句会在控制变量为x时也输出x。工业级的Verilog,都是用assign语句来构建电路。时序逻辑也是通过例化触发器模块来完成的,相应的端口都是由assign来驱动,而且触发器会使用SystemVerilog的断言来寻找always语句里的x和z。整个设计应该尽量避免使用always语句。

  在这个例子里需要提的一点是,Vec[T]类的apply方法不仅可以接收Int类型的索引值,另一个重载版本还能接收UInt类型的索引值。所以对于承担地址、计数器等功能的部件,可以直接作为由Vec[T]构造的元素的索引参数,比如这个例子中根据sel端口的值来选择相应地址的ROM值。

  由于现代的FPGA和ASIC技术已经不再支持异步读RAM,所以这种RAM会被综合成寄存器阵列。第二种RAM则是同步(时序)读、写,通过工厂方法“SyncReadMem[T : Data](size: Int, t: T)”来构建,这种RAM会被综合成实际的SRAM。在Verilog代码上,这两种RAM都是由reg类型的变量来表示的,区别在于第二种RAM的读地址会被地址寄存器寄存一次。例如:

  其中DontCare告诉Chisel的未连接线网检测机制,写入RAM时读端口的行为无需关心。

  要综合出实际的SRAM,读者最好了解自己的综合器是如何推断的,按照综合器的推断规则来编写模块的端口定义、时钟域划分、读写使能的行为等等,否则就可能综合出寄存器阵列而不是SRAM。以Vivado 2018.3为例,下面的单端口SRAM代码经过综合后会映射到FPGA上实际的BRAM资源,而不是寄存器:

  Vivado的BRAM最多支持真·双端口,按照对应的Verilog模板逆向编写Chisel,然后用编译器把Chisel转换成Verilog。但此时编译器生成的Verilog代码并不能被Vivado的综合器识别出来。原因在于SyncReadMem生成的Verilog代码是用一级寄存器保存输入的读地址,然后用读地址寄存器去异步读取RAM的数据,而Vivado的综合器识别不出这种模式的RAM。读者必须手动修改成用一级寄存器保存异步读取的数据而不是读地址,然后把读数据寄存器的内容用assign语句赋值给读数据端口,这样才能被识别成真·双端口BRAM。尚不清楚其它综合器是否有这个问题。经过咨询SiFive的工作人员,对方答复因为当前转换的代码把延迟放在地址一侧,所以流水线的节拍设计也是根据这个来的。考虑到贸然修改SyncReadMem的行为,可能会潜在地影响其它用户对流水线的设计,故而没有修改计划。如果确实需要自定义的、对综合器友好的Verilog代码,可以使用黑盒功能替代,或者给Firrtl编译器传入参数,改用自定义脚本来编译Chisel。

  RAM通常都具备按字节写入的功能,比如数据写入端口的位宽是32bit,那么就应该有4bit的写掩模信号,只有当写掩模比特有效时,对应的字节才会写入。Chisel也具备构建带写掩模的RAM的功能。

  当构建RAM的数据类型为Vec[T]时,就会推断出该RAM具有写掩模。此时,需要定义一个Seq[Bool]类型的写掩模信号,序列的元素个数为数据写入端口的位宽除以字节宽度。而write方法有一个重载版本,就是第三个参数是接收写掩模信号的。当下标为0的写掩模比特是true.B时,最低的那个字节会被写入,依次类推。下面是一个带写掩模的单端口RAM:

  第一个参数是MemBase[T]类型的,也就是Mem[T]和SyncReadMem[T]的超类,该参数接收一个自定义的RAM对象。第二个参数是文件的名字及路径,用字符串表示。第三个参数表示读取的方式为十六进制或二进制,默认是MemoryLoadFileType.Hex,也可以改成MemoryLoadFileType.Binary。注意,没有十进制和八进制。

  该方法其实就是调用Verilog的系统函数“$readmemh”和“$readmemb”,所以要注意文件路径的书写和数据的格式都要按照Verilog的要求书写。最好把数据文件放在resources文件夹里。例如:

  在用Verilator仿真时,它会识别这个Chisel代码,从文件读取数据。

  计数器也是一个常用的硬件电路。Chisel在util包里定义了一个自增计数器原语Counter,它的工厂方法接收两个参数:第一个参数是Bool类型的使能信号,为true.B时计数器从0开始每个时钟上升沿加1自增,为false.B时则计数器保持不变;第二个参数需要一个Int类型的具体正数,当计数到该值时归零。该方法返回一个二元组,其第一个元素是计数器的计数值,第二个元素是判断计数值是否等于期望值的结果。工厂方法的另一个重载版本没有使能信号。

  如果要产生伪随机数,可以使用util包里的16位线性反馈移位寄存器原语LFSR16,它接收一个Bool类型的使能信号,用于控制寄存器是否移位,缺省值为true.B。它返回一个UInt(16.W)类型的结果。例如:

  状态机也是常用电路,但是Chisel没有直接构建状态机的原语。不过,util包里定义了一个Enum特质及其伴生对象。伴生对象里的apply方法定义如下:

  它会根据参数n返回对应元素数的List[UInt],每个元素都是不同的,所以可以作为枚举值来使用。最好把枚举状态的变量名也组成一个列表,然后用列表的模式匹配来进行赋值。有了枚举值后,可以通过“switch…is…is”语句来使用。其中,switch里是相应的状态寄存器,而每个is分支的后面则是枚举值及相应的定义。例如检测持续时间超过两个时钟周期的高电平:

  注意,枚举状态名的首字母要小写,这样Scala的编译器才能识别成变量模式匹配。它生成的Verilog为:

  本章介绍了Chisel内建的常用原语,还有更多原语可以使用,比如Bundle衍生的几种端口类,读者可以通过查询API或源码来进一步了解。

  Chisel在构建硬件的思路上类似Verilog。在Verilog中,是以“模块(module)”为基本单位组成一个完整的独立功能实体,所以Chisel也是按模块划分的,只不过不是用关键字“modul...博文来自:的博客

  经过前三章的内容,读者已经了解了如何使用Chisel构建一个基本的模块。本章的内容就是在此基础上,把一个Chisel模块编译成Verilog代码,并进一步使用Verilator做一些简单的测试。一、生...博文来自:的博客

  Chisel的基本概念Chisel硬件表达Chisel只支持二进制逻辑,不支持三态信号。Chisel数据类型和数据字面量Chisel数据类型数据类型用于指定状态元素中保存的值或wire上传输的值。Ch...博文来自:Guardian_Bud

  chisel入门踩坑。填补了Berkeley文档中没有说清楚的地方。博文来自:ds1231h的博客

  在Java并发编程中,常常出现一些因为线程安全问题而需要加锁来保证同步,而在Java5之后,出现了新的并发包,它的出现使得同步效率更加高效,而所有concurrent包的理论基础都是基于硬件同步原语理...博文来自:iteye_5555的博客

  Chisel是由伯克利大学发布的一种开源硬件构建语言,通过使用高度化的参数生成器和分层的专用硬件设计语言来支持高级硬件设计。重要特性:内嵌Scala编程语言层次化+面向对象+功能构建使用Scala中的...博文来自:专注计算机体系结构

  一、Chisel的常见问题在学习Chisel前,应该熟悉一些常见问题,这些问题在编写Chisel的任何时候都应该牢记。①Chisel是寄宿在Scala里的语言,所以它本质还是Scala。为了从Chis...博文来自:的博客

  因为Chisel的功能相对Verilog来说还不完善,所以设计人员在当前版本下无法实现的功能,就需要用Verilog来实现。在这种情况下,可以使用Chisel的BlackBox功能,它的作用就是向Ch...博文来自:的博客

  笔者目前西安交通大学微电子硕士在读,研究方向为数字集成电路设计与体系结构。鉴于目前RISC-V的火热程度,笔者参与了课题组的RISC-V项目,并了解、学习了颇受关注的新型硬件构建语言——Chisel,...博文来自:的博客

  线程原语线程概念线程(thread),有时被称为轻量级进程(LightweightProcess,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成...博文来自:

  一句话总结:个人理解成原子语句,不可分割,要么不执行,要么全部执行。摘自百度百科:原语通常由若干条指令组成,用来实现某个特定的操作。通过一段不可分割的或不可中断的程序实现其功能。原语是操作系统的核心,...博文来自:

  一.开发板的存储系统参考:二.开发板上的arm处理器注:     CPU(累加器)的要...博文来自:

  泛型什么是受限泛型类型?不能使用newE();不能使用newe[];静态方法中不允许类的参数是泛型;异常类不能是泛型;什么是原始类型?原始类型为什么是不安全的?为什么Java中允许使用原始类型?什么是...博文来自:

  本章讲解的内容比较繁杂,没有一个统一的中心思想。这些问题与实际编程没有太大关系,但是读者需要稍微留意。一、动态命名模块Chisel可以动态定义模块的名字,也就是转成Verilog时的模块名不使用定义的...博文来自:

  Scala语言简介Scala语言是一门基于JVM的编程语言Scala是也一门编译型的语言,它也是先编译成class,所以它可以与Java无缝整合。因为都是在JVM上运行。Scala2.10.4每个技术...博文来自:

  了解Scala是一门承载嵌入式DSL的优秀语言 具有强大而优雅的库,由于操作各类数据集合 具有强大类型系统,有助于在开发周期早期发现大量错误 具有强大的表达和传递函数的方法变量和常量-val和varv...博文来自:

  前面我们已经定义了模块,本节讨论如何运行和测试一个电路。Chisel可以翻译得到C++或者Verilog。为了构建一个电路我们需要调用chiselMain,如下...博文来自:

  1.Chisel是硬件语言,所以最好每个when都跟着.otherwise2.寄存器中的数都是按照补码形式存的,所以在做tmp(63,32)这种截断取值时要格外注意,取出的是补码的相应位。3.Test...博文来自:

  1.首先你得有个linux,官方建议Ubuntu,搞个虚拟机是最方便的,目前在Windows开发,仿线.其次安装Java开发环境,建议安装java8,因为chisel的chisel-boot...博文来自:

  系列文章主要用来记录学习Chisel和scala过程中遇到的难点或知识点,这篇文章主要学习实例化模型和向量操作...博文来自:

  在《Chisel实验笔记(二)》中,通过编写TestBench文件,然后使用IcarusVerilog、GtkWave可以测试,查看相关波形,比较直观,在《Chisel实验笔记(三)》直接对得到C++...博文来自:

  对于进程的控制,通常来说不过是创建,执行,终止。linux对于这三类控制都有一类函数,是为进程控制原语一,创建原语:fork函数族1,fork()2,vfork二,执行(加载)原语:exec函数族1,...博文来自:

  Chisel的基本概念1、Chisel硬件表达此版本的Chisel只支持二进制逻辑,不支持三态信号。2、Chisel数据类型数据类型用于指定状态元素中保存的值或wire上传输的值。 类型有SInt,U...博文来自:

  Chisel语言学习1基本数据类型和操作系列文章主要用来记录学习Chisel和scala过程中遇到的难点或知识点:目录用[TOC]来生成目录:Chisel语言学习1基本数据类型和操作目录变量的声明与赋...博文来自:

  Chisel的数据类型用来指明在线上流动的信号(flowingonwire)、存储在状态元素(StateElement)中的值的类型。对应VerilogHDL线网型、寄存器型变量的类型。虽然数字电路最...博文来自:

  最近看到好多人在安装chisel的时候遇到各种问题安装不上,按照github的提示,查看了一些资料还是不行。因此写一下自己当时安装chisel时遇到的问题。希望对大家有所帮助。关于chisel命令的使...博文来自:

  在《Chisel实验笔记(一)》中我们得到了verilog文件,在《Chisel实验笔记(二)》中我们使用IcarusVerilog、GtkWave对的道德verilog文件进行了仿真测试,实际上,时...博文来自:

  和RISC-V相关的有如下一些开源项目: 工具链1、riscv-tools-基本上所有RISC-V相关工具链、仿真器、测试的宏项目,包含以下的项目riscv-gnu-toolchain-GNU工具链 ...博文来自:

  下面我们介绍一下进程控制进程控制操作呢,主要是完成了进程之间,进程的各状态之间的什么呀,转换那么进程控制操作实际上就是具有特定功能的程序 那么这个程序执行的时候呢,由于不允许被中断,所以呢,我们把它称...博文来自:

  Chisel是一个LLDB指令集合,用户辅助iOS应用差错。安装chisel的安装需要使用Homebrew,如果还没有安装Homebrew,可以使用下面的命令安装,如果你已经安装了,可以跳过这一步 ...博文来自:

  目录前言关中断硬件提供的原语test-and-setcompare-and-swapfetch-and-add后言前言 锁对于我来说是一个很难理解的机制,因为底层知识了解不够。只是在Java层面用过...博文来自:

  尝试学习Chisel语言,“工欲善其事,必先利其器”,因此先扫除环境问题。基础环境本笔记使用的基础环境是ubuntu16.04,Idea进行开发,在ubuntu中安装如下工具名称描述verilator...博文来自:

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...博文来自:

  本帖只谈技术实现,首先我们自己来编译一个比特币客户端吧, 技术讨论,欢迎大家入伙(注明:csdn)。...博文来自:

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:

  C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

  最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer...博文来自:

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:

  nginx是个好东西,Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl...博文来自:

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:

  Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。   在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 (...博文来自:

  我们在做项目的时候有时候需要给图片添加水印,水寒今天就遇到了这样的问题,所以搞了一个工具类,贴出来大家直接调用就行。/** * 图片工具类 * @author 水寒 * 欢迎访问水寒的个人博客:...博文来自:

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:

  1. 规则引擎面临的问题:业务规则的实现大部分是由开发人员来实现的 业务规则需要业务分析人员能够阅读和理解 业务规则的可读性和用户的友好性都不太好2. DSL领域特殊语言DSL == Domain...博文来自:

  树莓派开发系列教程7——树莓派做web服务器(nginx、Apache)

  若是研究区在中国,则在地理空间数据云有中国区合成好的数据,直接下载用即可。数据格式为TIF。坐标为WGS84,不用再转换投影。下载网址为:博文来自:

  teddybearw:异步FIFO在实际电路设计中非常有用。感谢您的分享! 有个问题向您请教,这个FIFO模块该如何测试呢?我尝试用第二十章的方法搭建测试平台,但是总有报错。

本文链接:http://k-mood.com/duruyuanyu/479.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部