一、什麼是Chisel
Chisel是一個用於高級硬體設計的Scala語言介面。它允許設計人員以高性能、類型安全的方式構造參數化的數字電路。Chisel採用Scala的可擴展性和強制性類型,可以用於描述高速、低功耗現場可編程門陣列(FPGA)硬體、低延遲、高並發性能晶元,甚至是動態重構的硬體。
與傳統的硬體描述語言不同,Chisel是一種基於工程的概念的語言。它內置了許多工具和庫,可以用於簡化設計流程,並提供高層次的軟體抽象層次和等效性,進一步提高用戶的可移植性。事實上,Chisel非常適合用於構建可重用的晶元設計庫。
二、Chisel特徵
1. Chisel是一種基於硬體生成器的語言
硬體生成器可以使用Scala的函數、類和模塊來定義,從而生成具有豐富性質的數字電路。通過使用硬體生成器,設計人員可以通過Chisel生成各種設計,例如組合邏輯、時序邏輯、狀態機和流水線等。
2. Chisel支持代碼重用性
Chisel融合了硬體生成器的特性,使用戶能夠輕鬆地將代碼重用於不同的硬體系統。這種模塊化方法與軟體開發類似,並具有與高級編程語言相同的語義和結構,使得硬體設計更加直觀、健壯和可擴展。
3. Chisel提供了類型安全
Chisel採用Scala的強制性類型,使得設計人員能夠更好地發現、檢測和糾正錯誤。在硬體語言中,錯誤會導致晶元的故障或不可預測的行為,因此Chisel的類型安全和可驗證性非常重要。
4. Chisel提供了高性能和低延遲
Chisel使用Scala的函數式編程原則,因此具有高並發性和低延遲特性。硬體代碼可以在Scala中生成,然後通過優化流水線來提高硬體系統的性能和加速。
5. Chisel提供了高層次的抽象功能
Chisel可以用於定義和構建高級別抽象,例如高層次語境、數據結構和演算法。這一特性有利於將軟體開發者轉化為硬體系統設計人員,並極大地促進了硬體和軟體之間的交互。
三、Scala + Chisel示例
Chisel中的圖像處理示例
import Chisel._
class ImageProcessing(width: Int, height: Int) extends Module {
val input = UInt(INPUT, width * height * 3)
val output = UInt(OUTPUT, width * height * 3)
val hsobel = Vec(Seq(-1, -2, -1, 0, 0, 0, 1, 2, 1).map(SInt(_))) // horizontal Sobel filter
val vsobel = Vec(Seq(-1, 0, 1, -2, 0, 2, -1, 0, 1).map(SInt(_))) // vertical Sobel filter
val img = Vec(Seq.fill(width * height)(Vec(Seq.fill(3)(Bits(0, width = 8))))).flatten
val img_w = Reg(init=Bits(0, width = width * 3))
val img_row = img_w(width - 1, 0)
val img_data = Reg(init=UInt(0, width = 24))
val h_sums = Vec(Seq.fill(height)(Reg(init=SInt(0, width = 8))))
val v_sums = Vec(Seq.fill(width)(Reg(init=SInt(0, width = 8))))
val mag_ img row = Vec(Seq.fill(width * height)(Bits(0, width = 8)))
val angle_row = Vec(Seq.fill(width * height)(Bits(0, width = 9)))
for (i k * v}.reduce(_+_));
v_sums(i) := Mux(img_row === UInt(0), SInt(0), vsobel.zip(((0 until height) map (j => img(i + width * j)))).map{case(k, v) => k * v}.reduce(_+_));
mag_row(i) := math.sqrt(h_sums(i) * h_sums(i) + v_sums(i) * v_sums(i)).toBit()
angle_row(i) := (((math.atan2(v_sums(i), h_sums(i)) + math.Pi) / (2 * math.Pi)) * 512 + 0.5).floor.toUInt()
}
when (img_row === UInt(0)) {
img_w := input
} .otherwise {
img_w := img_w(width * 3 - 1, 0) ## input
}
img_data := img_w(23, 0)
for (i <- 0 until width) {
for (j Module(new ImageProcessing(256, 256)))
}
}
四、總結
Chisel是一個高度可擴展的硬體構建語言,可以與Scala的模塊化和函數式編程結合使用。它提供了許多特性,例如硬體生成器、代碼重用性、類型安全、高性能/低延遲和高級抽象功能,可以讓設計人員更加直觀、健壯和可擴展的構建數字電路。同時,Scala的可擴展性和強制性類型使得Chisel非常適合進行高速、低功耗現場可編程門陣列(FPGA)硬體、低延遲、高並發性能晶元,甚至是動態重構的硬體等領域的構建。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/312874.html