第乙個chisel模組
1、直接上**
// chisel**:定義乙個模組
class passthrough extends module )
io.out := io.in
}
以上**定義了乙個名字叫做passthrough
的chiselmodule
,它有乙個4位元的輸入,名字叫做in
,還有乙個4位元的輸出out
。這個模組的組合電路中將輸入in
連線到輸出out
,所以out
由in
驅動。
看到這可能還是很迷惑,下面解釋每一句:
class passthrough extends module我們宣告了乙個新的硬體結構型別(bundle),bundle表示束,它包含了訊號
in
和out
,這兩個訊號分別帶有方向input和output。
uint(4.w)
我們宣告了乙個訊號的硬體型別,它是寬度為4的無符號整數。
io.out := io.in我們將輸入埠和輸出埠連線,這裡
io.in
會驅動io.out
。注意:=
操作符是乙個chisel操作符,它表示右邊的訊號驅動左邊的訊號,它具有方向性。
2、展開為verilog
硬體構造語言(hcl)的巧妙之處在於我們可以使用底層程式語言scala作為指令碼語言。例如,在定義了上面的chisel模組之後,我們可以使用scala呼叫chisel編譯器來將chisel的passthrough
描述轉換成為verilog的passthrough
描述。這一步叫做展開(elaboration)。
// scala**:將chisel的設計展開成為verilog設計
println(getverilog(new passthrough))
展開的verilog**如下:
[info] [0.002] elaborating design...
[info] [0.605] done elaborating.
total firrtl compile time: 476.9 ms
module passthrough(
input clock,
input reset,
input [3:0] io_in,
output [3:0] io_out
); assign io_out = io_in; // @[cmd2.sc 6:10]
endmodule
舒服了,還是verilog看著順眼,這樣模組的組成就很清晰了。乙個名叫passthrough的模組,輸出在時鐘控制下由輸入驅動。
3、模組測試
思路非常簡單,給輸入賦值,檢查輸出是否和輸入相同即可。
// scala**:呼叫驅動(driver)來例項化 passthrough 和 peekpoketester,並且執行測試。
val testresult = driver(() => new passthrough())
}assert(testresult) // scala**:如果testresult等於false的話,,這裡會丟擲異常
println("success!!") // scala**:到這裡,我們的測試已經通過了
這個類似於testbench,乙個型別為passthrough
的模組,驅動它的輸入,並且檢查它的輸出。我們呼叫poke
來驅動輸入,呼叫expect
來檢查輸出。如果不使用expect
來比較期望值的話,也可以使用peek
來讀出輸出值。
[info] [0.000] elaborating design...
[info] [0.068] done elaborating.
total firrtl compile time: 19.0 ms
total firrtl compile time: 10.5 ms
end of dependency graph
circuit state created
[info] [0.001] seed 1561161438550
test cmd2helperpassthrough success: 3 tests passed in 5 cycles taking 0.017532 seconds
[info] [0.007] ran 0 cycles passed
success!!
如上,測試完成。 chisel學習筆記1
chisel是在scala的基礎上建立起來的,初學chisel可能有點摸不著頭腦,建議去菜鳥學學scala先。碼一下scala的筆記,賊適合入門。scala是乙個物件導向的程式語言,了解這一點很重要,這也是scala和chisel的乙個很大的優勢。變數是物件。運用val宣告的常量也是物件。甚至lit...
Chisel 學習筆記(七)
chisel 在chisel中,我們既可以使用scala中自帶的集合,包括list,seq,arraybuffer list的使用方式在學習筆記 一 中有所體現 seq與list類似,但是在chisel中,我們更常使用seq來表述某個模組的引數 arraybuffer的特性是不用描述出長度,且通過 ...
Chisel 學習筆記(四)
chisel chisel中的所有類都要繼承module 類中必須要定義io型別,用來表示該模組的輸入輸出埠 每乙個輸入輸出埠,需要說明是有符號數還是無符號數,以及資料位寬 class myoperatorstwo extends module class myoperators val lengt...