生成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
}
}
领取专属 10元无门槛券
私享最新 技术干货