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 "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,这对我来说毫无意义。
即使编译器可以确定只有一个结果是可能的(表达式始终为真),类型系统将结果的类型设置为等于两个可能的(真或假)子类型的最大公共子类型-表达式。
您可以通过以下方式简单地验证这一点:
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
}
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)
}
它非常冗长,但即使在进行批量连接和在包中隐藏包等时,我也能够让它工作
我有一个通常不需要的可选功能。但是,要支持此功能,应将一些 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,这对我来说毫无意义。
即使编译器可以确定只有一个结果是可能的(表达式始终为真),类型系统将结果的类型设置为等于两个可能的(真或假)子类型的最大公共子类型-表达式。
您可以通过以下方式简单地验证这一点:
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
}
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)
}
它非常冗长,但即使在进行批量连接和在包中隐藏包等时,我也能够让它工作