我正在研究Z-Scale RISCV處理器,其中我已將新功能和邏輯實現到數據路徑中。我想知道是否有一種簡單的方法可以在不使用一堆if循環的情況下「關閉」代碼的某些部分?我想讓在Z-scale處理器的常規實現和擴展實現的處理器之間切換變得容易。使用泛型類型來關閉數據路徑中的邏輯(鑿子)
我已經實現的新邏輯並不取代數據路徑的主要組件,而是擴展了功能。
我正在研究Z-Scale RISCV處理器,其中我已將新功能和邏輯實現到數據路徑中。我想知道是否有一種簡單的方法可以在不使用一堆if循環的情況下「關閉」代碼的某些部分?我想讓在Z-scale處理器的常規實現和擴展實現的處理器之間切換變得容易。使用泛型類型來關閉數據路徑中的邏輯(鑿子)
我已經實現的新邏輯並不取代數據路徑的主要組件,而是擴展了功能。
這個問題真正打擊了什麼使鑿子強大的核心。作爲嵌入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中的任何連接取消父項中的連接。
聽起來像是你的代碼如下所示:
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
感謝您的回覆!我想知道是否有可以控制Module Top的參數的變量,所以如果變量設置爲1,則會實例化Child,否則將實例化Parent?我已經嘗試了不同的想法,但沒有得到我想要的。 – Mrchacha
我已回覆http://stackoverflow.com/questions/41720320/initialize-class-depending-on-config-value – jkoenig