Chisel Tutorial(二)——Chisel的資料型別
阿新 • • 發佈:2018-12-25
以下內容依據2015-7-10版的Chisel 2.2 Tutorial整理
Chisel的資料型別
Chisel的資料型別用來指明在線上流動的訊號(flowing on wire)、儲存在狀態元素(State Element)中的值的型別。對應Verilog HDL線網型、暫存器型變數的型別。雖然數位電路最終都是對二進位制數字向量進行操作,但是定義一些抽象的資料型別,有助於更為清晰的表達,同時也有利於產生更為優化的電路。具體有如下幾種型別
名稱 |
含義 |
Bits |
Bit的集合 |
SInt |
有符號整數 |
UInt |
無符號整數 |
Bool |
布林型別 |
Bundle |
一些元素的集合,每個元素都有一個變數名,類似於C語言中的結構體 |
Vec |
一些元素組成的向量,每個元素都有一個索引序號,類似於C語言中的陣列 |
上面的資料型別也對應一些類,比如SInt型別就對應的SInt類,當申明一個SInt變數時,就需要呼叫SInt類的建構函式,比如:
SInt(5)
傳遞給建構函式的可以是Scala中的整數或者字串,例如:
UInt(1) // 傳入的是Scala中定義的一個整數1,寬度是1bit UInt(“ha”) // 傳入的是一個字串,含義是一個16進位制的數,寬度是4bit UInt(“o12”) // 傳入的是一個字串,含義是一個8進位制的數,寬度是4bit UInt(“b1010”) // 傳入的是一個字串,含義是一個2進位制的數,寬度是4bit SInt(5) // 傳入的是Scala中定義的一個整數5,寬度是4bit,最高bit位是符號位 SInt(-5) // 傳入的是Scala中定義的一個整數-5,寬度是4bit,最高bit位是符號位 UInt(5) // 傳入的是Scala中定義的一個整數5,寬度是3bit,沒有符號位 Bool(true) // 傳入的是Scala中定義的布林數,寬度是1bit Bool(false)
在傳入建構函式的字串中可以使用下劃線,從而增加可讀性,例如:
UInt(“h_dead_beef”) // 傳入的是一個字串,含義是一個16進位制的數,寬度是32bit
在上面的定義中並沒有指明資料的寬度,Chisel編譯器會推測資料寬度,自動選擇最小的寬度,但是也可以明確指明資料寬度,例如:
UInt(“ha”,8) // 此處明確指出寬度是8bit UInt(“oa”,6) // 此處明確指出寬度是6bit UInt(“b1010”,12) // 此處明確指出寬度是12bit SInt(5,7) // 此處明確指出寬度是7bit UInt(5,8) // 此處明確指出寬度是8bit
對於UInt型別,如果指定的寬度大於資料寬度,那麼高位補0,對於SInt型別,如果指定的寬度大於資料寬度,那麼高位補上的是符號位,也就是符號位擴充套件。如果指定的寬度小於資料寬度,那麼Chisel會產生錯誤。
Chisel的資料型別的繼承結構如下圖所示: