簡體   English   中英

Chisel模塊中的條件端口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM