3

通常は必要のない選択可能な機能があります。ただし、この機能をサポートするには、元のモジュール 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 "run 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 は、拡張された IOBoundle_EXT ではなく IOBundle にまだ割り当てられているため、意味がありません。

4

3 に答える 3

2

コンパイラーは可能な結果が 1 つだけである (式は常に真である) と判断できますが、型システムは結果の型を、可能な 2 つの (真または偽) 部分式の最大共通サブタイプに等しく設定します。

これは、次の方法で簡単に確認できます。

scala> val result = if (true) 1 else "one"
result: Any = 1
于 2015-04-17T17:01:42.950 に答える
0

これを試して:

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

}
于 2015-06-20T00:54:41.443 に答える