十二 · 2022年09月01日 · 北京市

踩坑系列——inout连接不上

✎ 编 者 按 

   inout连接报看不懂的错误

》看不懂的错误

   在SpinalHDL 1.7.0版本里,在仿真方面开始支持了VCS,这解决了在FPGA设计里采用Verilator时无法仿真厂商IP的问题。故此,前段时间尝试了把集成FPGA厂商DDR IP的测试。不曾想却遇到了一个从未遇到的错误。在DDR仿真里一般由控制器IP以及厂商的Memory Model组成,我将其各自封装成了一个Blackbox,而在集成的时候确过不去了。为简单起见,这里采用下面的代码示例:

import spinal.core._

case class ddrCtrl() extends BlackBox {
  val signal = inout(Analog(Bool()))
}

case class ddrModel() extends BlackBox {
  val signal = inout(Analog(Bool()))
}

case class ddrWrapper() extends Component {
  val ddrCtrlInst = ddrCtrl()
  val ddrModelInst = ddrModel()
  ddrCtrlInst.signal <> ddrModelInst.signal
}

object ddrWrapperInst extends App {
  SpinalSystemVerilog(ddrWrapper())
}

   看起来似乎没啥毛病对吧,而且在之前写Verilog时候inout端口也是这么连接的。然而在运行的时候却报了下面的错误:

image.png

   这错误类型我熟,但貌似明显我并没有犯这个错误啊……

》解决之道

   首先需要说明的是,这种使用场景也仅在仿真的时候会使用到,而真实的设计场景是不会有这么用的。但上面这个场景确实存在。在git上大神给出了下面的答复:


This is a bug in how the combination 
phase checker works. As a work around, 
you can make an intermediate analog 
signal in the top level component 
and assign both inouts to that.

   针对这种场景,这里给出一个解决方案,ddrWrapper重写如下:

case class ddrWrapper() extends Component {
  val ddrCtrlInst = ddrCtrl()
  val ddrModelInst = ddrModel()
  val signal= Analog(Bool())
  ddrCtrlInst.signal <> signal
  ddrModelInst.signal <> signal
}

   修改后即可达成我们想要的效果:

image.png

☆ END ☆

作者:玉骐
原文链接:Spinal FPGA
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注[Spinal FPGA]欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息