课程主页:

http://www.eng.biu.ac.il/temanad/digital-vlsi-design/

课程视频:

https://www.youtube.com/watch?reload=9&v=RbZ3BXbd6_k&list=PLZU5hLL_713x0_AV_rVbay0pWmED7992G

https://www.bilibili.com/video/BV1EA411n7VQ?from=search&seid=14545899898143497364

这次回顾第三讲,这一讲介绍了逻辑综合。

介绍

什么是逻辑综合

  • 综合是将RTL转换为特定于技术的门级网表的过程,针对一组预定义的约束进行优化。
  • 开始:
    • 行为级RTL设计
    • 标准单元库
    • 设计约束的集合
  • 结束:
    • 门级网表,映射到标准单元库
    • 希望在速度、面积、功率等方面也有高效。

具体来说

  • 给定:$\boldsymbol{F}(X, Y, Z, \lambda, \delta)$
    • $X$:输入
    • $Y$:输出
    • $Z$:内部状态
    • $\lambda:X\times Z\to Z$(状态转移函数)
    • $\delta:X\times Z\to Y$(输出函数)
  • 目标:电路$C(G,W)$,其中:

    • $G$:一组电路元器件,例如

    • $W$:连接$G$的线

动机

  • 为什么要进行逻辑综合?
    • 自动管理设计流程的许多详细信息:
      • 减少bug
      • 提高生产率
      • 从任何特定的实现技术中提取设计数据(HDL描述)
      • 设计可以针对不同的芯片技术进行重新综合
        • 例如:先在FPGA中实现,后在ASIC中实现
    • 在某些情况下,会生成比通过人工手段(如:逻辑优化)方法实现的更优化的设计
  • 为什么不进行逻辑综合?
    • 在某些情况下可能导致设计不尽如人意

逻辑综合的目标

  • 最小化面积
    • 在因子计数、单元计数、寄存器计数等方面。
  • 最小化功耗
    • 在单个门的转换活动方面, 激活的电路块等。
  • 最大化性能
    • 同步系统的时钟频率最大化,异步系统的吞吐量最大化。
  • 以上任意组合
    • 不同权重组合
    • 形成约束问题
      • 最小化时钟速度>300MHz的区域面积
  • 更多全局目标
    • 布局反馈
      • 实际物理大小、延迟、布局和布线
它如何工作

多种通用和临时(特殊情况)方法:

  • 实例化:
    • 维护基本模块(AND、OR等)和用户定义模块的库
  • “宏扩展”/替代:
    • 一大组语言操作符(+、-、布尔操作符等)和构造(if-else,case)扩展为特殊的电路
  • 推断:
    • 在语言描述中检测到特殊模式并对其进行特殊处理(例如:从变量声明和读写语句中推断内存块、FSM检测和从always@(posedge clk)块生成)
  • 逻辑优化:
    • 利用逻辑最小化技术对布尔运算进行分组和优化
  • 结构性重组:
    • 先进的技术,包括共享操作符、电路再定时(移动FF)等
基本综合流程

  • 语法分析:

    • 读取HDL文件并检查语法错误。

      read_hdl -verilog sourcecode/toplevel.v
  • 库定义:

    • 提供标准单元和IP库。

      read_libs "/ design/data/my_fab/digital/lib/TT1V25C.lib"
  • Elaboration and Binding::

    • RTL转换为布尔型结构。

    • 状态缩减、编码、寄存器推断。

    • 将所有单元绑定到提供的库。

      elaborate toplevel
  • 约束定义:

    • 定义时钟频率和其他设计约束。

      read_sdc sdc/constraints.sdc
  • 预映射优化:

    • 映射到通用单元格并执行其他启发式操作。

      syn_generic
  • 技术映射:

    • 将通用逻辑映射到技术库。

      syn_map
  • 映射后优化:

    • 迭代设计,改变门的大小,布尔值, 尝试满足约束的体系结构方法。

      syn_opt
  • 报告和导出

    • 报告最终结果,重点是时间报告。

      report timing -num paths 10 > reports/timing_reports.rpt
    • 导出网表和其他结果以供将来使用。

      write_hdl > export/netlist.v

