You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Chisel 5.0的双时钟AsyncFIFO空态测试异常问题排查

AsyncFIFO空态测试时地址递增器异常问题

问题描述

用Chisel实现了一款AsyncFIFO,由于Chisel-tester不支持多时钟源,特意封装了单时钟测试模块。测试空态条件时出现异常:

  • 读解耦接口中,io.read.ready由测试端提供,io.read.valid是空信号的取反(缓存为空时该信号拉低,阻止读取操作)
  • 地址递增器由io.read.valid和io.read.ready共同控制,仅当二者均为高电平时才触发递增
  • 实际波形显示,io.read.valid拉低后,递增器仍会额外多递增一个周期

相关代码

Chisel实现代码

val (read_addr, read_wrap) = (withClock(io.read_clock)) {
    Counter(0 until depth << 1, enable = (io.read.valid && io.read.ready))
}

编译生成的Verilog代码

assign _full_T = write_addr - read_addr;  // src/main/scala/3_5_object_oriented_progrmming.scala:73:26, src/main/scala/chisel3/util/Counter.scala:61:40

......

always @(posedge io_read_clock) begin // src/main/scala/3_5_object_oriented_progrmming.scala:30:16
    if (reset)  // src/main/scala/3_5_object_oriented_progrmming.scala:30:16
      read_addr <= 5'h0;    // <stdin>:45:3, src/main/scala/chisel3/util/Counter.scala:61:40
    else if ((|_full_T) & io_read_ready)    // src/main/scala/3_5_object_oriented_progrmming.scala:57:61, :73:{26,39}
      read_addr <= read_addr + 5'h1;    // <stdin>:45:3, src/main/scala/chisel3/util/Counter.scala:61:40, :77:24
end // always @(posedge)

补充说明

已上传完整波形、代码及测试平台(因ChiselTesters不支持顶层多时钟源,已将AsyncFIFO封装在单时钟模块内)

内容的提问来源于stack exchange,提问作者Ivean Don

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:40:09