[chisel]马上要火的硬件语言,快来了解一下优缺点

Chisel是什么?

Chisel的全称为Constructing Hardware In a Scala Embedded Language,是一个基于Scala的DSL(Domain Specific Language,特定领域专用语言)。2012年,加州大学伯克利分校(UC Berkeley)的Jonathan Bachrach等人在计算机体系结构会议DAC(Design Automation Conference)上发表了文章Chisel: Constructing Hardware in a Scala Embedded Language,对Chisel语言进行了详细的描述,参考Chisel的官方网站(https://www.chisel-lang.org/)描述:

The Constructing Hardware in a Scala Embedded Language (Chisel) is an open-source hardware description language (HDL) used to describe digital electronics and circuits at the register-transfer level that facilitates advanced circuit generation and design reuse for both ASIC and FPGA digital logic designs.

Chisel adds hardware construction primitives to the Scala programming language, providing designers with the power of a modern programming language to write complex, parameterizable circuit generators that produce synthesizable Verilog. This generator methodology enables the creation of re-usable components and libraries, such as the FIFO queue and arbiters in the Chisel Standard Library, raising the level of abstraction in design while retaining fine-grained control.

大致翻译如下:Chisel是一种开源,在RTL级别描述数字电子电路的硬件描述语言,能方便ASIC和FPGA的高级电路生成和设计重用。

Chisel将硬件构造原语添加到Scala编程语言中,为设计者提供了现代编程语言的能力,可以编写复杂的、可参数化的电路生成器,从而生成可综合的Verilog。这种生成器方法能够创建可重用的组件和库,例如Chisel标准库中的FIFO队列和仲裁器,从而提高设计中的抽象级别,同时保持精细的控制。

2,Chisel有什么优点?

1)拥有强大而优雅的库,包含各种数据集合。

2)具有严格的类型系统,有助于在开发周期的早期(编译时)捕获大量错误。例如代码整合时模块端口连接只需要一行语句就可以自动完成;在verilog中常见的位宽连线问题,在Chisel中可以不用申明位宽,编译器在编译过程中会自动推断其位宽,避免人为错误。

3)具有面向对象和强大的函数式编程方式。

3,Chisel如何工作?

目前Chisel需要先转换成verilog,大致流程大致如下:

1)Chisel编译器,首先将Chisel代码转换成AST中间数据;

2)Firrtl编译器,再将AST数据转换成Firrtl代码;

3)Firrtl编译器,将Firrtl代码转换成最终的Verilog代码。

以下是官网提供的一个例子:

import chisel3._

import chisel3.util._

class Blinky(freq: Int, startOn: Boolean = false) extends Module {

val io = IO(new Bundle {

val led0 = Output(Bool())

})

// Blink LED every second using Chisel built-in util.Counter

val led = RegInit(startOn.B)

val (_, counterWrap) = Counter(true.B, freq / 2)

when(counterWrap) {

led := ~led

}

io.led0 := led

}

object Main extends App {

// These lines generate the Verilog output

println(

new (chisel3.stage.ChiselStage).emitVerilog(

new Blinky(1000),

Array(

"--emission-options=disableMemRandomization,disableRegisterRandomization"

)

)

)

}

编译后,生成的verilog代码是这样的:

module Blinky(

input clock,

input reset,

output io_led0

);

reg led; // @[main.scala 11:20]

reg [8:0] counterWrap_value; // @[Counter.scala 62:40]

wire counterWrap_wrap_wrap = counterWrap_value == 9'h1f3; // @[Counter.scala 74:24]

wire [8:0] _counterWrap_wrap_value_T_1 = counterWrap_value + 9'h1; // @[Counter.scala 78:24]

assign io_led0 = led; // @[main.scala 16:11]

always @(posedge clock) begin

if (reset) begin // @[main.scala 11:20]

led <= 1'h0; // @[main.scala 11:20]

end else if (counterWrap_wrap_wrap) begin // @[main.scala 13:21]

led <= ~led; // @[main.scala 14:9]

end

if (reset) begin // @[Counter.scala 62:40]

counterWrap_value <= 9'h0; // @[Counter.scala 62:40]

end else if (counterWrap_wrap_wrap) begin // @[Counter.scala 88:20]

counterWrap_value <= 9'h0; // @[Counter.scala 88:28]

end else begin