编译

综合流程中的编译
  • 在开始综合之前,我们需要检查语法的正确性。
  • 综合与编译:
    • 编译器
      • 识别正式定义的程序语言中的所有可能的构造
      • 将它们转换为执行过程的机器语言表示
    • 综合
      • 识别硬件描述语言的目标相关子集
      • 映射到具体硬件资源的集合
      • 设计流迭代工具

和高级语言的编译类似:

使用NC-Verilog编译
  • 要编译Verilog代码进行语法检查,使用NC-Verilog工具:

    ncvlog <filename.v>
    • 这将快速运行对Verilog源代码的编译,并指出语法错误。

    • 或者使用irun super命令:

      irun -compile <filename.v>

库定义

标准单元
  • 库定义阶段告诉综合器在何处寻找用于绑定的叶子单元以及用于技术映射的目标库。

    • 我们可以在以下位置提供搜索库的路径列表。

      set_db init_lib_search_path "/design/data/my_fab/digital/lib/"
    • 我们必须提供特定库的名称,通常以单个角落为特征:

      read_libs "TTIV25C. lib"
  • 同时,我们还需要为IP提供lib文件,如内存宏、I/O、

标准单元库是什么
  • 标准单元库是一组定义良好且特征恰当的逻辑门集合,这些逻辑门可用于实现数字设计。
  • 与乐高相似,标准单元必须满足预定义的规范,才能通过综合、布局和布线算法完美地操作。
  • 因此,标准单元库随文件集合一起提供各种EDA工具所需的所有信息。
例子

  • NAND标准单元布局
  • 注意如下内容:
    • 单元高度
    • 单元宽度
    • 电压轨
    • well定义
    • pin位置
    • PR边界
    • 金属层
标准单元库中有哪些单元?
  • 组合逻辑单元(NAND,NOR,INV)
    • 复杂单元(AOI,OAI)
    • 扇入$\le 4$
    • ECO单元
  • 缓存/逆变器
    • 时钟单元
    • 延迟单元
    • 水平移位器
  • 时序单元:
    • 触发器
    • 锁存器
    • 集成时钟门控单元
    • 扫描已启用的单元以进行ATPG扫描
  • 物理单元:
    • Fillers, Tap cells, Antennas, DeCaps , EndCaps , Tie Cells
多重驱动强度和VT
  • 多重驱动强度
    • 每个单元将具有不同的大小输出级。
    • 更大的输出级$\rightarrow$更擅长驱动扇出/负载。
    • 驱动强度更小$\rightarrow$面积小,泄漏少,输入盖少。
    • 通常称为X2、X3或D2、D3。
  • 多重阈值(MT CMOS)
    • 单个附加掩模可以在晶体管通道中提供或多或少的掺杂,从而改变阈值电压。
    • 大多数库都提供三个或更多VT的等效单元:SVT , HVT , LVT,这使速度与泄漏之间能够进行权衡。
    • 所有阈值变种具有相同的足迹,因此无需进行任何布局/布线迭代就可以进行交换。
时钟单元定义
  • 通用标准单元对速度进行了优化
    • 但这并不意味着它们是平衡的。
  • 这对时钟网并不好
    • 不平衡的上升/下降延迟将导致不必要的倾斜。
    • 特殊时钟单元设计有平衡的上升/下降延迟,以最小化倾斜。
    • 这些单元通常对数据不是最佳的,因此不应使用。
  • 一般而言,时钟网只应使用缓冲器/反相器
    • 但有时,我们需要门控逻辑。
    • 特殊单元,如集成时钟门,为时钟网络提供逻辑。
时序单元
  • 触发器和锁存器,包括
    • 正负边触发
    • 同步/异步复位/设置
    • Q/QB输出
    • 启用
    • 扫描

电平换挡器
  • 电平换挡单元放置在电压域之间,将信号从一个电压传递到另一个电压。
  • HL(高到低)换档器
    • 只需要1个电压
  • 左(从低到高)换档器
    • 需要2个电压

