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 仍然分配给 IOBundle,而不是扩展的 IOBoundle_EXT,这对我来说毫无意义。

4

3 回答 3

4

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)
}

它非常冗长,但即使在进行批量连接和在捆绑包中隐藏捆绑包等时,我也能够让它工作。

于 2016-04-08T06:35:52.680 回答
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 回答