چیسل (ساخت سختافزار در یک زبان جاسازی شده اسکالا) یک زبان ساخت سختافزار است که طراحی و تأیید سختافزار را تسهیل میکند. این زبان بر پایه زبان برنامهنویسی اسکالا ساخته شده و از قابلیتهای بیانگری و برنامهنویسی تابعی آن بهره میبرد تا به طراحان این امکان را بدهد که طراحیهای سختافزاری پیچیده و تستبنچها را به راحتی ایجاد کنند. چیسل عمدتاً در توسعه مدارهای دیجیتال، به ویژه در زمینه طراحی FPGA و ASIC استفاده میشود.
چیسل به عنوان یک پروژه تحقیقاتی در دانشگاه کالیفرنیا، برکلی، تحت نظارت گروه تحقیقاتی معماری برکلی توسعه یافت. انگیزه اصلی از ایجاد آن، ارائه روشی کارآمدتر و تولیدیتر برای طراحی سختافزار نسبت به زبانهای توصیف سختافزار سنتی (HDLs) مانند ورilog یا VHDL بود. با جاسازی طراحی سختافزار در یک زبان برنامهنویسی سطح بالا، چیسل هدف داشت تا انتزاع بهتری، ساختارهای سطح بالاتر و قابلیت استفاده مجدد از کد را ارائه دهد.
از زمان تأسیس، چیسل در محیطهای دانشگاهی و صنعتی محبوبیت پیدا کرده است. این زبان با مشارکتهای متعدد توسعهدهندگان تکامل یافته و بهبودهایی در ویژگیها، کتابخانهها و قابلیت استفاده آن ایجاد شده است. ادغام آن با اسکالا به طراحان این امکان را داده است که از ویژگیهای قدرتمندی مانند برنامهنویسی تابعی، ایمنی نوع و کتابخانههای مجموعه پیشرفته بهرهبرداری کنند. چیسل اکنون به طور گستردهای در پروژههای توسعه سختافزار مدرن، از تحقیقات دانشگاهی تا محصولات تجاری، استفاده میشود.
چیسل از زبانهای توصیف سختافزار مانند ورilog و VHDL الهام میگیرد و مفاهیم اصلی آنها را قرض میگیرد در حالی که با پارادایمهای برنامهنویسی اسکالا آنها را تقویت میکند. همچنین ارتباط نزدیکی با سایر چارچوبهای ساخت سختافزار مانند SpinalHDL دارد که به طور مشابه بر تولیدی بودن و بیانگری تمرکز دارند. طراحیهای چیسل میتوانند به ورilog تبدیل شوند و این امکان را فراهم میآورد که از ابزارها و جریانهای سنتز موجود استفاده شود.
چیسل یک زبان خاص دامنه (DSL) جاسازی شده در اسکالا ارائه میدهد که به طراحان سختافزار این امکان را میدهد که از نحو اسکالا برای توصیف سختافزار استفاده کنند. به عنوان مثال، تعریف یک مولتیپلکسر ساده با ۲ ورودی میتواند به صورت زیر بیان شود:
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)
}
چیسل از انواع مختلفی پشتیبانی میکند و به طراحان این امکان را میدهد که عرض بیتها را به طور صریح مشخص کنند و کنترل بهتری بر استفاده از منابع سختافزاری داشته باشند. به عنوان مثال:
val myWire = Wire(UInt(8.W)) // عدد صحیح بدون علامت ۸ بیتی
این زبان انتزاعاتی برای اجزای رایج سختافزاری ارائه میدهد. به عنوان مثال، برای ایجاد یک رجیستر ساده:
val reg = RegInit(0.U(8.W)) // رجیستر ۸ بیتی که به ۰ مقداردهی اولیه شده است
چیسل امکان ایجاد ماژولهای پارامترized را فراهم میکند که طراحیهای قابل استفاده مجدد با پیکربندیهای مختلف را امکانپذیر میسازد:
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
}
چیسل از عبارات شرطی پشتیبانی میکند تا منطق سختافزاری پیچیده را تسهیل کند:
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
}
چیسل اجازه استفاده از ابزارهای مجموعه اسکالا را برای دستکاری مؤلفههای سختافزاری به طور مؤثر میدهد:
val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // ایجاد یک وکتور از ۴ سیم
منطق ترتیبی به راحتی با استفاده از ساختارهای اختصاصی چیسل، مانند رجیسترها، بیان میشود:
when(condition) {
reg := newValue
} .otherwise {
reg := oldValue
}
چیسل با ScalaTest ادغام میشود و به توسعهدهندگان این امکان را میدهد که به طور طبیعی تستهایی برای طراحیهای سختافزاری خود بنویسند:
class MyModuleTester extends PeekPokeTester(new MyModule) {
poke(dut.a, 1)
poke(dut.b, 0)
expect(dut.out, 1)
}
چیسل از زنجیرهسازی متدها پشتیبانی میکند و امکان تعریفهای مختصر و قابل خواندن از مدارهای سختافزاری پیچیده را فراهم میآورد:
val result = (a + b).asUInt + c
چیسل میتواند با استفاده از هر IDE که از اسکالا پشتیبانی میکند، مانند IntelliJ IDEA با پلاگین اسکالا، توسعه یابد. علاوه بر این، sbt (ابزار ساخت اسکالا) معمولاً برای مدیریت پروژهها و وابستگیها و همچنین برای کامپایل پروژههای چیسل به کد ورilog استفاده میشود.
برای ایجاد یک پروژه چیسل، میتوانید ساختار استاندارد پروژه sbt را تنظیم کنید. یک فایل ساده build.sbt
ممکن است به صورت زیر باشد:
name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"
برای ساخت، میتوانید از خط فرمان sbt run
را اجرا کنید و فایلهای ورilog خروجی در دایرکتوری هدف تولید خواهند شد.
چیسل عمدتاً در طراحی و تأیید سختافزار دیجیتال استفاده میشود. این زبان در زمینههایی مانند:
چیسل از زبانهای توصیف سختافزار سنتی مانند ورilog و VHDL متمایز است و ویژگیهایی را ارائه میدهد که در زبانهای برنامهنویسی سطح بالا یافت میشود، مانند برنامهنویسی تابعی، ایمنی نوع و انتزاعات سطح بالا.
در مقایسه با زبانهای دیگر:
برای ترجمه چیسل به سایر زبانهای توصیف سختافزار، ابزارهایی مانند کامپایلر چیسل میتوانند کد ورilog را مستقیماً از کد منبع چیسل تولید کنند. ابزارهای شناخته شدهای برای ترجمه منبع به منبع که چیسل را مستقیماً به HDL دیگری تبدیل کنند وجود ندارد، اما کد ورilog تولید شده میتواند در صورت نیاز به صورت دستی سازگار شود.
در حال حاضر، شناختهشدهترین ابزار خود زنجیره ابزار چیسل است که به کاربران این امکان را میدهد که طراحیهای چیسل را به کد ورilog قابل سنتز کامپایل کنند. همچنین تلاشهایی برای ادغام چیسل با سایر چارچوبهای سختافزاری از طریق کتابخانهها و ابزارهای مختلف وجود دارد که همکاری و تعاملپذیری بین روشهای مختلف طراحی سختافزار را تقویت میکند.