verilog 写rtl注意事项_SpinalHDL——集成你的RTL代码

本文介绍了在SpinalHDL中如何使用BlackBox集成Verilog编写的RTL代码,包括参数声明、端口声明、时钟域映射以及避免端口名前缀的方法。此外,还展示了如何利用Scala的伴生对象简化多次IP例化过程,提高代码复用性。
摘要由CSDN通过智能技术生成

b8f5ab82614b82eb8eb329f676ea770e.png

    在当前的RTL设计中,国内仍以Verilog/VHDL为主,且不可否认未来或许很长一段时间仍旧是以Verilog/VHDL为主。SpinalHDL作为一门新的硬件描述语言,其充分考虑了这一点,也为我们在SpinalHDL的设计中提供了集成现有RTL设计(IP)的渠道——BlackBox。

dd85ff1ab969b9a1a3ac625aee5040d3.png

54dfbe7424e0ab505f3bfdcfb070d7ec.png

BlackBox

1af328bcfd3c441e1f6c2ff7130fa318.png

    顾名思义,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)}

    整个代码里做了三件事:参数声明、端口声明,时钟域映射。

5f502da0f49e77b49f861546a2313d0d.png 54dfbe7424e0ab505f3bfdcfb070d7ec.png

参数声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值