Chisel(Constructing Hardware In a Scala Embedded Language)은 하드웨어 설계 및 검증을 용이하게 하는 하드웨어 구성 언어입니다. 이 언어는 Scala 프로그래밍 언어 위에 구축되어 있으며, 그 표현력과 함수형 프로그래밍 기능을 활용하여 설계자가 복잡한 하드웨어 설계와 테스트벤치를 쉽게 생성할 수 있도록 합니다. Chisel은 주로 디지털 회로 개발, 특히 FPGA 및 ASIC 설계 분야에서 사용됩니다.
Chisel은 캘리포니아 대학교 버클리 캠퍼스의 버클리 아키텍처 연구 그룹의 지원 아래 연구 프로젝트로 개발되었습니다. Chisel의 창조 배경은 전통적인 하드웨어 설명 언어(HDL)인 Verilog나 VHDL에 비해 하드웨어 설계를 보다 생산적이고 효율적으로 수행할 수 있는 수단을 제공하기 위함이었습니다. 하드웨어 설계를 고급 프로그래밍 언어 내에 포함시킴으로써, Chisel은 더 나은 추상화, 고급 구성 요소 및 코드 재사용을 제공하고자 했습니다.
Chisel은 처음 등장한 이후 학계와 산업계에서 인기를 얻었습니다. 이 언어는 수많은 개발자들의 기여로 발전하여 기능, 라이브러리 및 사용성에서 개선이 이루어졌습니다. Scala와의 통합 덕분에 설계자들은 함수형 프로그래밍, 타입 안전성 및 고급 컬렉션 라이브러리와 같은 강력한 기능을 활용할 수 있게 되었습니다. 현재 Chisel은 학술 연구에서 상업 제품에 이르기까지 현대 하드웨어 개발 프로젝트에서 널리 사용되고 있습니다.
Chisel은 Verilog 및 VHDL과 같은 HDL에서 영감을 받아 그 핵심 개념을 차용하면서 Scala의 프로그래밍 패러다임으로 이를 강화합니다. 또한 생산성과 표현력에 중점을 둔 SpinalHDL과 같은 다른 하드웨어 구성 프레임워크와도 밀접한 관계를 가지고 있습니다. Chisel 설계는 Verilog로 변환될 수 있어 기존 합성 도구 및 워크플로우를 사용할 수 있습니다.
Chisel은 Scala 내에 내장된 도메인 특화 언어(DSL)를 제공하여 하드웨어 설계자가 하드웨어 설명을 위해 Scala의 구문을 활용할 수 있도록 합니다. 예를 들어, 간단한 2입력 멀티플렉서를 정의하는 것은 다음과 같이 표현할 수 있습니다:
class SimpleMux extends Module {
val io = IO(new Bundle {
val a = Input(Bool())
val b = Input(Bool())
val sel = Input(Bool())
val out = Output(Bool())
})
io.out := Mux(io.sel, io.b, io.a)
}
Chisel은 다양한 타입을 지원하며 설계자가 비트 너비를 명시적으로 지정할 수 있어 하드웨어 자원 활용에 대한 더 나은 제어를 제공합니다. 예를 들어:
val myWire = Wire(UInt(8.W)) // 8비트 부호 없는 정수
이 언어는 일반적인 하드웨어 구성 요소에 대한 추상화를 제공합니다. 예를 들어, 간단한 레지스터를 생성하려면:
val reg = RegInit(0.U(8.W)) // 0으로 초기화된 8비트 레지스터
Chisel은 매개변수화된 모듈 생성을 허용하여 다양한 구성으로 재사용 가능한 설계를 가능하게 합니다:
class ParamModule(val size: Int) extends Module {
val io = IO(new Bundle {
val input = Input(UInt(size.W))
val output = Output(UInt(size.W))
})
io.output := io.input + 1.U
}
Chisel은 복잡한 하드웨어 논리를 용이하게 하기 위해 조건부 표현식을 지원합니다:
val result = Mux(condition, trueValue, falseValue) // 멀티플렉서
고차 함수를 사용하여 모듈화된 하드웨어 구성 요소를 생성하여 하드웨어 구성을 생성합니다:
def makeAdder(n: Int) = new Module {
val io = IO(new Bundle {
val a = Input(UInt(n.W))
val b = Input(UInt(n.W))
val sum = Output(UInt(n.W))
})
io.sum := io.a + io.b
}
Chisel은 Scala 컬렉션 유틸리티를 사용하여 하드웨어 요소를 효과적으로 조작할 수 있도록 합니다:
val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // 4개의 와이어 벡터 생성
Chisel의 전용 구성 요소를 사용하여 순차 논리를 쉽게 표현할 수 있습니다, 예를 들어 레지스터:
when(condition) {
reg := newValue
} .otherwise {
reg := oldValue
}
Chisel은 ScalaTest와 통합되어 개발자가 하드웨어 설계에 대한 테스트를 자연스럽게 작성할 수 있도록 합니다:
class MyModuleTester extends PeekPokeTester(new MyModule) {
poke(dut.a, 1)
poke(dut.b, 0)
expect(dut.out, 1)
}
Chisel은 메서드 체이닝을 지원하여 복잡한 하드웨어 회로의 간결하고 가독성 높은 정의를 가능하게 합니다:
val result = (a + b).asUInt + c
Chisel은 Scala를 지원하는 모든 IDE에서 개발할 수 있으며, IntelliJ IDEA와 Scala 플러그인을 사용할 수 있습니다. 또한 sbt(Scala Build Tool)는 프로젝트 및 종속성을 관리하고 Chisel 프로젝트를 Verilog 코드로 컴파일하는 데 일반적으로 사용됩니다.
Chisel 프로젝트를 생성하려면 표준 sbt 프로젝트 구조를 설정할 수 있습니다. 간단한 build.sbt
파일은 다음과 같이 보일 수 있습니다:
name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"
빌드를 하려면 명령줄에서 sbt run
을 실행하면 출력 Verilog 파일이 타겟 디렉토리에 생성됩니다.
Chisel은 주로 디지털 하드웨어 설계 및 검증에 사용됩니다. 다음과 같은 분야에서 응용됩니다:
Chisel은 전통적인 HDL인 Verilog 및 VHDL과 차별화되며, 함수형 프로그래밍, 타입 안전성 및 고급 추상화와 같은 고급 프로그래밍 언어에서 제공하는 기능을 제공합니다.
다른 언어와 비교할 때:
Chisel을 다른 하드웨어 설명 언어로 번역하기 위해 Chisel 컴파일러와 같은 도구를 사용하여 Chisel 소스 코드에서 직접 Verilog를 생성할 수 있습니다. Chisel을 다른 HDL로 직접 변환하는 널리 알려진 소스-투-소스 번역 도구는 없지만, 생성된 Verilog는 필요에 따라 수동으로 조정할 수 있습니다.
현재 가장 인식받는 도구는 Chisel 도구 체인 자체로, 사용자가 Chisel 설계를 합성 가능한 Verilog 코드로 컴파일할 수 있도록 합니다. 또한 다양한 라이브러리와 도구를 통해 Chisel을 다른 하드웨어 프레임워크와 통합하려는 노력도 이루어지고 있으며, 이는 다양한 하드웨어 설계 방법론 간의 협업과 상호 운용성을 촉진하고 있습니다.