多选一的抉择
相较于Axi4写通路,多通路的多选一就容易多了。对于Axi4ReadOnlyArbiter,其仅需处理两个问题:
Ar通路多端口仲裁,其处理和写通路aw通路基本相同,采用多端口RR调度即可,同时也需将端口的仲裁信息放置于id字段用于读返回数据的端口路由。
r通路数据路由,其处理与b通路相似,根据返回的id字段信息解析出端口信息路由至正确的端口,
配置参数
相较于Axi4WriteOnlyArbiter,Axi4ReadOnlyArbiter的参数配置要简单很多:
outputConfig:输出端口Axi4配置。
inputsCount:输入端口个数
由于不再需要Route buffer,也就没有readIssuingCapability的概念,其支持取决于下游端口。
代码解析
针对ar通路,Axi4ReadOnly的处理方式为:
简洁优雅依旧。这里面值得学习的一点小技巧是removeAssignments方法的使用。顾名思义,其作用是将之前的 赋值给删除掉。这里对于output端口的readCmd,我们唯一需要改动的只有id字段,剩下的就是直连了。因为id位宽的改变将导致不能直接用“<>”方法进行端口的互联,而这里却依旧使用了 “<>”方法,只不过在最后又调用了removeAssignments方法将id的赋值给抹去,重新对id字段进行赋值(位宽的匹配检查是在生成RTL代码的一步执行的)。通过这种方式能够让代码更加的简洁而方便,不失为“神来之笔”。
而对于r通路,代码也简洁明了:
通过从id字段提取端口信息,进行数据端口的路由。这里一个for循环,一个zipped方法(可参考文章《软为硬用,如是而已》)将复杂的端口连线在几行代码内完成,你能跟我讲SystemVerilog有这个效率?
写在最后
好了,至此整个端口互联IP的所有关键组件都梳理完成,貌似万事大吉了。明天最后一篇,带你体会SpinalHDL的究极魅力。
原作者:玉骐
|