زبان برنامه نویسی Chisel

زبان چیسل

مرور کلی بر چیسل

چیسل (ساخت سخت‌افزار در یک زبان جاسازی شده اسکالا) یک زبان ساخت سخت‌افزار است که طراحی و تأیید سخت‌افزار را تسهیل می‌کند. این زبان بر پایه زبان برنامه‌نویسی اسکالا ساخته شده و از قابلیت‌های بیان‌گری و برنامه‌نویسی تابعی آن بهره می‌برد تا به طراحان این امکان را بدهد که طراحی‌های سخت‌افزاری پیچیده و تست‌بنچ‌ها را به راحتی ایجاد کنند. چیسل عمدتاً در توسعه مدارهای دیجیتال، به ویژه در زمینه طراحی FPGA و ASIC استفاده می‌شود.

جنبه‌های تاریخی

ایجاد و توسعه اولیه

چیسل به عنوان یک پروژه تحقیقاتی در دانشگاه کالیفرنیا، برکلی، تحت نظارت گروه تحقیقاتی معماری برکلی توسعه یافت. انگیزه اصلی از ایجاد آن، ارائه روشی کارآمدتر و تولیدی‌تر برای طراحی سخت‌افزار نسبت به زبان‌های توصیف سخت‌افزار سنتی (HDLs) مانند ورilog یا VHDL بود. با جاسازی طراحی سخت‌افزار در یک زبان برنامه‌نویسی سطح بالا، چیسل هدف داشت تا انتزاع بهتری، ساختارهای سطح بالاتر و قابلیت استفاده مجدد از کد را ارائه دهد.

تکامل و وضعیت کنونی

از زمان تأسیس، چیسل در محیط‌های دانشگاهی و صنعتی محبوبیت پیدا کرده است. این زبان با مشارکت‌های متعدد توسعه‌دهندگان تکامل یافته و بهبودهایی در ویژگی‌ها، کتابخانه‌ها و قابلیت استفاده آن ایجاد شده است. ادغام آن با اسکالا به طراحان این امکان را داده است که از ویژگی‌های قدرتمندی مانند برنامه‌نویسی تابعی، ایمنی نوع و کتابخانه‌های مجموعه پیشرفته بهره‌برداری کنند. چیسل اکنون به طور گسترده‌ای در پروژه‌های توسعه سخت‌افزار مدرن، از تحقیقات دانشگاهی تا محصولات تجاری، استفاده می‌شود.

ارتباط با زبان‌ها و پلتفرم‌های دیگر

چیسل از زبان‌های توصیف سخت‌افزار مانند ورilog و VHDL الهام می‌گیرد و مفاهیم اصلی آن‌ها را قرض می‌گیرد در حالی که با پارادایم‌های برنامه‌نویسی اسکالا آن‌ها را تقویت می‌کند. همچنین ارتباط نزدیکی با سایر چارچوب‌های ساخت سخت‌افزار مانند SpinalHDL دارد که به طور مشابه بر تولیدی بودن و بیان‌گری تمرکز دارند. طراحی‌های چیسل می‌توانند به ورilog تبدیل شوند و این امکان را فراهم می‌آورد که از ابزارها و جریان‌های سنتز موجود استفاده شود.

ویژگی‌های نحوی

DSL جاسازی شده

چیسل یک زبان خاص دامنه (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

چیسل امکان ایجاد ماژول‌های پارامتر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ها و کامپایلر

چیسل می‌تواند با استفاده از هر 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 قابل سنتز کامپایل کنند. همچنین تلاش‌هایی برای ادغام چیسل با سایر چارچوب‌های سخت‌افزاری از طریق کتابخانه‌ها و ابزارهای مختلف وجود دارد که همکاری و تعامل‌پذیری بین روش‌های مختلف طراحی سخت‌افزار را تقویت می‌کند.