1. 点亮LED灯
任务目标
使用Chisel硬件描述语言编写一个最小模块,驱动开发板上的LED灯点亮,并生成Verilog代码进行仿真验证。本案例聚焦于Chisel到Verilog的完整工具链流程,不涉及具体开发板型号的引脚约束。
环境依赖
- Java JDK 8+
- sbt 1.x
- Chisel 3.6.0(或兼容版本)
- Verilator(用于仿真验证,可选但推荐)
完整实现
创建文件 Led.scala,包含Chisel模块定义与Verilog生成入口:
import chisel3._
import chisel3.stage.ChiselStage
// LED控制模块:输出高电平驱动LED点亮
class Led extends Module {
val io = IO(new Bundle {
val led = Output(Bool())
})
io.led := true.B // 恒定输出高电平
}
// 生成Verilog代码
object LedMain extends App {
(new ChiselStage).emitVerilog(new Led, Array("--target-dir", "generated"))
}
在项目根目录创建 build.sbt:
scalaVersion := "2.13.10"
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.6.0"
addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % "3.6.0" cross CrossVersion.full)
运行与验证
- 生成Verilog:在项目目录执行
sbt run,选择LedMain对象。生成的generated/Led.v内容应为:
module Led(
input clock,
input reset,
output io_led
);
assign io_led = 1'h1;
endmodule
该输出为确定性结果,由代码逻辑直接推出。
- 仿真验证:创建测试文件
LedTest.scala:
import chisel3._
import chiseltest._
import org.scalatest.flatspec.AnyFlatSpec
class LedTest extends AnyFlatSpec with ChiselScalatestTester {
"Led" should "output high" in {
test(new Led) { dut =>
dut.io.led.expect(true.B)
}
}
}
在 build.sbt 中添加测试依赖后执行 sbt test。若测试通过,说明模块功能正确。
判定标准
- Verilog文件成功生成,且
io_led被赋值为常量高电平1'h1。 - 仿真测试通过,
io.led输出为true.B。 - 若连接实际开发板,将
io_led约束到LED引脚即可点亮(需额外引脚约束文件,不在本案例范围)。
常见问题
- sbt下载依赖缓慢:可配置国内镜像仓库加速。
- Verilog中多出clock/reset端口:Chisel模块默认隐式包含时钟和复位,不影响功能,综合时连接即可。
- 仿真测试失败:检查
build.sbt是否添加chiseltest依赖:"edu.berkeley.cs" %% "chiseltest" % "0.6.0" % Test。