》看不懂的错误
在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端口也是这么连接的。然而在运行的时候却报了下面的错误:
这错误类型我熟,但貌似明显我并没有犯这个错误啊……
》解决之道
首先需要说明的是,这种使用场景也仅在仿真的时候会使用到,而真实的设计场景是不会有这么用的。但上面这个场景确实存在。在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
}
修改后即可达成我们想要的效果:
原作者:玉骐
|