当前位置: 首页 > 编程日记 > 正文

芯片开发语言:Verilog 在左,Chisel 在右

来源 | 老石谈芯

在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为“香山”的开源高性能处RISC-V处理器。前不久我有幸和包老师就这个事情做了一次深度的交流,我们聊了关于RISC-V、还有“香山”处理器的前世今生。包老师也分享了很多他关于开源硬件、新型开发语言、硬件敏捷设计、还有处理器基础架构等等这些问题的想法和学术思考,我深受启发。

包云岗是中科院计算技术研究所研究员、副所长,先进计算机系统研究中心主任,中国科学院大学特聘教授,中国开放指令生态(RISC-V)联盟秘书长。他的主要研究领域为云计算数据中心体系结构、开源处理器芯片敏捷设计等。

我把我们的对话进行了整理和采编,以飨读者。第一篇在这里,本文是第二篇,主要是包老师对硬件敏捷开发的新兴开发语言与工具的思考。

注:以下的“我”,指的都是包云岗研究员。

为什么用Chisel

老石按:

在传统的数字芯片开发里,绝大多数设计者都会使用诸如Verilog、VHDL或者SystemVerilog的硬件描述语言(HDL)对电路的行为和功能进行建模。但是在香山处理器里,团队选择使用Chisel作为主要开发语言。这是基于怎样的考虑?

Chisel是基于Scala这个函数式语言来扩展出来的,我们可以把它看做是一个用来描述电路的领域专用语言,它和Verilog还是有很大区别的。

事实上,我们自己也做过两种语言的对比。在2016年,我们整个团队开始决定用RISC-V去实现标签化体系结构,也在那个时候开始接触Chisel。最早的时候我们重用了UC伯克利开发了的名叫Rocket的开源内核。这是个顺序执行的小核,我们在它上面加上了我们的标签机制,这期间其实就有很多的一些开发体会。

Rocket chip generator的系统架构图

前面提到我们的同学原来对Verilog很熟,但是用Chisel以后就会有一种爱不释手的感觉。有好多的通信,特别是年轻的同学,他们都愿意去尝试使用Chisel。有一个北大的研究生,他在做报告的时候讲,你用了Chisel以后就再也回不去了。

其实,我们自己还做过量化的评估。在2018年,我们团队里有两个本科生和一个工程师做过一个实验。这个实验是要开发一个L2 Cache,但是要集成到RISC-V的内核里。我们的工程师是用Verilog来开发的,他对Cache非常熟悉。他把OpenSPARC里面的Cache、还有Xilinx提供的Cache等等都研究过,代码都读得很透。所以他用Verilog开发,并且接到RISC-V里面去。当时他花了应该是6个星期开发,包括测试框架等等,一共写了5000多行代码。即便这样,后面还是有一些问题和Bug。

另外,我们当时有一位大四的本科生,现在也是香山的核心成员,他懂一些计算机体系结构,使用Chisel有9个月的时间。同样的任务,他用Chisel开发只花了三天时间就写出来了。把设计接到RISC-V核里面之后,还能够正常工作。之后又进一步就把DMA调通了,就能够支持像网卡这样的一些DMA的数据的传输。这个给我们留下了很深刻的印象。

表格来源:《芯片敏捷开发实践:标签化RISC-V》

我们觉得,本科生使用Chisel做的设计,哪怕是性能或者各方面差了一些,但他只用了三天时间。这样我们就可以快速去验证,并且实现我们的想法。

当然这个只是第一组实验。我们当时有一个群,在群里面吵的还是挺不可开交的,因为我们的工程师那个时候很不服气,他就觉得他的代码各方面都质量更高。所以我们后来又有另外一位中国科学院大学的大四本科生,他懂Verilog、但是没学过Chisel,所以他做的事情就是读我们工程师的Verilog代码,并把核心代码一行一行翻译成Chisel,最后要通过工程师写的测试。也就是说,翻译后的Chisel和Verilog实现的逻辑功能是完全一致的。

翻译完之后,再在同一个FPGA上面评估,看设计的PPA、 频率、功耗,还有使用的资源等等。这样下来的话,你就会看到其实出来的指标上面,大多数的指标实际都是Chisel还反而更好一些,代码量也会比他要小。

这还只是第一个阶段。后面我们的本科生又在博士生的指导下,把Chisel里面的高级特性给它加进去,结果一下子就完全超越Verilog的版本了,代码量大概只有Verilog的1/4~1/5,有些逻辑资源可以减少百分之六七十。所以那时候这组数据出来以后,工程师就他也觉得服气了。

表格来源:《芯片敏捷开发实践:标签化RISC-V》

Chisel vs 高层次综合

老石按:

