优雅的赋值。
需求合理,就是有点儿罗嗦
在逻辑设计时,有这么一个场景很常见:对于输入的一组总线,我们需要改变其中的某些信号的赋值,而其他信号保持不变输出。正如下面的设计需求:
针对输入的AxiLite4总线,对于读写地址添加地址掩码0xffff后输出。
一组AxiLite4总线往往有较多的信号(比它信号总数多的更是大有存在),这里我们仅需要修改的只有两个bit的信号,对于我们来讲这么来写?
嗯,相较于用Verilog,已经省了很多功夫了,上面的写法没毛病。但是,就这么几行代码我也得敲个两三分钟啊……
removeAssignment方为正解
SpinalHDL总会满足你的需求(如果没有实现,去扩展下也是很容易)。针对上面的场景,我们完全可以直接将输入输出总线直接连起来,随后再将需要重复赋值的信号给删除赋值进行真正我们想要的赋值,而这便是removeAssignment的作用:
case class Demo() extends Component {
val io=new Bundle{
val upPort=slave(AxiLite4(32,32))
val downPort=master(AxiLite4(32,32))
AxiLite4SpecRenamer(upPort)
AxiLite4SpecRenamer(downPort)
}
io.upPort<>io.downPort
io.downPort.aw.addr.removeAssignments()
io.downPort.ar.addr.removeAssignments()
io.downPort.aw.addr:=io.upPort.aw.addr&0xffff
io.downPort.ar.addr:=io.upPort.ar.addr&0xffff
}
总线互联一行代码就可以完成,而其中aw.addr,ar.addr的赋值并不是我们想要的。没问题,那就删除掉他的赋值——removeAssignment,随后重新赋值即可。
☆ END ☆
作者:玉骐
原文链接:https://mp.weixin.qq.com/s/UYoLq0SNKiRCt1iuuzIe_A
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。