在当前的RTL设计中,国内仍以Verilog/VHDL为主,且不可否认未来或许很长一段时间仍旧是以Verilog/VHDL为主。SpinalHDL作为一门新的硬件描述语言,其充分考虑了这一点,也为我们在SpinalHDL的设计中提供了集成现有RTL设计(IP)的渠道——BlackBox。
BlackBox
顾名思义,SpinalHDL将待集成的RTL设计当作一个黑盒对待,不关心内部的设计,只关心顶层接口及parameter参数(这也是我们在RTL里例化IP时常用的)。我们来看SpinalHDL-doc给出的example:
class Ram_1w_1r(wordWidth: Int, wordCount: Int) extends BlackBox {
// SpinalHDL will look at Generic classes to get attributes which // should be used as VHDL generics / Verilog parameters // You can use String, Int, Double, Boolean, and all SpinalHDL base // types as generic values val generic = new Generic {
val wordCount = Ram_1w_1r.this.wordCount val wordWidth = Ram_1w_1r.this.wordWidth } // Define IO of the VHDL entity / Verilog module val io = new Bundle {
val clk = in Bool val wr = new Bundle {
val en = in Bool val addr = in UInt (log2Up(wordCount) bit) val data = in Bits (wordWidth bit) } val rd = new Bundle {
val en = in Bool val addr = in UInt (log2Up(wordCount) bit) val data = out Bits (wordWidth bit) } } // Map the current clock domain to the io.clk pin mapClockDomain(clock=io.clk)}
整个代码里做了三件事:参数声明、端口声明,时钟域映射。
参数声明