在FPGA里高层综合是一个非常热、非常流行的一个研究方向。但是我知道Chisel和高层次综合可能并不是一回事。在Chisel官网上也明确的指出:我不是高层次综合。但在我看来,它们背后的思维方式、或者是大的方向是有共同之处的,也就是让硬件开发更加的快速、更加敏捷。也就是像您刚才说的,从想法到实现,周期更加缩短。

但是从高层综合的角度来看,虽然学术界一直在讲高层次综合已经很多年的时间,它实际的商业化可能还是需要特别突破性的进展。现在业界的这些设计,比如大的网络设计、还有数据中心加速器的这些设计,仍然是基于SystemVerilog/Verilog/VHDL这样的RTL语言。这主要是因为高层次综合有这么几个问题:

第一个就是HLS可能并不能覆盖掉的全部应用领域,也就是说它可能适合于某些应用领域,但是对于这种吞吐量比较大的、或者高速数据包处理这些应用,它可能就不那么适合。

另外一个就是它的验证。因为它相当于在RTL顶上加了一层额外的高层次语言,等它综合或者处理完了以后,还是生成底层的RTL语言,然后再走原来的FPGA的这些开发流程。所以在验证过程中,增加额外的这层可能会给验证工作造成很大的问题。所以关于这两点您怎么看?

我想其实它的通用性方面是没有问题的。Chisel本身是一个硬件描述语言,所以从它的这种完备性来看的话,它跟Verilog是一样的。也就是说,Verilog能干什么事,Chisel也能干什么事,这两个是没有什么区别的,它只不过是另外一种语法表达而已。

调试是很多人都担心的一个问题。因为Chisel它现在其实是一个源到源的翻译,是首先是基于Scala这套语法去写一个硬件的描述。然后通过FIRRTL进行翻译。再往后走的话,其实是用Verilog那套流程去做,最后生成GDSII版图。

所以在这个过程当中,其实是明显的分成两个阶段了。前面一个阶段Chisel到Verilog,第二阶段就是Verilog到GDSII版图。

我们用Chisel已经流过三颗芯片,有大的芯片、有的小的芯片,有单核的有8核的。在早期的时候,我们其实也遇到过这样的一些问题。比如你用Chisel写的代码生成了Verilog,Verilog里面有一些变量,你那边在Chisel里面改一行代码,那它这个变量就全部重新改变。后来其实仔细分析以后,我们发现这些问题都是可以有一些办法来解决的,或者说它不是阻碍可调试性的最根本的问题。所以后面我们在做香山的时候,我们在这些方面已经处理得比较好了。

就像我们有同学,他自己开发了一个工具,可以把电路波形直接转变成一个上层的高级的事件。这个时候他其实就用了Chisel和FIRRTL里面的特性。

因为FIRRTL它有点像LLVM,它可以放很多的这样自己设计的模块,FIRRTL也可以定义自己需要的功能。这个在LLVM里叫pass,在FIRTEL里叫transformer。

有了这些工具,就可以让Chisel源码和下面波形建立起联系,让调试的过程甚至比原来用Verilog还要方便。

除了这个工具,同学们还自定义和扩展了一些printf,让我们在调的时候很多时候根本不用去看波形。这些都得益于Chisel的强大和开放。

(注:本文不代表老石任职单位的观点。)

在评论区留言你对本文技术的看法

AI科技大本营将选出三名优质留言

携手【北京大学出版社】送出

《硬件十万个为什么(无源器件篇)》一本

截至7月27日14:00点

更多精彩推荐
大手笔 !Julia Computing 获 2400 万美元融资,前 Snowflake CEO 加入董事会二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货KNN 分类算法原理代码解析

相关文章:

1.1GTK+ 的简单程序HelloWorld

1.1GTK 的简单程序HelloWorld 编译执行如图所看到的:

struts2 validate验证

转自:https://blog.csdn.net/houpengfei111/article/details/9038233 自定义拦截器 要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: [java] view plaincopypublic class PermissionInterceptor implements Interceptor { …

PHP中文乱码

页面顶端加 <?php header("content-Type: text/html; charsetgbk"); ?>

收藏 | 提高数据处理效率的 Pandas 函数方法

作者&#xff1a;俊欣来源&#xff1a;关于数据分析与可视化前言大家好&#xff0c;这里是俊欣&#xff0c;今天和大家来分享几个Pandas方法可以有效地帮助我们在数据分析与数据清洗过程当中提高效率&#xff0c;加快工作的进程&#xff0c;希望大家看了之后会有收获。首先导入…

如何让两个div在同一行显示?一个float搞定

最近在学习div和css&#xff0c;遇到了一些问题也解决了很多以前以为很难搞定的问题。比如&#xff1a;如何让两个div显示在同一行呢&#xff1f;&#xff08;不是用table表格&#xff0c;table对SE不太友好&#xff09;其实&#xff0c;<div> 是一个块级元素&#xff0c…

