能够提高仿真效率的Verilog编码样式
1.0 Case语句 Vs. if-else-if语句
问题:
将大型case语句编码为等效if / else-if语句时是否存在模拟效率差异?
以8选1多路选择器为例,分别用case语句和if-else-if语句建模,进行比较,如下图
总结
由表1可以看出,case语句与if语句进行编码比较,case语句优于If语句。
2.0 Begin-end添加与否
问题:
当Verilog模型中添加额外的开始 - 结对时,是否存在模拟效率差异?
以具有异步复位功能的可综合D触发器为例。
在图3中,可编程触发器在always块中没有Begin-end语句(这个模型不需要它们)。
在图4中,使用三个不必要的begin-end语句编写了相同的触发器。
然后将1000个触发器实例化到测试平台中并进行模拟。
总结
由表二可以看出,不添加begin-end语句速度会快一点,所以Begin-end在没有必要的情况下能省则省。
3.0 `define Vs. Parmeters
问题:
使用`define宏和 Parmeters之间有什么模拟效率差异?
如何通过在模型实例化中使用参数重定义和使用defparam语句重新定义参数来影响参数效率?
该基准测试的测试用例是具有9个参数延迟的模型(图5)和9个`define - 宏延迟(图6)。
使用定义的宏(图7),defparam语句(图8)和#parameter重新定义(图9)创建测试平台。
总结
由表3可以看出,parameter 和 defparams 比`define 多占用内存。
always模块的数量
比较图10的两个code。
总结
由表4可以看出,多用三个always语句将比用1个always语句多占用内存,多占用时间。
端口连接
问题:通过模块端口传递数据是否存在惩罚,而不是通过分层引用传递数据?
这一基准的想法来自福特微电子公司1994年国际Verilog会议上由Martin Gravenstein [1]提出的论文。
这个基准测试的测试用例是一对触发器。
第一个触发器没有端口,并且通过分层参考进行与该模型的测试平台通信。第二个触发器是一个与测试平台进行正常端口通信的模型(图11)。
总结
表五的结果表明, 定义四个端口的范例将使用 更多的仿真时间。
仍建议使用模型端口使用和通信; 但是,通过端口传递监视器数据将是模拟时间昂贵的。 最好分层引用受监控的状态和总线数据
这些结果还表明,具有额外层次结构的模型将显着减慢模拟速度
`Timecale效率
问题:在仿真过程中使用更高精度的时间刻度是否存在模拟器性能损失?
该基准测试用例是具有传播延迟的缓冲器和逆变器,可通过各种“时间尺度”模拟(图12)。
总结
表6中的结果表明,使用1ns / 1ps的时间刻度需要比使用1ns / 1ns的时间刻度的相同模型多大约156%的内存和大约99%的模拟时间。
Displaying $time Values
问题:在模拟过程中向STDOUT显示不同的$ time值是否有任何模拟器性能损失? $ time显示格式说明符会影响模拟性能吗?
这个基准的想法来自1995年ICU的Cadence的Jay Lawrence [2]提出的论文。 此基准测试的测试用例是一组不同的时间值显示命令(图13)。
总结
表7中的结果表明,在模拟时间中不必要地显示$ time值是非常昂贵的
时钟振荡器
问题:使用始终块,永久循环或Verilog门原语实现时钟振荡器是否有任何显着的仿真器性能优势?
该基准测试的测试用例是三个有条件编译的时钟振荡器实现,为触发器模型提供时钟(图14)。
总结
表8中的结果表明,栅极时钟振荡器比行为时钟振荡器慢约85%。