在FPGA的开发过程中,在线抓取波形往往是终极调试大法。而如何抓取信号,相信做逻辑开发的小伙伴都是轻车熟路,张口就来,无非两种方式嘛:待跟踪信号添加原语或者手动例化Ila。而在SpinalHDL里,我们的代码是基于Scala来完成的,虽然生成的RTL代码可读,但我好不容易上手了SpinalHDL了你要我添加待跟踪波形信号时去生成的RTL代码里去寻找待添加波形信号么? 图样图森破,在SpinalHDL里,我们一样可以实现优雅的添加待跟踪波形信号。
姿势一
在Verilog代码里,我们想要添加波形跟踪信号时往往在待跟踪信号上添加厂商约束原语,如下所示:
so easy!貌似在SpinalHDL生成的RTL代码添加个原语约束也很容易,但学会了SpinalHDL怎么可以这么做呢,在SpinalHDL里,我们可以同样实现。
SpinalHDL提供了addAttribute语法来帮助我们实现给某个信号添加我们想要的综合实现属性。
诸君请看:
在这段简单的代码里,我们想要抓取跟踪counter,只需要在代码里给counter添加addAttribute属性即可,来看下他生成的RTL代码:
完全实现了我们想要的结果。 姿势二
通过对变量添加addAttribute属性虽然可以用来进行信号波形跟踪,但在PR工程的虚拟JTAG(通过PCIe模拟JTAG环境)场景里这种方式就无能为力了,只能通过例化ILA的方式去添加待波形跟踪信号。在SpinalHDL里,我们可以借助blackBox及scala语言本身实现在SpinalHDL环境里实现对ILA的集成。
上面的代码实现了用于添加ILa单元实现波形追踪的代码,在调用时会同时生成用于生成相应ILa IP的tcl脚本,从而能够轻松的在SpinalHDL中实现对待跟踪波形信号的抓取实现。
下面一段代码展示了如何在SpinalHDL里添加ILA:
在上述代码中。就像声明一个类对象一样调用ILa,同时借助SpinalHDL对跨层次信号调用的支持(A.B.xxx.pull(),想想在RTL里如果通过例化ILA的方式添加跨层次信号我们要多做多少工作~),我们可以在顶层直接把所有待跟踪信号添加到一个ILA中,我们看下生成的RTL代码及Tcl脚本:
把生成的RTL代码和tcl脚本放进Vivado里直接跑连手动例化ILa IP的功夫都省了~
原作者:玉骐