当前位置:网站首页>吃透Chisel语言.10.Chisel项目构建、运行和测试(二)——Chisel中生成Verilog代码&Chisel开发流程
吃透Chisel语言.10.Chisel项目构建、运行和测试(二)——Chisel中生成Verilog代码&Chisel开发流程
2022-07-04 12:49:00 【github-3rr0r】
Chisel项目构建、运行和测试(二)——Chisel中生成Verilog代码&Chisel开发流程
上一篇文章我们提到了怎么用sbt构建Chisel项目并运行Chisel代码,但是毕竟还是在电脑上运行的。而在实践中,我们写的Chisel代码最终应该综合到FPGA或ASIC上,所以必须把Chisel翻译到一个综合工具能处理的硬件描述语言,比如Verilog。那怎么用Chisel代码生成Verilog代码呢?Chisel的开发流程又是怎样的呢?这篇文章来学习一下。
Chisel生成Verilog代码
Chisel是可以生成可综合的Verilog代码的,把生成Verilog的代码放到一个应用入口里面就可以了。这个应用入口就是个Scala对象,是从App
拓展来的,上一节提到过,它会在程序启动的时候隐式地生成主函数。这个应用入口里面只有一行代码,它创建了一个新的Hello
对象,然后传递给Chisel的emitVerilog()
函数,它会生成Hello
模块对应的Verilog文件Hello.v
。代码如下:
object Hello extends App {
emitVerilog(new Hello())
}
不过这种调用emitVerilog
的写法会把生成的文件默认地放到项目根目录下,也就是运行sbt
命令的路径。如果想要把生成的文件放到指定文件夹下的话,就需要给emitVerilog()
指定选项。构建选项可以设置为emitVerilog()
的第二个参数,参数类型是字符串的数组。上一篇文章讲Chisel项目目录结构的时候提到过,建议把生成的文件放到generated
文件夹下,下面的代码就能实现这个需求:
object HelloOption extends App {
emitVerilog(new Hello(), Array("--target-dir", "generated"))
}
如果我们不想把Verilog代码输出为文件,只是想把它作为Scala字符串在命令行输出的话,只需要使用getVerilogString()
函数即可:
object HelloString extends App {
val s = getVerilogString(new Hello())
println(s)
}
这种生成方法在小Chisel项目中很好用,比如这个网页上Led灯闪烁的例子Hello World - Scastie (scala-lang.org),用getVerilogString
函数输出了该模块对应的Verilog代码。
另外这个Scastie其实是个在线的Scala开发环境,我们如果本地没有配环境的话也完全可以用这个在线环境来进行简单的Chisel开发,能免去配环境的麻烦。
Chisel的工具流开发流程
下面我们运行一个简单但完整的生成Verilog的例子,对应的电路就是直接四位的有符号输入连接到四位的有符号输出:
package my.hello
import chisel3._
class ModuleSample extends Module {
val io = IO(new Bundle {
val in_a = Input(SInt(4.W))
val out_b = Output(SInt(4.W))
})
io.out_b := io.in_a
}
object MyModule extends App {
emitVerilog(new ModuleSample(), Array("--target-dir", "generated"))
}
但是我们可以惊奇的看到,generated
文件夹下除了*.v
的Verilog文件,还有*.fir
文件和*.anno.json
文件:
也就是不光生成了Verilog代码,还生成了其他文件,说到原因就涉及到Chisel的工具流了。Chisel的工具流如下图所示:
我们写的数字电路是其实就是Chisel的类,也就是图中的Hello.scala
,本质是Scala源码。但Chisel区别于Scala的地方在于编译的时候不光用到了Scala的库scala.lib
,还用到了Chisel的库chisel3.lib
。
有了Chisel源码,Scala的编译器基于Chisel、Scala的库将我们的代码生成Java类文件Hello.class
,也就是字节码文件。这类文件是可以在标准的JVM(Java Virtual Machine,Java虚拟机)上直接执行的。
用Chisel驱动执行这个字节码文件会生成FIRRTL文件Hello.fir
。这个FIRRTL全称为Flexible Intermediate Representation for RTL,即RTL的可变中间表示,是数字电路的的中间表示。FIRRTL编译器可以在电路上执行一些变换,是Chisel到其他硬件描述语言的关键桥梁,如果想理解更高阶的Chisel的内容甚至为Chisel开源代码做贡献,那就需要深入学习FIRRTL了。
再往下的Treadle是一个FIRRTL的解释器,用于电路的仿真。配合Chisel测试器,它可以用于调试和测试Chisel电路。根据输出的断言信息我们可以得到测试的结果。Treadle还可以生成波形文件,即Hello.vcd
,这个波形文件是可以用波形查看器查看的,比如可以在GTKWare或Modelsim等上查看。
回到FIRRTL编译器部分,Verilog Emitter也是FIRRTL变换之一,可以用Hello.fir
生成可综合的Verilog代码Hello.v
。接着我们就可以用一个电路综合工具(比如Intel的Quartus,Xilinx的Vivado或其他的ASIC工具)来综合电路。在FPGA设计的工作流中,综合工具会生成FPGA比特流用于配置FPGA,即Hello.bit
。
结语
现在我们已经学会了怎么在Chisel中生成Verilog代码,也对用Chisel进行开发的工具流有了基本的了解。学会了怎么编译、怎么运行,接下来就得学习怎么测试了。我们肯定不能每次调试都把工具流走完来试错,比如每次修改完代码后都生成FPGA比特流进行测试,这样一是找不到错误所在,二是耗费时间太久。所以必须要在Chisel阶段就测试明白,对于小的模块是如此,对于更大规模的数字电路更得做好测试。后面几篇文章就讲讲几种Chisel测试框架怎么使用,测试代码该怎么写。
边栏推荐
- Animation and transition effects
- Service Mesh的基本模式
- 苹果5G芯片研发失败:继续依赖高通,还要担心被起诉?
- remount of the / superblock failed: Permission denied
- FS7867S是一款应用于数字系统供电电源电压监控的电压检测芯片
- Qt如何实现打包,实现EXE分享
- 一次 Keepalived 高可用的事故,让我重学了一遍它
- Three schemes to improve the efficiency of MySQL deep paging query
- 字节面试算法题
- go vendor 项目迁移到 mod 项目
猜你喜欢
随机推荐
Interview disassembly: how to check the soaring usage of CPU after the system goes online?
SQL language
做事的真正意义和目的,真正想得到什么
Applet live + e-commerce, if you want to be a new retail e-commerce, use it!
担心“断气” 德国正修改《能源安全法》
Getting started with the go language is simple: go implements the Caesar password
Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型(转)
C#基础深入学习二
C language dormitory management query software
源码编译安装MySQL
2022危险化学品经营单位主要负责人练习题及模拟考试
2022KDD预讲 | 11位一作学者带你提前解锁优秀论文
【Antd踩坑】Antd Form 配合Input.Group时出现Form.Item所占据的高度不对
英视睿达冲刺科创板:年营收4.5亿 拟募资9.79亿
markdown 语法之字体标红
Summary of recent days (non-technical article)
程序员的焦虑
go语言中的文件创建,写入,读取,删除(转)
自主工业软件的创新与发展
美国土安全部部长警告移民“不要踏上危险的旅程”