1. 程式人生 > >Chisel Tutorial(二)——Chisel的資料型別

Chisel Tutorial(二)——Chisel的資料型別

以下內容依據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的資料型別的繼承結構如下圖所示: