第一次做后仿,就出现了问题,发现如果不加SDF,波形也会有延时:
后来发现,这些延时都是仿真库中定义的,而且加载SDF后的延时就是实际的延时了,而不是库中定义的延时,但出现了好多违例,modelsim波形如下:
箭头处出现了hold time违例,原来是仿真库中含有时序检查函数:
$setuphold(posedge CK &&& (SandR == 1), posedge J, tsetup$J$CK, thold$J$CK, NOTIFIER);
$setuphold(posedge CK &&& (SandR == 1), negedge J, tsetup$J$CK, thold$J$CK, NOTIFIER);
$setuphold(posedge CK &&& (SandR == 1), posedge K, tsetup$K$CK, thold$K$CK, NOTIFIER);
$setuphold(posedge CK &&& (SandR == 1), negedge K, tsetup$K$CK, thold$K$CK, NOTIFIER);
而我有几条路径不满足仿真库中定义的hold time(500ps),但我奇怪:SDF中不是也有时序检查函数吗?为什么仿真库中也有,不是多此一举吗,不会覆盖SDF中的函数吗,后来发现SDF中并没有检查hold time:
(TIMINGCHECK
(WIDTH (posedge CK) (0.211::0.211))
(WIDTH (negedge CK) (0.386::0.386))
(SETUPHOLD (posedge D) (posedge CK) (0.258::0.258) ())
(SETUPHOLD (negedge D) (posedge CK) (0.494::0.494) ())
(SETUPHOLD (posedge RN) (posedge CK) (0.243::0.243) ())
(SETUPHOLD (negedge RN) (posedge CK) (0.501::0.501) ())
后来我针对违例的cell在SDF中手动加入了保持时间的定义 : (SETUPHOLD (posedge D) (posedge CK) (0.258::0.258) (0.123::0.123)),然后再仿真,modelsim没有报错了,可见如果SDF和仿真库中都有时序检查函数,那么SDF具有高的优先级。
但是不明白encounter为什么生成的SDF中没有检查hold time,只好先修改布局布线,将encounter的hold time的threshold设置为仿真库中的500ps(options——set mode——mode setup),如下图:
,生成新的版图和SDF,网表,再仿真,modelsim就没有报错了
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 开发的设计和重构,为开发效率服务