1. 程式人生 > >Chisel3 - model - 子模組,頂層模組

Chisel3 - model - 子模組,頂層模組

https://mp.weixin.qq.com/s/3uUIHW8DmisYARYmNzUZeg   介紹如何構建由模組組成的硬體模型。   1. 子模組   一個模組可以有一個或多個子模組,建立子模組時,需要使用Module(...)包裹:   Module()實現如下:   bc是一個call-by-name引數,在第一次引用時呼叫。   1) 在呼叫bc建立模組之前,先儲存Builder的狀態。
a. Module()只能用於包裹一個模組的例項化操作: Builder.readyForModuleConstr在例項化模組之前被置為false: 這個要求模組的例項化必須在Module()以內。子模組在父模組中以Module()包裹例項化,頂層模組如何例項化呢?也需要以Module()包裹,後續再講。   b. 記錄當前Builder的狀態資訊,如當前的val parent = Builder.currentModule為將要例項化的模組的父模組:    
2) 呼叫bc,建立子模組   子模組建立之初,會先要設定Builder的狀態,如下注釋中所言:   實際程式碼在BaseModule類體中:   3) 恢復Builder的狀態   4) 把建立的模組,轉換成為一個component 如果父模組不為空,則使用pushCommand把新建立的模組以DefInstance命令新增到硬體模型中。   2. generateComponent  
a. 處理各模組名字; b. 定義ModuleIO; c. 將模組輸入輸出埠轉換為component所需的Port; d. 定義component:val component = DefModule(this, name, firrtlPorts, invalidateCommands ++ getCommands)     3. 頂層模組   頂層模組也需要使用Module()包裹著建立。   如頂層模組Adder4的建立。其建立函式被傳給chisel3.Driver.execute方法:       可以看到,這裡呼叫gen()的時候,也包裹在Module()之中。   只是這裡的Module(gen())也是一個call-by-name引數,並不是直接呼叫: 這裡的Builder即為之前多次提到的Builder。build方法返回頂層模組Circuit。