使用sudo进入root权限,以及防止root密码被恶意篡改

一、前言 sudo是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;减少了root用户的登陆和管理时间&#xff0c;提高了安全性。Sudo不是对shell的一个代替&#xff0c;它是面向每个命令的。 而防止root用户密码被恶意更改&#xff0c;主要是用户基本上…

赠书 | 干货!用 Python 动手学强化学习

01了解强化学习新闻报道中很少将强化学 习与机器学习、深度学习、人工智能这些关键词区分开来&#xff0c;所以我们要先介绍什么是强化学习&#xff0c;再讲解其基本机制。强化学习与机器学习、人工智能这些关键词之间的关系&#xff1b;强化学习相对于其他机器学习方法的优点和…

php如何调用c接口无错版

1.首先是要安装好PHP 2.进入PHP的下载解压目录下的ext目录 #cd /root/php-5.3.6/ext #./ext_skel --extnamehmc 说明&#xff1a; ./ext_skel --extnamemodule_name module_name是你自己可以选择的扩展模块的名字&#xff0c;例如我选择的hmc。执行工具后会自动在ext目录下建…

onchange事件只生效一次的问题

今天遇到一个file表单元素&#xff0c;对onchange事件的响应问题&#xff0c;发现仅响应一次&#xff0c;网上查到解决方法&#xff0c;在这里转载一下文件选择框的onchange事件只在第一次改变时生效&#xff0c;以后再选择文件不会触发onchange事件。解决方法1&#xff1a;用j…

WSFC2016 SMB多通道与网络调校

SMB多通道是微软Windows Server 2012时新增的一项功能&#xff0c;微软SMB3.0协议的一部分&#xff0c;主要用于SMB文件传输时&#xff0c;检测到多张可通信网卡&#xff0c;自动使用多张网卡进行传输&#xff0c;提高吞吐量&#xff0c;链路容错。 Windows Server 2012和之前的…

一个常用的正则表达验证类

这是 風語深蓝很早以前写的一个正则表达式验证工具类&#xff0c;包含了一些常见的校验和支持自定义的正则表达式匹配&#xff0c;可以选择完全匹配&#xff0c;也可以获取所有匹配项。曾用它仿造Eclispe下的正则表达式插件写过一个工具。因为最近突然有几个朋友都在问这方面的…

Signal和slot的声明和连接

信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分。这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来。Signal和slot的声明&#xff08;一&#xff09;在Qt程序设计中&#xff0c;凡是包含signal和slot的类中都要加上Q_OBJECT的定义&#xff0c;下面的例子给出了…

重磅!深度学习知识总结和调参技巧开放下载了

近年来&#xff0c;人工智能正在进入一个蓬勃发展的新时期&#xff0c;这主要得益于深度学习和CV领域近年来的发展和成就。在这其中&#xff0c;卷积神经网络的成功也带动了更多学术和商业应用的发展和进步。为了避免“内卷”&#xff0c;更多人选择学习进阶&#xff0c;但是仍…

Oracle优化器:星型转换

Oracle 8i中引入了星型转换(star transformation)的优化器新特性以便更有效地处理星型查询。星型查询语句多用于基于星型模型设计的数据仓库应用中。星型模型的称谓源于该种模型以图形化表现时看起来形似一颗海星。这颗星的中央会由一个或多个事实表(fact tables)组成&#xff…

php安装模式mod_php和Fastcgi的选择与对比

安装php又面临到了模式的选择&#xff0c;以前都是选择mod_php模式&#xff0c;因为这样安装比较方便哈&#xff0c;今天突然关心起FastCGI这种模式&#xff0c;败毒了一把&#xff0c;找到了一些关于mod_php和Fastcgi的选择与对比这方面的讨论&#xff0c;现在发出来留一个记号…

暴雨之后,评估与重建可以用这个数据集

作者&#xff1a;神经星星来源&#xff1a;HyperAI超神经场景描述&#xff1a;连续多日的暴雨给郑州和河南部分城市&#xff0c;带来了严重的洪涝灾害&#xff0c;牵动了全国人民的心。灾难面前&#xff0c;现阶段的科技和具体解决方案&#xff0c;也能发挥出关键作用。关键词&…

从jQuery的缓存到事件监听

很久以前&#xff0c;我还在cnblogs里面逛的时候就提出过一个问题&#xff08;刚找了半天没找到&#xff09;。不知道大家有没有发现&#xff0c;用jQuery选择器"选择"之后的DOM上会添加jQuery*********属性。 <DIV idd1 jQuery1294122065250"1">abc…

对一些品种数量校正

