[英]Conditional port in a Chisel Module
我有一個可選擇的功能,通常不需要。 但是,要支持此功能,應將一些I / O端口添加到原始模塊I / O端口。
我是這樣做的:
import Chisel._
class TestModule extends Module {
class IOBundle extends Bundle {
val i = Bool(INPUT)
val o = Bool(OUTPUT)
}
class IOBundle_EXT extends IOBundle {
val o_ext = Bool(OUTPUT)
}
val io = if(true) new IOBundle_EXT else new IOBundle;
io.o := io.i
io.o_ext := io.i
}
運行sbt“運行TestModule --backend c --compile --test --genHarness”后,編譯器會抱怨:
[error] xxxx/test/condi_port.scala:17: value o_ext is not a member of TestModule.this.IOBundle
[error] io.o_ext := io.i
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed
所以if語句沒有效果。 val io仍然分配給IOBundle,而不是擴展的IOBoundle_EXT,這對我來說毫無意義。
Chisel現在支持IO包中的選項。
作為一個例子,我在這里探討了選項( https://github.com/ucb-bar/riscv-boom/commit/da6edcb4b7bec341e31a55567ee04c8a1431d659 ),但這里是一個總結:
class MyBundle extends Bundle
{
val my_ext = if (SOME_SWITCH) Some(ExtBundle) else None
}
...
io.my_ext match
{
case Some(b: ExtBundle) =>
my_ext.a := Bool(false)
...
case _ => require (!SOME_SWITCH)
}
它令人難以置信的冗長,但即使在批量連接和捆綁包中捆綁等時,我也能夠使它工作。
即使編譯器可以確定只有一個結果是可能的(表達式總是為真),類型系統將結果的類型設置為等於兩個可能(真或假)子表達式的最大公共子類型。
您可以通過以下方式輕松驗證:
scala> val result = if (true) 1 else "one"
result: Any = 1
試試這個:
import Chisel._
class TestModule(val useEXT : Boolean) extends Module {
class IOBundle extends Bundle {
val i = Bool(INPUT)
val o = Bool(OUTPUT)
}
class IOBundle_EXT extends IOBundle {
val o_ext = Bool(OUTPUT)
}
val io = {
if(useEXT) {
val res = new IOBundle_EXT; res.o_ext := res.i; res
} else {
new IOBundle }};
io.o := io.i
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.