2016-11-17 95 views
1

我正在研究Z-Scale RISCV處理器,其中我已將新功能和邏輯實現到數據路徑中。我想知道是否有一種簡單的方法可以在不使用一堆if循環的情況下「關閉」代碼的某些部分?我想讓在Z-scale處理器的常規實現和擴展實現的處理器之間切換變得容易。使用泛型類型來關閉數據路徑中的邏輯(鑿子)

我已經實現的新邏輯並不取代數據路徑的主要組件,而是擴展了功能。

回答

2

這個問題真正打擊了什麼使鑿子強大的核心。作爲嵌入Scala的DSL,您可以使用面向對象和功能性編程語言的全部功能。

雖然我不確定你在做什麼,但這似乎是一個使用繼承的好地方。您可以創建一個新的Module類來擴展數據路徑模塊並添加附加功能。

一種玩具例如:父或子:

import Chisel._ 

class ParentIO extends Bundle { 
    val foo = UInt(width = 32).asInput 
    val bar = UInt(width = 32).asOutput 
} 

class Parent extends Module { 
    // Note the use of lazy val 
    // Due to Scala initialization order (http://docs.scala-lang.org/tutorials/FAQ/initialization-order.html) 
    // this cannot be a val 
    // Due to quirks of Chisel, this cannot be a def 
    lazy val io = new ParentIO 
    io.bar := io.foo 
} 

class ChildIO extends ParentIO { 
    val isOdd = Bool().asOutput 
} 

class Child extends Parent { 
    override lazy val io = new ChildIO 
    io.isOdd := io.foo(0) 
} 

// Note use of call-by-name for passing gen 
// Chisel Modules must be constructed within a call to the Module(...) function 
class Top(gen: => Parent) extends Module { 
    val dut = Module(gen) 
    val io = dut.io.cloneType 
    io <> dut.io 
} 

模塊頂部由它實例化模塊的類型參數化。因此,您可以有條件地實例化Parent或Child,而不是區分它們的所有邏輯。如果您希望Child重寫父項的某些功能,則Chisel的最後一個連接語義允許Child中的任何連接取消父項中的連接。

+0

感謝您的回覆!我想知道是否有可以控制Module Top的參數的變量,所以如果變量設置爲1,則會實例化Child,否則將實例化Parent?我已經嘗試了不同的想法,但沒有得到我想要的。 – Mrchacha

+0

我已回覆http://stackoverflow.com/questions/41720320/initialize-class-depending-on-config-value – jkoenig

2

聽起來像是你的代碼如下所示:

val a = Wire(UInt()) 
if (extension) 
    a := 1.U 
else 
    a := 2.U 

你可以做的是創造一個Z-規模類 和實現 包含 之間差異的性狀的Z-規模擴展類這兩個設計。

trait RISC_V_Processor { 
    def do_a : UInt 
} 

class Z_Scale with RISC_V_Processor { 
    def do_a : UInt = 2.U 
} 

class Z_Scale_extended with RISC_V_Processor { 
    def do_a : UInt = 1.U 
} 

val processor = new Z_Scale_extended() 
val a = processor.do_a() 

這實質上是用多態性替換條件。 https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism

+1

我只想指出,第一個例子不會編譯,因爲重新分配給'a'而不是連接,它應該是'a:= 1.U'和'a:= 2.U' – jkoenig

+0

是啊,這很快就勾畫出一個觀點,但會修復它。 – sebo

相關問題