为什么Chisel3中两个Bool(true)使用==比较会返回false?
1. ==返回false是正常行为
Chisel的Bool类型是Scala自定义类,默认的==运算符执行的是引用相等性比较。每次调用true.B都会实例化一个新的Bool对象,value1和value2是两个不同的对象实例,因此引用比较结果为false,属于设计预期,不是bug。
2. ===报错是正常表现
===是Chisel提供的硬件相等运算符,作用是生成硬件电路中的相等比较逻辑,必须在Module的硬件上下文环境中调用。你直接在裸Scala控制台中调用该运算符,没有对应的硬件上下文,因此触发报错,属于正常的运行检查逻辑,不是bug。
3. ChiselTest2测试台中比较Bool值的实现方式
分两种场景处理:
3.1 硬件模块内的信号比较
如果你需要在你设计的硬件逻辑中比较两个Bool信号,直接在Module内部使用===即可,此时运行在合法的硬件上下文,不会报错:
import chisel3._ class MyModule extends Module { val io = IO(new Bundle { val a = Input(Bool()) val b = Input(Bool()) val equal = Output(Bool()) }) io.equal := io.a === io.b // 合法,生成硬件比较电路 }
3.2 测试逻辑中的值比较
在测试代码中比对结果有两种常用方式:
- 直接调用
expect方法做结果校验,框架会自动完成比较:
import chiseltest._ import org.scalatest.flatspec.AnyFlatSpec class MyModuleTest extends AnyFlatSpec with ChiselScalatestTester { "MyModule" should "correct compare two Bools" in { test(new MyModule) { dut => dut.io.a.poke(true.B) dut.io.b.poke(true.B) dut.io.equal.expect(true.B) // 直接传入预期值即可完成比较 } } }
- 如果你需要把信号值取出来做Scala层面的逻辑判断,先调用
peek()转成Scala原生Boolean类型,再用==比较:
test(new MyModule) { dut => dut.io.a.poke(true.B) dut.io.b.poke(false.B) val aVal = dut.io.a.peek() // 得到Scala.Boolean类型的值 val bVal = dut.io.b.peek() println(aVal == bVal) // 此时是Scala原生值比较,结果符合预期 }
内容的提问来源于stack exchange,提问作者FabienM
相关产品推荐
相关产品推荐

