能够提高仿真效率的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%。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值