chisel學習筆記2

2021-10-08 15:32:15 字數 2558 閱讀 6975

第乙個chisel模組

1、直接上**

// chisel**:定義乙個模組

class passthrough extends module )

io.out := io.in

}

以上**定義了乙個名字叫做passthrough的chiselmodule,它有乙個4位元的輸入,名字叫做in,還有乙個4位元的輸出out。這個模組的組合電路中將輸入in連線到輸出out,所以outin驅動。

看到這可能還是很迷惑,下面解釋每一句:

class passthrough extends module
我們宣告了乙個新的硬體結構型別(bundle),bundle表示束,它包含了訊號inout,這兩個訊號分別帶有方向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...