发布网友 发布时间:2024-10-22 13:31
共1个回答
热心网友 时间:2024-11-07 17:12
Chisel:模块化Scala领域的力量</
Chisel,作为Scala领域专用语言的璀璨明珠,凭借其模块化和参数化特性,为高效硬件开发提供了强大支持。本文将引领你步入Chisel的世界,从基础安装到核心概念,一步步探索。
首先,让我们在Ubuntu上搭建环境:安装Java、sbt(Scala构建工具)和Verilator(用于波形模拟和gtkwave查看)。sbt是工程依赖的得力助手,通过它管理项目。
Chisel巧妙地运用val(不变量)和":="(状态更新)。
从Scala到Chisel,类型转换清晰直观:如`Int to UInt`。Chisel数据类型包括`UInt`, `SInt`, `Bool`, `Bundle`, `Vec`,如1位无符号数值`1.U(1bit)`和12位有符号数值`-1.S(2bit)`。
硬件类型的变量定义:如`row10: Wire(UInt(16.W))`和`register: Reg(UInt(12.W))`。向量类`Vec`如`muls: Wire(Vec(length, UInt(8.W)))`,提供map、zip和foreach功能。
包裹类`Bundle`就像C语言中的struct,例如`exampleIO: Input/Output`, `io: IO(Bundle {...})`,提升代码重用性。
ValidIO和Flipped提供灵活的端口操作,如`x: ValidIO(exampleIO), y: Flipped(ValidIO(exampleIO)), io.x >io.y`。运算符如`a = b.andR, a = b.orR`,智能处理位宽。
Chisel区分组合逻辑(Wire, 数据类型和位宽)和时序逻辑(Reg, 寄存器操作)。如`Wire(row10 = UInt(16.W))`和`Reg(register, io.in + 1.U)`。`RegEnable`和`ShiftRegister`用于更复杂的时序控制。
利用`chisel3.Driver.execute`函数,Chisel能将设计转换为Verilog。在主函数`TutorialRunner`中调用,生成".firrtl"和".v"文件。测试则通过PeekPokeTester,编写Scala代码获取Golden Model,并通过`iotesters.Driver.execute`执行测试。
尝试编写测试用例,如`Adder(8) tests`和`Adder4 tests`,并使用以下sbt命令执行:
sbt "test:runMain examples.Launcher Adder"