1. 点亮LED灯

点亮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)

运行与验证

  1. 生成Verilog:在项目目录执行 sbt run,选择 LedMain 对象。生成的 generated/Led.v 内容应为:
module Led(
  input   clock,
  input   reset,
  output  io_led
);
  assign io_led = 1'h1;
endmodule

该输出为确定性结果,由代码逻辑直接推出。

  1. 仿真验证:创建测试文件 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。