chisel - Chisel 模块中的条件端口

标签 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“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,这对我来说毫无意义。

最佳答案

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

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

关于chisel - Chisel 模块中的条件端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29697137/

相关文章:

chisel - 我可以在 Chisel 开始设计硬件之前在软件中计算常量吗?

chisel - 使用动态索引时如何显示我的线路名称?

Scala Chisel Ripple 进位加法器语法

chisel - sbt 运行期间缺少构建文件

scala - 在一个时钟周期内多次重新分配变量 - Chisel

linux - 如何将文件放入riscv linux?

riscv - 使用 Spike (riscv-isa-sim) 调试简单的 C 和汇编程序

cpu-registers - RISC-V 调用约定的 ABI 寄存器名称