counterWrap_value <= _counterWrap_wrap_value_T_1; // @[Counter.scala 78:15]

end

end

endmodule

4,搅局者Chisel语言为何难以推广?

之所以将Chisel语言定位为硬件描述语言(HDL)的搅局者,是因为Chisel已经在RISC-V上有很多应用,例如国内的香山开源处理器就是用Chisel编写的。然而,Chisel在工业界却难觅踪影,了解者甚少,还没有被工业界接受,笔者认为有以下几点原因:

1)Chisel本质上还是Scala语言,因此要学习Chisel,需要具备Scala语言的基础,而scala是一门相对较难的语言。对广大前端电路设计者,如果没有面向对象编程基础和函数式编程经验,学起来会非常吃力,也很难在短期之内掌握;

2)Chisel需要先转换成verilog,而转换后的verilog信号名有大量的命名替换(Chisel源码修改后原来的名称可能发生变化),这会给问题定位和代码覆盖率收集带来很多障碍。这一缺点几乎是致命的。

3)主流的EDA工具对Chisel还不支持,例如常见的仿真工具VCS,Xcelium,综合工具DC,GENUS等都不支持。

4)还有一点是个人使用的感受:Chisel采用sbt工具构建,而sbt每次检查依赖库时速度较慢;对硬件要求高,可能需要专门的服务器,例如,开源的香山开源处理器,开发环境建议内存最低 32G,推荐 64G 及以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/697304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rd-03E】使用CH340给Rd03_E雷达模块烧录固件

Rd03_E 指导手册 安信可新品雷达模组Rd-03搭配STM32制作简易人体感应雷达灯教程 http://t.csdnimg.cn/mqhkE 测距指导手册网址&#xff1a; https://docs.ai-thinker.com/_media/rd-03e%E7%B2%BE%E5%87%86%E6%B5%8B%E8%B7%9D%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C%E4%B8%AD%…

02-JAVA面向对象编程

一、面向对象编程 1、面向过程编程思想&#xff08;Process Oritented Programming&#xff09; 将实现一个功能的一组指令组合在一起&#xff0c;成为一个函数。这个函数就能实现这一个功能&#xff0c;是对功能实现的一种抽象。通过这种抽象方式&#xff0c;将代码实现复用。…

软件游戏steam_api.dll丢失的解决方法,总结5种有效的方法

在玩电脑游戏时&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“游戏缺少steam_api.dll”。这个问题可能让很多玩家感到困惑和烦恼。那么&#xff0c;究竟是什么原因导致游戏缺少steam_api.dll呢&#xff1f;又该如何解决这个问题呢&#xff1f;本文将为大家…

pyqt opengl 小黑块

目录 OpenGLWidget_g初始化函数&#xff1a; 解决方法&#xff1a;把初始化函数的parent去掉 pyqt opengl 小黑块 原因&#xff1a; 创建OpenGLWidget_g的时候把main_window作为父类&#xff08;self&#xff09;传进去了&#xff0c; self.opengl_widget OpenGLWidget_g(…

SpringBoot+Vue网上超市系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 系统角色对应功能 用户管理员 系统功能截图

【云岚到家】-day02-2-客户管理-认证授权

【云岚到家】-day02-2-客户管理-认证授权 第二章 客户管理1 认证模块1.1 需求分析1.2 小程序认证1.2.1 测试小程序认证1.2.1.1 参考官方流程1.2.1.2 申请小程序账号1.2.1.3 创建jzo2o-customer1.2.1.4 部署前端1.2.1.5 编译运行1.2.1.6 真机调试 2 阅读代码2.1 小程序认证流程2…

定个小目标之刷LeetCode热题(15)

这道题直接就采用两数相加的规则&#xff0c;维护一个进阶值&#xff08;n&#xff09;即可&#xff0c;代码如下 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {// 新建一个值为0的头结点ListNode newHead new ListNode(0);// 创建几个指针用于…

大数据解决方案案例:电商平台日志分析

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

PythonX.X、pipX的关系

PythonX.X、pipX的关系 Python2.x 与 3.x Python 的 3.0 版本&#xff0c;相对于 Python 的早期版本&#xff0c;是一个大的升级。许多针对早期 Python2.x 版本设计的程序都无法在 Python 3.x 上正常执行。为了照顾大量的历史遗留项目&#xff0c;Python 2.6 作为一个过渡版本…

