Chisel3 - bind - PortBinding
Posted wjcdx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chisel3 - bind - PortBinding相关的知识,希望对你有一定的参考价值。
介绍Module输入输出端口如何进行绑定。
??
1. IO()
在定义一个模块时,使用Bundle的匿名子类型来定义模块的输入输出端口,然后将其传递给IO()方法。
IO()方法定义在BaseModule中,其记录自定义Bundle匿名子类型中各个数据成员的绑定信息。亦即把输入输出端口绑定到所在的模块上。
??
a. 不能重复绑定:requireIsChiselType(iodef, "io type")
b. 获取一个iodef的克隆:iodef.cloneTypeFull
c. 调用_bindIoInPlace执行绑定动作
d. 返回iodefClone
PS. require(!_closed, "Can‘t add more ports after module close")中的closed是指模块是否已经完成定义,已经完成后则不可以再添加输入输出端口,这个后面再讲。
2. _bindIoInPlace
这个方法实际执行绑定动作:
??
a. _bindIoInPlace为BaseModule类的方法,所以PortBinding(this)中的this是指当前模块;
b. PortBinding(this)使用当前模块构造一个PortBinding:
??
c. iodef的类型为Bundle的子类型,所以有bind方法,调用其bind方法进行绑定
绑定的对象(target)为PortBinding,而这个PortBinding中含有对当前模块的引用。从而把iodef和当期模块绑定到一起。
d. 把iodef加入到当前模块的IO端口中:_ports += iodef,这样实现了从模块到端口的引用。
结合iodef到模块的binding,就成了双向引用,可以互相查找。
以上是关于Chisel3 - bind - PortBinding的主要内容,如果未能解决你的问题,请参考以下文章
Chisel3 - bind - Wire, Reg, MemPort
Chisel3 - bind - PortBinding
Chisel3 - bind - Op, ReadOnly, 左值
第十九周
Chisel3 - util - Pipe
Chisel3 - util - RRArbiter