模拟调试在SpinalHDL中还能用吗?

2021-06-17 10:37 来源:电子说

如果要问什么看起来最长,一定是波形。除了看波形还能做别的吗?

调试“三十六计”

059fc8fe-c9c8-11eb-9e57-12bb97331649.png

作为一个逻辑开发者,仿真是一个必然的话题。虽然严格来说设计和验证是分开的,但是对于FPGA开发来说,即使是大厂商也很少有专门的逻辑验证器来支持你的工作。无论是单元级仿真还是系统级仿真,那几年我们经常用仿真调试的方法,第一估计就是看波形。但是说实话,看小模块或者小案例的波形是可以的,但是如果一个比较大的模块或者案例运行时间比较长,那么跟踪波形对我个人来说还是浪费眼睛~

那么除了看波形之外,我们常用的仿真调试方法无非是在待仿真测试的逻辑中加入打印和加入SVA。对于添加打印,以前经常在verilog/systemVerilog中移动砖块时进行,但SVA在学校时读过以下书籍:

现在如果转到SpinalHDL,这些方法还能用吗?

主张

059fc8fe-c9c8-11eb-9e57-12bb97331649.png

与SystemVerilog类似,SpinalHDL也提供了断言功能,其关键字是断言:

断言(断言:Bool,消息:字符串=空,严重性:资产节点严重性=错误)断言(断言:Bool,消息:序列[任意],严重性:资产节点严重性)

断言:断言条件

Message:断言失败时显示的消息,可以是字符串或Seq。

严重性:断言级别。

来看看演示吧:

pYYBAGDKqMiAXbFuAAFxmXl5Rhg455.jpg

这里放置了两个断言,它们有两种用法。在邮件中放置Seq时,您可以显示更多提示信息。我们应该知道,即使我们使用SpinalHDL,我们仍然需要生成Verilog文件,以便模拟器在模拟过程中执行。看看生成的RTL代码:

pYYBAGDKqAKAFKFZAAE0dJBUbdw865.jpg

可以看出,在SpinalHDL中,对于SVA的即时断言和并发断言,只支持并发断言。此外,生成额外的逻辑来支持断言,并且在复位期间不执行断言检查。

报告

059fc8fe-c9c8-11eb-9e57-12bb97331649.png

SpinalHDL中提供了报告方法,以逻辑方式显示打印信息:

def report(message:String)=assert(False,message,NOTE)def report(message:Seq[Any])=assert(False,message,NOTE)def report(message:Seq[Any],Seq:AsertnodeSessive)=assert(False,message,Sessive)您可以看到报表的底层实现是基于assert的,默认断言失败,因此信息将始终打印出来。与上面的dmeo一样,我们可以添加以下打印信息:

报告(Seq("data0:",io.data0," data1:",io.data1," sum:",io.sum),WARNING)

在生成的RTL代码中将有:

poYBAGDKp_yAUeVJAADPLU4VgLQ035.jpg

不出意外,复位时不会打印任何信息。

正式的

059fc8fe-c9c8-11eb-9e57-12bb97331649.png

为了支持SVA,SpinalHDL提供了部分支持。以下演示在SpinalHDL-Doc中给出:

pYYBAGDKp_KAKvVsAAF7a7PJauA080.jpg

对象my TopLeveSystemVerilogwith formula { def main(args:Array[String]){ val config=spinal config(DefaultconfigForclockdomain=ClocDomainconfig(r EsetKind=SYNC,ReSETTopivelLevel=HIGH))config . includeformal . generateSystemVerilog(new TopLevel())} }

但是这个演示有几个问题:1。当使用GenerationFlags . formular和includeFormal时,如果我们的代码在GenerationFlags之外,如果使用了assert或report,GenerationFlags . formular将屏蔽它,这在模拟中不起作用。2.verilator中不支持initstate()。要解决以上问题,可以采取:1。用GenerationFlags.simulation和includeSimulation替换GenerationFlags.formal和includeFormal。2.如果要在重置过程中添加sva,请将initstate()替换为clockDomain.isResetActive。如果在生成Verilog时未添加includeSimulation,则不会在Verilog中生成GenerationFlags.simulation中包含的内容,从而提供干净的代码。手册中给出了支持的sva:

pYYBAGDKp-uAVGcSAAFaHOXsqfU933.jpg

但是,这取决于仿真器是否支持它。毕竟verilator和vcs的功能还是有差距的。

文章来源:脊柱FPGA

图片来源:类似ape和ape的FPGA

负责编辑:lq6

延伸 · 阅读