十二 · 2021年11月22日

removeAssignment:少敲键盘多做事

优雅的赋值。

需求合理,就是有点儿罗嗦

在逻辑设计时,有这么一个场景很常见:对于输入的一组总线,我们需要改变其中的某些信号的赋值,而其他信号保持不变输出。正如下面的设计需求:

针对输入的AxiLite4总线,对于读写地址添加地址掩码0xffff后输出。

一组AxiLite4总线往往有较多的信号(比它信号总数多的更是大有存在),这里我们仅需要修改的只有两个bit的信号,对于我们来讲这么来写?

图片.png

嗯,相较于用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
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息