Filler and Tap单元
  • 填充单元格必须插入行中的空白区域
    • 确保mask连续性
    • 确保底层密度规则
    • 为规模化技术提供dummy poly
    • 有时,在行的边界上需要特殊的单元格
    • 其他填充物可能包括VDD和GND之间的MOSCAP,用于电压稳定DeCAP电池
  • 好的taps需要确保局部体电压
    • 消除锁存器
    • 不需要对每个单元格tap
  • 反向或前向偏置,用于性能/泄漏优化
    • N-well电压与VDD不同
    • P-well电压与VSS不同
    • 偏置电压作为信号引脚或专用电源网走线

Engineering Change Order (ECO)单元
  • (ECO)是设计中非常晚的变更。
    • ECO通常是在布局和布线之后完成的。
  • ECO通常要求逻辑上的小改动。
    • 布局好之后我们怎么才能做到呢?
  • 解决方案——备用(额外)单元格!
    • 无功能的单元.
    • 设计时添加单元(填充)
  • 特殊标准单元用于区分真实单元。

标准单元库中有哪些文件

Library Exchange Format (LEF)

  • P&R布局摘要说明:
    • 可读ASCII格式
    • 包含用于连接的详细信息PIN信息
    • 不包括线的前端(poly, diffusion等)
  • 仅包含以下内容的摘要视角:
    • 单元格的轮廓(大小和形状)
    • 引脚位置和层
    • 金属堵塞(电池中某层金属被使用,但不是引脚的区域)

技术LEF
  • 技术LEF文件包含有关布局程序和布线程序使用的技术(简化)信息
  • 单元格高度在轨道中测量
  • 轨道越多,晶体管越宽,单元越快
  • 单元格必须符合预定义网格
  • 引脚应与走线轨道重合

Liberty

Liberty(.lib)介绍
  • 如何知道逻辑路径中通过门的时延?
    • 运行SPICE太复杂了
    • 相反,创建一个简化计算的计时模型
  • 目标:
    • 对于每个定时电弧,计算:
      • 传输时延(公式)
      • 输出过渡(trise、tfall)
    • 根据:
      • 输入网转换(trise、tfall)
      • 输出负载电容(Cload)
Liberty(.lib)一般形式
  • 标准单元的时序数据以Liberty格式提供。
    • 库:
      • 库中所有单元格共用的一般信息。
      • 例如,操作条件、电线负荷模型、查找表
    • 单元:
      • 每个标准单元的具体信息。
      • 例如:函数、区域。
    • 引脚:
      • 时序、功率、电容、漏电、功能等。 每个单元中每个引脚的特征。

Liberty(.lib):时间模型
  • 非线性时延模型(NLDM)
    • 驱动模型:
      • 斜坡电压源
      • 固定驱动电阻
    • 接收模型:
      • 最小/最大上升/下降输入上限
    • 非常快
    • 精度超过130nm
    • 使用插值计算

  • 当前源模型(CCS,ECSM)
    • 将单元的非线性输出行为建模为电流源
    • 驱动型号:
      • 非线性电流源
    • 接收模型:
      • 更改电容
    • 需要更多值
    • 需要多一点计算
    • 130nm以下必备
    • 在SPICE的2%以内
Liberty (.lib): 线负载模型
  • 在布局布线之前,如何估计网的寄生(RC)?
  • 线负荷模型估计寄生基于网的扇出。

物理感知综合
  • 由于线载模型的精度不够,导致纳米技术中综合与后期布局的相关性很差。

  • 相反,在综合过程中使用物理信息

  • 物理感知综合在综合器内部运行布局,以获得更准确的寄生估计:

    • 没有平面图,只是用.lef文件

    • 第一次迭代后,将平面图 .def导入综合器

      syn_opt -physical

其他

其他SC库
  • 许多其他文件和格式可以作为标准单元库:
    • GDS
    • Verilog
    • ATPG
    • 电网模型
    • OA数据库
    • Spiece模型
    • 等等