Chisel模块中的条件端口

时间:2015-04-17 10:48:29

标签: chisel riscv

我有一个通常不需要的可选功能。但是,要支持此功能,应将一些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,这对我来说毫无意义。

3 个答案:

答案 0 :(得分:3)

Chisel现在支持IO包中的选项。

作为一个例子,我在这里探讨了选项(https://github.com/ucb-bar/riscv-boom/commit/da6edcb4b7bec341e31a55567ee04c8a1431d659),但这是一个总结:

cat /dev/ttyAMA0

令人难以置信的冗长,但即使在批量连接和捆绑包中捆绑等等,我也能使它工作。

答案 1 :(得分:2)

即使编译器可以确定只有一个结果是可能的(表达式始终为true),类型系统会将结果的类型设置为等于两个可能(true或false)子表达式的最大公共子类型

您可以通过以下方式轻松验证:

scala> val result = if (true) 1 else "one"
result: Any = 1

答案 2 :(得分: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

}