基于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
相关产品推荐
相关产品推荐

