Chisel (Constructing Hardware In a Scala Embedded Language) adalah bahasa konstruksi perangkat keras yang memfasilitasi desain dan verifikasi perangkat keras. Bahasa ini dibangun di atas bahasa pemrograman Scala, memanfaatkan ekspresivitas dan kemampuan pemrograman fungsionalnya untuk memungkinkan desainer membuat desain perangkat keras yang canggih dan testbench dengan mudah. Chisel terutama digunakan dalam pengembangan sirkuit digital, khususnya dalam bidang desain FPGA dan ASIC.
Chisel dikembangkan sebagai proyek penelitian di Universitas California, Berkeley, di bawah naungan kelompok Penelitian Arsitektur Berkeley. Motivasi di balik penciptaannya adalah untuk menyediakan cara yang lebih produktif dan efisien dalam mendesain perangkat keras dibandingkan dengan Bahasa Deskripsi Perangkat Keras (HDL) tradisional seperti Verilog atau VHDL. Dengan menggabungkan desain perangkat keras dalam bahasa pemrograman tingkat tinggi, Chisel bertujuan untuk menawarkan abstraksi yang lebih baik, konstruksi tingkat tinggi, dan penggunaan kembali kode.
Sejak awal, Chisel telah mendapatkan popularitas di lingkungan akademis dan industri. Bahasa ini telah berkembang dengan kontribusi dari banyak pengembang, yang mengarah pada perbaikan dalam fitur, pustaka, dan kegunaannya. Integrasinya dengan Scala telah memungkinkan desainer untuk memanfaatkan fitur-fitur kuat seperti pemrograman fungsional, keamanan tipe, dan pustaka koleksi yang canggih. Chisel kini banyak digunakan dalam proyek pengembangan perangkat keras modern, mulai dari penelitian akademis hingga produk komersial.
Chisel mengambil inspirasi dari HDL seperti Verilog dan VHDL, meminjam konsep inti mereka sambil meningkatkan dengan paradigma pemrograman dari Scala. Ini juga berhubungan erat dengan kerangka konstruksi perangkat keras lainnya seperti SpinalHDL, yang juga fokus pada produktivitas dan ekspresivitas. Desain Chisel dapat diubah menjadi Verilog, memungkinkan penggunaan alat sintesis dan alur kerja yang sudah ada.
Chisel menyediakan Domain-Specific Language (DSL) yang tertanam dalam Scala, memungkinkan desainer perangkat keras untuk memanfaatkan sintaks Scala untuk deskripsi perangkat keras. Misalnya, mendefinisikan multiplexer 2-input sederhana dapat diekspresikan sebagai:
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 mendukung berbagai tipe dan memungkinkan desainer untuk menentukan lebar bit secara eksplisit, memberikan kontrol yang lebih baik atas pemanfaatan sumber daya perangkat keras. Misalnya:
val myWire = Wire(UInt(8.W)) // integer tanpa tanda 8-bit
Bahasa ini menawarkan abstraksi untuk komponen perangkat keras umum. Misalnya, untuk membuat register sederhana:
val reg = RegInit(0.U(8.W)) // register 8-bit yang diinisialisasi ke 0
Chisel memungkinkan pembuatan modul parameterisasi, memungkinkan desain yang dapat digunakan kembali dengan konfigurasi yang berbeda:
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 mendukung ekspresi kondisional untuk memfasilitasi logika perangkat keras yang kompleks:
val result = Mux(condition, trueValue, falseValue) // Multiplexer
Membangun komponen perangkat keras modular menggunakan fungsi tingkat tinggi untuk menghasilkan konfigurasi perangkat keras:
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 memungkinkan penggunaan utilitas koleksi Scala untuk memanipulasi elemen perangkat keras secara efektif:
val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // Membuat vektor dari 4 kawat
Logika berurutan diekspresikan dengan mudah menggunakan konstruksi khusus Chisel, seperti register:
when(condition) {
reg := newValue
} .otherwise {
reg := oldValue
}
Chisel terintegrasi dengan ScalaTest, memungkinkan pengembang untuk menulis tes untuk desain perangkat keras mereka secara alami:
class MyModuleTester extends PeekPokeTester(new MyModule) {
poke(dut.a, 1)
poke(dut.b, 0)
expect(dut.out, 1)
}
Chisel mendukung rantai metode, memungkinkan definisi sirkuit perangkat keras yang kompleks secara ringkas dan mudah dibaca:
val result = (a + b).asUInt + c
Chisel dapat dikembangkan menggunakan IDE apa pun yang mendukung Scala, seperti IntelliJ IDEA dengan plugin Scala. Selain itu, sbt (Scala Build Tool) biasanya digunakan untuk mengelola proyek dan ketergantungan, serta untuk mengompilasi proyek Chisel menjadi kode Verilog.
Untuk membuat proyek Chisel, Anda dapat mengatur struktur proyek sbt standar. File build.sbt
yang sederhana mungkin terlihat seperti ini:
name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"
Untuk membangun, Anda dapat menjalankan sbt run
dari baris perintah dan file Verilog keluaran akan dihasilkan di direktori target.
Chisel terutama digunakan dalam desain dan verifikasi perangkat keras digital. Ini menemukan aplikasi di bidang seperti:
Chisel berbeda dari HDL tradisional seperti Verilog dan VHDL dengan menawarkan fitur yang ditemukan dalam bahasa pemrograman tingkat tinggi, seperti pemrograman fungsional, keamanan tipe, dan abstraksi tingkat tinggi.
Dibandingkan dengan bahasa lain:
Untuk menerjemahkan Chisel ke bahasa deskripsi perangkat keras lainnya, alat seperti kompiler Chisel dapat menghasilkan Verilog langsung dari kode sumber Chisel. Saat ini tidak ada alat terjemahan sumber ke sumber yang dikenal luas yang mengonversi Chisel langsung ke HDL lain, tetapi Verilog yang dihasilkan dapat disesuaikan secara manual jika diperlukan.
Saat ini, alat yang paling dikenal adalah rangkaian alat Chisel itu sendiri, yang memungkinkan pengguna untuk mengompilasi desain Chisel menjadi kode Verilog yang dapat disintesis. Ada juga upaya untuk mengintegrasikan Chisel dengan kerangka perangkat keras lainnya melalui berbagai pustaka dan alat, mendorong kolaborasi dan interoperabilitas di antara berbagai metodologi desain perangkat keras.