受马車指点,在SpianlHDL里一直被我忽略的两个实用功能
oneFilePerComponent
在生成RTL代码时,默认情况下,SpinalHDL会将生成的Verilog代码全部放在一个文件里。而当我们需要将代码按照模块每个模块生成一个文件时,那么可以利用SpinalConfig中的oneFilePerComponent参数:
import spinal.core._
import spinal.lib._
//方式一
class add(dataWidth:Int) extends Component{
val validIn=in Bool()
val data1=in UInt(dataWidth bits)
val data2=in UInt(dataWidth bits)
val sum=out UInt(dataWidth bits)
val sumValid=out Bool()
sum:=RegNextWhen(data1+data2,validIn)
sumValid:=RegNext(validIn,False)
}
class addInst(dataWidth:Int) extends Component {
val io=new Bundle{
val validIn_0=in Bool()
val data1_0=in UInt(dataWidth bits)
val data2_0=in UInt(dataWidth bits)
val sum_0=out UInt(dataWidth bits)
val sumValid_0=out Bool()
val validIn_1=in Bool()
val data1_1=in UInt(dataWidth bits)
val data2_1=in UInt(dataWidth bits)
val sum_1=out UInt(dataWidth bits)
val sumValid_1=out Bool()
}
val add0=new add(dataWidth)
val add1=new add(dataWidth)
add0.validIn<>io.validIn_0
add0.data1<>io.data1_0
add0.data2<>io.data2_0
add0.sum<>io.sum_0
add0.sumValid<>io.sumValid_0
add1.validIn<>io.validIn_1
add1.data1<>io.data1_1
add1.data2<>io.data2_1
add1.sum<>io.sum_1
add1.sumValid<>io.sumValid_1
}
object addInstApp extends App{
SpinalConfig(
oneFilePerComponent = true
).generateSystemVerilog(new addInst(8))
}
最终,在生成Verilog代码时,会为每个模块单独生成一个文件:
globalPrefix
在《换个名字混江湖》中曾提到,当下我们可能仍不可避免与Verilog打交道。当我们多人在使用SpinalHDL开发而最终提交生成的Verilog代码时对于我们自己写的模块命名我们尚可控制,而调用SpinalHDL的库时那大概率会有模块名称冲突的情况。针对这种场景,SpinalConfig中的globalPrefix可以一用:
object addInstApp extends App{
SpinalConfig(
oneFilePerComponent = true,
globalPrefix = "demo"
).generateSystemVerilog(new addInst(8))
}
如此,生成的Verilog代码每个模块均会有一个前缀:“demo”。
写在最后
文档确实少,且用且摸索吧~
☆ END ☆
作者:玉骐
原文链接:https://mp.weixin.qq.com/s/JKJZia\_agdo5Mjyw5dSHYw
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。