Chisel中<>操作符的连接方向及Decoupled接口下Queue连接机制
Chisel
<>操作符在Queue接口连接中的工作逻辑 Chisel的<>是方向感知的逐字段自动连接操作符,它不会死板匹配外层Bundle的Flipped属性,只会逐字段匹配同名信号,自动判断驱动关系完成连接,核心逻辑和该场景下的具体连接过程如下:
1. 先明确两个连接对象的字段方向
首先我们拆分连接两侧的三个信号的方向属性(方向是相对于端口所属模块定义的):
- 左侧
out:是定义的QueueModule的输出端口,类型为无Flipped的DecoupledIO:out.bits:QueueModule的Output端口,需要被内部逻辑驱动out.valid:QueueModule的Output端口,需要被内部逻辑驱动out.ready:QueueModule的Input端口,由外部消费者驱动,可作为内部逻辑的信号源
- 右侧
Queue(in, entries)返回的q.io.deq:是内部实例化的Queue子模块的出队端口,类型同样为无Flipped的DecoupledIO:q.io.deq.bits:Queue子模块的Output端口,可作为父模块的信号源q.io.deq.valid:Queue子模块的Output端口,可作为父模块的信号源q.io.deq.ready:Queue子模块的Input端口,需要被父模块逻辑驱动
2. <>的逐字段连接过程
操作符会自动匹配每对同名字段,根据驱动源和被驱动端的属性生成连接:
bits字段:内部Queue输出的q.io.deq.bits作为驱动源,连接到需要被赋值的out.bits,等价于out.bits := q.io.deq.bitsvalid字段:内部Queue输出的q.io.deq.valid作为驱动源,连接到需要被赋值的out.valid,等价于out.valid := q.io.deq.validready字段:外部输入的out.ready作为驱动源,连接到需要被赋值的Queue输入端口q.io.deq.ready,等价于q.io.deq.ready := out.ready
3. 常见误区说明
之前认为“两个接口方向完全一致无法双向连接”是对Decoupled接口方向的误解:外层Bundle的Flipped属性只是批量定义内部子字段方向的语法糖,<>操作符根本不关心外层Bundle的方向标识,只会逐字段判断驱动关系,只要每对同名字段有且仅有一个合法驱动源,就可以完成正确连接。
内容的提问来源于stack exchange,提问作者Yeung Yann
相关产品推荐
相关产品推荐