Chat-TTS:windows本地部署实践【有手就行】

最近Chat-TTS模型很火&#xff0c;生成的语音以假乱真&#xff0c;几乎听不出AI的味道。我自己在本地部署玩了一下&#xff0c;记录一下其中遇到的问题。 环境&#xff1a; 系统&#xff1a;windows 11 GPU&#xff1a; Nvidia 4060 Cuda&#xff1a;12.1&#xff08;建议安…

数据结构与算法题目集(中文)6-2顺序表操作集

题目地址 https://pintia.cn/problem-sets/15/exam/problems/type/6?problemSetProblemId725&page0 注意审题&#xff0c;返回false的时候不要返回ERROR&#xff0c;否则答案错误&#xff0c;机器规则是死的。 位置一般指数组下标&#xff0c;位序一般指数组下标1。但是思…

error while loading shared libraries 找不到动态库问题如何解决

在使用 c 或 c 开发应用时&#xff0c;在启动程序时&#xff0c;有时会遇到这个错误&#xff0c;找不到动态库。这个时候&#xff0c;我们使用 ldd 来查看&#xff0c;发现可执行文件依赖的动态库显示为 not found。 1 实验代码 使用如下 3 个文件做实验。 hello.h 中声明了函…

学习DHCP动态主机配置协议

目录&#xff1a; dhcp 动态主机配置协议 ftp文件传输协议 dhcp 动态主机配置协议 服务器配置好了地址池 192.168.124.10 -192.168.124.20 客户端从地址池当中随机获取一个ip地址&#xff0c;ip地址会发生变化&#xff0c;使用服务端提供的ip地址&…

情景题之小明的Linux实习之旅:linux实战练习1(下)【基础命令,权限修改,日志查询,进程管理...】

小明的Linux实习之旅&#xff1a;基础指令练习情景练习题下 前景提要小明是怎么做的场景1&#xff1a;初识Linux&#xff0c;创建目录和文件场景2&#xff1a;权限管理&#xff0c;小明的权限困惑场景3&#xff1a;打包与解压&#xff0c;小明的备份操作场景4&#xff1a;使用G…

vue3 递归循环展示下级盒子

index.vue主文件 <template><div><RecursiveCard :data"rootTask" /></div> </template><script> import { reactive } from vue; import RecursiveCard from ./test.vue; // 递归组件的路径export default {components: {Recu…

textattack报错:不能导入自定义search_methods (cannot import name ‘xxx‘ from ‘xxx‘)

1. 报错信息 ImportError: cannot import name AAA from textattack.search_methods (/home/666/anaconda3/envs/textattack37_env/lib/python3.7/site-packages/textattack/search_methods/__init__.py)2. 出错简述 贴一段test1.py的模块导入 #建议使用&#xff01; import…

后方碰撞预警系统技术规范(简化版)

后方碰撞预警系统技术规范(简化版) 1 系统概述2 预警区域3 预警目标4 功能需求功能条件5 显示需求6 指标需求1 系统概述 后方碰撞预警系统RCW(Rear Collision Warning)是在后方车辆即将与自车发生碰撞之前,激活危险警告灯以较高频率闪烁,从而吸引后方驾驶员的注意力,避免…

Redis 5种常用数据类型

目录 Redis简介 1.字符串 string 2.哈希 hash 3.列表 list 4.集合 set 5.有序集合 sorted set / zset Redis简介 Redis&#xff0c;全称Remote Dictionary Server&#xff0c;是一个开源的、内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件&#xff0c;支…

常用的通信协议

最近在做项目&#xff0c;用到了一些通信协议&#xff0c;这里详细整理一下相关的通信协议&#xff0c;方便以后查阅。 常用的通信协议 单工 半双工 全双工单工通信&#xff08;Simplex Communication&#xff09;半双工(Half-duplex Communication)全双工&#xff08;Full-dup…

【MySQL】聊聊唯一索引是如何加锁的

首先我们要明确&#xff0c;加锁的对象是索引&#xff0c;加锁的基本单位是next-key lock&#xff0c;由记录锁和间隙锁组成。next-key是前开后闭区间&#xff0c;间隙锁是前开后开区间。根据不同的查询条件next-key 可能会退化成记录锁或间隙锁。 在能使用记录锁或者间隙锁就…