update sphwph set shl1-1 where spidSPH00002323 and piciJHAYMA00017433_5 and hwHWI00000022 update sphwph set shl-11 where spidSPH00002323 and piciJHAYMA00021159_2 and hwHWI00000022 3月7日调拨后少了398 update sphwph set shl0398 where piciJHAYMA00024241_1 an…

收藏喜+1!值得使用的100个Python小技巧

目前Python可以说是非常流行&#xff0c;在目前的编程语言中&#xff0c;Python的抽象程度是最高的&#xff0c;是最接近自然语言的&#xff0c;很容易上手。你可以用它来完成很多任务&#xff0c;比如数据科学、机器学习、Web开发、脚本编写、自动化等。下面&#xff0c;给大家…

一款基jquery超炫的动画导航菜单

今天给大家分享一款基jquery超炫的动画导航菜单。这款导航菜单&#xff0c;初始时页面中间一个按钮&#xff0c;单击按钮&#xff0c;菜单从左侧飞入页中。再次单击按钮&#xff0c;导航飞入左侧消息。动画效果很非常炫。一起看下效果图&#xff1a; 在线预览 源码下载 实现的…

如何用C#动态编译、执行代码

在开始之前&#xff0c;先熟悉几个类及部分属性、方法&#xff1a;CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。  一、CSharpCodeProvider    提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码&#xff0c;可…

【解决】MySql 5.6 运行崩溃错误

【解决】MySql 5.6 运行崩溃错误 最近弄了一台云主机&#xff0c;配置是20G磁盘空间&#xff0c;1G运行内存的Linux服务器。在上面安装了LAMP&#xff08;RHEL7.2Apache2.4MySql5.6PHP5.6&#xff09;&#xff0c;然后搭建wordpress网站&#xff0c;可是网站运行没多久&#xf…

制作安全网站的checklist

原作者charlee、原始链接 http://tech.idv2.com/2008/04/19/secure-website-checklist/ fcicq最近在IPA上看到一篇安全相关的文章&#xff0c;它的最末尾有个checklist&#xff0c;于是催我把它翻译了。前几天比较忙&#xff0c;周末没什么事儿了&#xff0c;就翻译一下吧。 原…

百变冰冰!手把手教你实现CVPR2021最新妆容迁移算法

作者&#xff1a;小潘师兄来源&#xff1a;AI算法与图像处理简介在本文中&#xff0c;我们从不同的角度将妆容迁移问题分解为两步提取-分配过程。为此&#xff0c;我们提出了一种基于风格的可控GAN模型&#xff0c;该模型由三个部分组成&#xff0c;每个部分分别对应于目标风格…

Vlan 4096的限制原因

为什么80%的码农都做不了架构师&#xff1f;>>> VLAN配置的最大可能值为4094&#xff0c;它的由来如下所述&#xff1a; IEEE802.1q协议也就是“Virtual Bridged Local Area Networks”&#xff08;虚拟桥接局域网&#xff0c;简称虚拟局域网&#xff09;协议&#…

Hive 数据模型

Hive 数据模型 Hive 数据表有五种类型&#xff1a;内部表&#xff0c;外部表&#xff0c;分区表&#xff0c;桶表&#xff0c;视图表&#xff0c;默认以 tab 分隔 * MySQL (Oracle) 表默认以逗号分隔&#xff0c;因此&#xff0c;要想导入 MySQL(Oracle) 数据&#xff0c;需要设…

完整中英文世界国家级联下拉列表插件【前端版】

为什么80%的码农都做不了架构师&#xff1f;>>> 这个小东西是之前小项目上临时增加功能的产物&#xff0c;那时候在网上找了很久都没有能用的插件&#xff0c;要么是数据残缺少得可怜&#xff0c;还有就是实现手段非常低效不可维护那种&#xff0c;各种奇拔问题&am…

何时使用margin和padding?

margin和padding的意义相信大家都很清楚&#xff0c;可是在具体应用中&#xff0c;到底应该使用哪一个&#xff0c;就比较难于判断了。 这篇文章 说得挺清楚的&#xff0c;在这里翻译一下&#xff0c;供参考。 何时应当使用margin 需要在border外侧添加空白时。 空白处不需要…

10年IT老兵给新人程序员的几点建议

【CSDN 编者按】对于很多计算机专业的同学而言&#xff0c;“进大厂”已经成为毕业后职业道路的首选。但是面试官最喜欢什么样的应届生你知道吗&#xff1f;在校期间应该为找工作做哪些准备&#xff1f;除了技术好&#xff0c;在职场中还有哪些必备软实力&#xff1f;今天&…

asp.net文件上传下载的简单实现

使用FileUpload上传&#xff1a; protected void btnUpload_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { /*通过文件扩展名判断文件类型*/ string fileExt System.IO.Path.Ge…