十二 · 2021年11月15日

仿真仿了个寂寞?

✎ 编 者 按 
最近小伙伴儿遇到了一件神奇的事情,仿真明明跑完了打开生成的波形却发现自己跑了个寂寞~

没毛病的代码

为说明问题与方便理解,这里采用下面的代码来进行说明:

图片.png

这段代码很简单,sumTop下例化了两个sum模块。

仿真代码如下:

图片.png   似乎看起来都没问题,仿真跑完后看到的波形文件结构却是这样的:

图片.png

波形跟踪记录只到了sumTop一层,而例化的两个sum模块对应的波形却没有……

图片.png

真相只有一个

既然出此状况,那必然坑是自己挖的而非工具忘了记录。先看上面的仿真代码,仿真既然能顺利走下去那么仿真代码大体无差,而在SimConfig配置里withWave并未指定depth,也就意味着一定会记录全部层级的信号。基于此两点那么问题应该出在设计上了。

要知道SpinalHDL在仿真时依旧会将设计生成RTL代码交给仿真器去执行,其生成的RTL代码如下:

图片.png

代码的确例化了两个sum模块,看起来似乎也没问题……

是么?有一点可否注意到,两个sum的例化名称都是以"\_"开头的, 有一点需要提醒的是在SpianlHDL仿真里凡是以"\_"开头的信号量在仿真波形生成的时候是都不会记录的(这也是为什么我们写的代码生成RTL仿真时那些匿名变量都没有被记录下来)~

回到设计代码:

图片.png

这里Area的声明采用了匿名变量"\_",这也就直接导致了sum的例化均当成匿名变量来进行了处理。这里略加修改:

图片.png

此时再进行仿真所有的信号波形就都被记录下来了:

图片.png

关于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
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息