chisel3.util.Queue的full、maybe_full信号是否无法在队列模块外部访问
Chisel Queue内部信号访问及暴露方案
- 你的推测是正确的,
maybe_full和full属于Chisel标准Queue类的内部私有信号,默认不对外暴露,因此跨模块直接访问会触发'Bool (Reg in Queue)' is not visible from the current module的可见性报错。 - 不需要完全自定义Queue工具类,有两种更轻量化的实现方案:
- 方案一:基于标准Queue的公开端口自行实现等价逻辑
标准Queue对外提供了公开的count端口(表示队列当前存储的元素数量),以及握手端口enq、deq的相关信号,可以直接组合出和内部信号逻辑完全一致的输出:- 等价
full信号逻辑:val full = count === entries(entries为队列深度参数) - 等价
maybe_full信号逻辑:val maybe_full = count +& enq.fire - deq.fire >= entries
- 等价
- 方案二:继承标准Queue类,扩展公开输出端口
如果不想自行组合逻辑,可以直接继承官方标准Queue类,仅将需要的内部信号引出为公开IO即可,不需要重写Queue的核心逻辑,示例代码如下:
import chisel3._ import chisel3.util.Queue class ExposedQueue[T <: Data](gen: T, entries: Int) extends Queue[T](gen, entries) { // 引出内部信号作为公开输出 val io_full = IO(Output(Bool())) val io_maybe_full = IO(Output(Bool())) io_full := reg_full io_maybe_full := maybe_full }
该方案完全复用官方Queue的成熟实现,不会引入额外的逻辑偏差,维护成本远低于完全自定义Queue。
内容的提问来源于stack exchange,提问作者metzkorn
相关产品推荐
相关产品推荐

