在SpinalHDL中如何快速地实现总线连接

编 者 按   
    教你在spinalhdl中总线连接时针对总线的部分信号位宽不同时的如何快速地实现总线连接。
总线连接因小失大?
在系统设计上,往往会存在同一个总线接口在不同的模块里在进行例化时其配置略有差别。例如当我们为整个系统不同模块分配地址范围时,不同模块的地址段大小各不相同,这从而也就使得不同模块总线配置其地址位宽略有不同。以axilite4总线为例,我们若例化不同的总线配置:
val input=slave(axilite4(32,32))val output=master(axilite4(16,32))    这里如果我们想用input驱动output,那么如何连线呢?
在spinalhdl中,对于总线连接时位宽的检查是十分严格的,这里直接使用或者“>>”方法来进行连接显然是不行的。严格的位宽检查显然能够避免 我们犯不该犯的错误,但如果这里你还是像verilog那样一根根信号的手动连接时那么显然是要遭到鄙视的。
removeassignments     在最早接触spinalhdl时,针对这种情况,最早全是自己diy,在之前曾在文章《你还在当连线工程师么—进阶版》一文中自己实现了一个同一总线即使配置不同也自动连接的一个connect方法来针对这种以及更多类似的场景。然而虽然这种方式可用,但不同总线例化的差异在使用时虽然能够连接,但也破坏了spinalhdl本身设计的严谨性。
    而现在,针对这种场景,更推荐使用removeassignments来解决类似的问题。
    顾名思义,removeassignments会在elaboration阶段删除之前对信号所有的赋值,那么在这里,总线连接我们可以这么来写:
inputoutputoutput.ar.addr.removeassignments()output.aw.addr.removeassignments()output.aw.addr:=input.aw.addr.resized  
    在使用连接时最终实现时当处理到addr时会因位宽不匹配而报错,但这里我们在接下来对output.ar,output.aw的addr删除了赋值,从而也就避免了在elaboration阶段的错误赋值,而是执行下面新的带有位宽调节的赋值连线。通过这种方式,我们可以在保持spinalhdl的严谨性的同时也能以最少的代码量实现我们想要的效果。通过这种“先礼后兵”的方式,简洁而不失严谨的完成功能。
隐式转换api封装
    针对一些在自己系统设计里常用的功能,如果当用到spinalhdl 中自带的库时,我们可以通过隐式转换封装成相应的api函数,从而避免一次次的来徒增代码。以上面的axilite4总线为例,我们可以自定义隐式扩展类如下:
object axilite4tools{ implicit class axilite4extend(bus:axilite4){ def drivewithaddressadjust(that:axilite4)={ bus.aw>>that.aw bus.w>>that.w bus.ar>>that.ar bus.b<来连接则是在于axilite4总线的>>方法中有个config断言在这种场景下无法通过。
    随后我们在使用时即可通过impot axilite4tools._来实现掉用:
import axilite4tools._case class test() extends component{ val io=new bundle{ val input=slave(axilite4(32,32)) val output=master(axilite4(16,32)) } io.input.drivewithaddressadjust(io.output)}


小米8屏幕指纹版手机评测 解锁速度让人满意
荣耀新品“性能小钢炮”——荣耀MagicBook 14重磅来袭
微软列举四因素求证Vista必胜 业内喜忧参半
AI赋能医疗 开发新应用场景
解析单模光纤定义
在SpinalHDL中如何快速地实现总线连接
湿敏电阻的应用及测试方法
华为nova4贝母白开售 售价3099元起
ad637引脚及其功能
瞄准户外电源百亿市场 紧跟连接器新趋势
什么是安全芯片
创想三维2022年十大精彩事件,邀您一起回顾!
简述射频传输系统中的噪声干扰处理方法
小米MIX 2屏占比再提升至93%,华为、OPPO还没有
协作机器人是否能带动机器人产业的发展
应用案例 | SM712系列静电抑制器产品在RS485接口中的应用
腾讯阿里再度投资云服务 云计算市场谁与争锋?
机器人的关节:盘点那些成名已久的减速机巨擘
欲打破垄断格局,国内车企该如何突破
老司机对ETC的办理有什么疑虑