为什么我的SystemVerilog仿真还是很慢?

        最近看下了Cliff Cummings的几篇Paper,大佬就是大佬,思考问题的角度果然和我等不一样。不过也发现这位大佬明显有一定的强迫症,居然还专门写了一篇文章来纠正单词拼写的错误。。。他的Paper中有一篇专门介绍SystemVerilog仿真变慢的原因,这里就简单记录一下。文章名是“Yikes! Why is My SystemVerilog Still So Slooooow?”,感兴趣的同学下来可以详细阅读下。

 

  • 避免使用多层的foreach来进行遍历,对每一个元素进行函数计算
  • Explain:SystemVerilog仿真仍然是一种软件的行为。对于function/task,每次调用都会存在对堆栈数据的操作,导致耗费很多无效的时间。简单的function/task在编译时已经通过内联(in-lined)解决了调用问题,但是对于稍微复杂的调用,仍然是一个问题。

 

  • 避免在循环中嵌入常量计算。
  • Explain:尽量将常量计算移除循环,虽然很多仿真器已经做了优化,但是这么做仍然是一种很好的编码习惯。

 

  • 尽量在全向量上进行操作,而不是bit级的操作。
  • Explain:显然,一步到位对于仿真器来说跑的更快一些。

 

  • 使用ref关键字。
  • Explain:ref关键字表示直接对目标内存进行操作,与传递值的方式相比,节省了很多不必要的时间。尤其是对于一些庞大的数据结构。

 

  • 尽量重复使用对象,而不是不停的创建对象。
  • Explain:SystemVerilog中的内存回收是自动进行的,但这并不能表示我们应该随意使用new()来创建对象,毕竟分配和回收内存也是需要时间的。

 

  • 部分场合可以使用struct替代class
  • Explain:观点还是挺有意思的:class作为一种堆对象会有较大的管理开销。当我们只是需要一种异构的数据类型时,struct结构体还是比较合适的。scoreboard就是一种典型的例子。

 

  • 不要时不时地去唤醒已经沉睡的进程。
  • Explain:显然时不时把别人叫醒是一种不好的行为,尽管很多仿真器已经做了优化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值