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