一、仿真概述:功能仿真与后仿真的定义、目的、在芯片设计流程中的位置

各位同学好,我是老李。今天咱们聊聊芯片仿真这件事。

说实话,干了十几年芯片验证,我见过太多因为仿真没做透就匆匆流片的案例。结果呢?要么回来没法用,要么性能差得离谱。今天这堂课,我就把功能仿真和后仿真这点事儿,掰开了揉碎了讲清楚。

1.1 什么是功能仿真?

功能仿真,说白了就是验证你的代码逻辑对不对。

你写了一段Verilog代码,描述了一个加法器。功能仿真就是给它输入1+1,看看输出是不是2。如果输出是3,那代码肯定写错了。

我个人习惯把功能仿真叫做「逻辑验证」。它只关心功能是否正确,完全不考虑门延迟、线延迟这些物理因素。换句话说,它假设所有门都是理想器件,信号瞬间就能传过去。

功能仿真的核心目的:

  • 验证RTL代码的功能正确性
  • 检查状态机跳转是否合理
  • 确认数据通路是否按预期工作
  • 发现设计中的逻辑错误

我在项目中遇到过一件事:有个同事写了一个FIFO,功能仿真跑得妥妥的,读写指针完全正确。结果后仿真一跑,数据全乱了。为什么?因为功能仿真里没有考虑时钟偏斜和竞争冒险。嗯,这里要注意,功能仿真通过不代表设计没问题。

1.2 什么是后仿真?

后仿真,也叫门级仿真。它是在综合之后,用门级网表加上标准单元库的延迟信息来做的仿真。

你想想看,芯片里的每个门都有延迟,每根线都有电阻电容。信号从A点传到B点,不可能像功能仿真里那样瞬间到达。后仿真就是把这些物理效应考虑进去,看看你的设计在真实世界里能不能正常工作。

我曾经踩过一个坑:一个简单的计数器,功能仿真完全正常。后仿真时发现,在时钟上升沿附近,数据刚好在变化,导致采样到了错误的值。这就是典型的建立时间违例。如果没有后仿真,这个bug就带到流片里去了。

后仿真的核心目的:

  • 验证时序约束是否满足
  • 检查是否存在竞争冒险
  • 确认门级网表功能与RTL一致
  • 发现因延迟导致的逻辑错误

1.3 两者在芯片设计流程中的位置

我画了一张图,帮你理清功能仿真和后仿真在整个流程中的位置:

芯片设计流程中的仿真位置 需求分析 RTL设计 功能仿真 ← 验证逻辑功能 逻辑综合 后仿真 ← 验证时序与功能 流片 功能仿真特点 • 无延迟信息 • 速度快 • 验证逻辑正确性 • 可覆盖大量用例 后仿真特点 • 含延迟信息 • 速度慢 • 验证时序正确性 • 用例数量有限

从这张图你可以看到,功能仿真在RTL设计之后、综合之前。后仿真在综合之后、流片之前。两者缺一不可。

1.4 为什么两者都要做?

有人可能会问:功能仿真都通过了,为什么还要做后仿真?

我举个例子你就明白了。假设你写了一个握手协议,功能仿真里两个模块握手完全正常。但后仿真时发现,因为路径延迟不同,一个模块的ready信号比另一个模块的valid信号晚到了几个纳秒,导致数据丢失。这种问题功能仿真根本发现不了。

重要提醒:

功能仿真通过 ≠ 设计正确。后仿真通过 ≠ 芯片一定能工作。但两者都通过,流片成功的概率会大幅提升。

我个人习惯的做法是:先跑大量功能仿真用例,覆盖所有正常场景和异常场景。功能仿真通过后,再挑几个关键用例跑后仿真,重点检查时序和竞争冒险。这样既保证了覆盖率,又不会让后仿真拖慢整个流程。

1.5 一个简单的对比表格

对比项 功能仿真 后仿真
输入 RTL代码 + Testbench 门级网表 + SDF延迟文件
速度 快(每秒几千到几万周期) 慢(每秒几十到几百周期)
覆盖范围 可以跑大量用例 只能跑少量关键用例
发现的问题 逻辑错误、状态机错误 时序违例、竞争冒险
执行阶段 综合之前 综合之后、流片之前

好了,关于功能仿真和后仿真的基本概念,我就讲到这里。记住一句话:功能仿真保逻辑,后仿真保时序。两者配合,才能让你的芯片在流片后正常工作。

我的经验之谈:

刚入行的时候,我觉得后仿真太慢,总想跳过。直到有一次,一个简单的SPI接口,功能仿真全过,后仿真却发现了数据采样错误。从那以后,我再也不敢轻视后仿真了。你想想看,流片一次几十万甚至上百万,因为省几天仿真时间而冒这个风险,不值得。


专注资料整理