✎ 编 者 按
最近小伙伴儿遇到了一件神奇的事情,仿真明明跑完了打开生成的波形却发现自己跑了个寂寞~
没毛病的代码
为说明问题与方便理解,这里采用下面的代码来进行说明:
这段代码很简单,sumTop下例化了两个sum模块。
仿真代码如下:
似乎看起来都没问题,仿真跑完后看到的波形文件结构却是这样的:
波形跟踪记录只到了sumTop一层,而例化的两个sum模块对应的波形却没有……
真相只有一个
既然出此状况,那必然坑是自己挖的而非工具忘了记录。先看上面的仿真代码,仿真既然能顺利走下去那么仿真代码大体无差,而在SimConfig配置里withWave并未指定depth,也就意味着一定会记录全部层级的信号。基于此两点那么问题应该出在设计上了。
要知道SpinalHDL在仿真时依旧会将设计生成RTL代码交给仿真器去执行,其生成的RTL代码如下:
代码的确例化了两个sum模块,看起来似乎也没问题……
是么?有一点可否注意到,两个sum的例化名称都是以"\_"开头的, 有一点需要提醒的是在SpianlHDL仿真里凡是以"\_"开头的信号量在仿真波形生成的时候是都不会记录的(这也是为什么我们写的代码生成RTL仿真时那些匿名变量都没有被记录下来)~
回到设计代码:
这里Area的声明采用了匿名变量"\_",这也就直接导致了sum的例化均当成匿名变量来进行了处理。这里略加修改:
此时再进行仿真所有的信号波形就都被记录下来了:
关于Area的使用
像上面的代码之所以会声明一个Area是因为在早期SpinalHDL版本(1.5.0之前)里如果不加Area声明那么在生成Verilog代码时信号变量可读性较差,而放在Area里则可以很好的保留信号原有的名称,信号名在1.5.0版本开始有了极大的改善和提升,所以上面的模块把Area拿掉生成Verilog时依旧会保留原有的信号名。
从个人开发习惯来讲,除了通过Area来抽象一些组件之外在Component里还是倾向于按照功能来放置到不同的Area里取得,如此能够将Component功能实现有更清晰的划分,也能够在仿真调式时卡快速的将某个功能块的信号通过前缀索引一键添加进行调式~
☆ END ☆
作者:玉骐
原文链接:https://mp.weixin.qq.com/s/Qc1m3Wmwyn8PyKiUFrCCDw
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。