编 者 按
用DataAnalyzer快速处理没有使用到的端口信号
避不开的场景 如果熟悉SpinalHDL设计,那么都应该清楚在SpinalHDL设计里,如果输出端口没有给明确赋值的话,那么在生成RTL代码时会报错提示我们没有为端口赋值。想想如果你在设计一个AXI4的测试逻辑,但你并不需要使用里面的全部信号(要知道AXI4总线配置里面的哪个信号使用哪个不使用可使一大堆参数),如果想要做的模块在任何场景下都能直接连接使用的话,最早对于我没有使用的信号我是这么来处理的:
if(axi4Port.useRegion) axi4Port.clearAll() if(axi4Port.useLock) axi4Port.lock.clear() ……是不是写起来很啰嗦?~ 还有一个场景就是在FPGA里面在制作PR版本时对于动态区和静态区之间的接口信号为了方便后续Impl版本的时序收敛,对于没有使用到的信号以及赋常值的信号都建议添加约束:
对于输入没有使用到的信号,内部定义一个寄存器来锁存信号,并把这个寄存器的属性设置为nopurne
对于暑促好信号,则建议将输出信号必须为reg类型,并将该输出信号配置为preserve属性。
对于这种使用不到的信号,一个个的follow这些原则不免有点儿太过于“体力活”~ 而在SpinalHDL里,我们可以通过DataAnalyzer来快速地实现这些没有使用到的端口信号。 》DataAnalyzer
考虑下面这个简单的模块:

在这个模块里,对于输入的data1接口我们并没有用,而对于输出out2端口,我们也并没有输出赋值。
现在,如果我们想要实现针对PR那种场景的需求,我们可以通过DataAnalyzer来写一个通用的处理代码:

这里我们为模块添加一个PrePopTask。对于io里面的每个信号,都例化一个DataAnalyzer,对于接口为输入信号(port.isInput),并且其没有任何扇出信号(analysier.getFanOut.isEmpty),则将其赋值给一个寄存器,并对该寄存器添加“nopurne”属性。而如果接口信号为输出信号(port.isOutput),并且没有任何的信号给他赋值(analysier.getFanIn.isEmpty),则将其设置为寄存器,赋值为0并添加“preserve”属性。最终生成的代码:

完全符合我们的需求~
结语
能省功夫就省功夫,在Boss的许可下,选择尽可能高效的工具,这周工作里修改一个Verilog代码,在SpinalHDL里面五分钟能实现的需求Verilog里改了小半天,极大打击工作热情~
全部0条评论
快来发表一下你的评论吧 !