首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

spinalHDL生成verilog时对相关的元素剪裁控制

生成verilog时的信号剪裁控制

SpinalHDL在生成verilog 或vhdl语言时,默认只会把与顶层模块里输出信号相关的内容转化为verilog或vhdl代码, 而与顶层文件的输出端口无关联的东西都不会转化为verilog代码输出,其中只与输入端口相关的东西也不会产生verilog代码输出,是不是不太笨?你可以乱七八糟写一大堆代码,只要这堆代码不会直接或间接影响顶层的任何输出端口,则Spinal Hdl在输出verilog时,都会把它们剔除掉的。

在生成RTL代码时,所有被剔除的无用信号,都会把spinal hdl输出到一个list对象中,即为裁剪信号(pruned signals),你可以通过 printPruned 和printPrunedIo 函数将其打印报告输出,以便于你查看分析,例如:

class TopLevel extends Component {

val io = new Bundle {

  val a,b = in UInt(8 bits)

  val result = out UInt(8 bits)

}

io.result := io.a + io.b

val unusedSignal = UInt(8 bits)

val unusedSignal2 = UInt(8 bits)

unusedSignal2 := unusedSignal

}

/* unusedSignal和unusedSignal2经过了一系列定义和运算,但是都不会对端口输出产生任何影响,因此默认生成verilog时,它们会被剔除 */

object Main {

def main(args: Array[String]) {

  SpinalVhdl(new TopLevel).printPruned()

  //This will report :

  //  [Warning] Unused wire detected : toplevel/unusedSignal : UInt[8 bits]

  //  [Warning] Unused wire detected : toplevel/unusedSignal2 : UInt[8 bits]

}

}

对与默认被剔除的要素,也可以使用keep函数,告诉spinal在生成verilog时保留这些要素,这样做的目的,一般都是为了某种测试和代码调试,例如:

class TopLevel extends Component {

val io = new Bundle {

  val a, b = in UInt(8 bits)

  val result = out UInt(8 bits)

}

io.result := io.a + io.b

val unusedSignal = UInt(8 bits)

val unusedSignal2 = UInt(8 bits).keep()

unusedSignal  := 0

unusedSignal2 := unusedSignal

}

object Main {

def main(args: Array[String]) {

  SpinalVhdl(new TopLevel).printPruned()

  // This will report nothing

}

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210212A0427400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券