1.可综合四大宝:
- always
- if-else->映射为多路选择器:输出由输入的条件决定
- 加法电路形式复杂
- 多路选择器电路简单
- 单if语句->无优先级判断
- 多if语句,具有优先级的判断结构->最后一级优先级最高->消耗组合逻辑(不推荐)
- 最高优先级给最迟的信号
- case 无优先级译码电路
- assign 连线
- 高性能编写方法
- if-else相关语句的硬件结构映射及优化
- 两种写法的if
- 第一种性能好
- 第二种面积小(加法器复杂)
- case相关语句的硬件结构映射及优化
- 无优先级的判断结构
- 与if的区别:条件互斥,多用于指令译码电路
- 慎用latch
- 逻辑综合工具很难解释latch,因此除非特殊用途,一般避免引入latch
- 异步电路和门控时钟时用到latch
- 电平触发,非同步控制,使能信号有效时latch相当于通路,无效时latch保持输出状态。DFF(D触发器)由时钟触发,同步控制
- latch容易产生毛刺,DFF不易产生毛刺
- 会将静态时序分析变得极为复杂
- 最大危害在于无法过滤毛刺,这对下一级电路是极其危险的;能用DFF就不用latch
- 不完备的条件判断语句else default
- casez,条件不互斥则存在优先级
- full case 原语告诉编译器条件已完备
- synopsys parallel_case高速所有条件均互斥,且并行,无优先权
- 逻辑复制
- 通过逻辑复制,降低关键信号的扇出,进而降低该信号的传播延迟,提高电路性能。
- 扇出:扇出(fan-out)是定义单个逻辑门能够驱动的数字信号输入最大量的术语
- 复制同样的逻辑,让门输出能够正确驱动后面的门电路
- 逻辑共享
- 资源共享、减小面积
- 但会导致性能下降,但面积减小
- 资源顺序重排
- 如果某个信号来的比较晚,可将其放在后面,隐藏其延时
- 少用:?赋值语句
- 尽可能使用always块用于逻辑运算
- assign仅用于连线
- 可综合风格
- 完整的always敏感信号列表
- 所有的组合逻辑或锁存的always结构必须有敏感信号列表=所有的输入信号
- 综合过程将产生一个取决于除敏感信号列表中所有其他值的结构,他可能在行为仿真和门级仿真间产生潜在的失配
- 每个always敏感信号列表对应一个时钟
- 这是将每一个过程限制在单一寄存器类型的要求
- 不允许wait 声明和#delay声明
- RTL级转换到gate级的综合工具一般都不支持wait声明和#delay声明,为了有效综合,这些语句应该避免
- 例外:在不需要综合的测试模块,表示行为的虚拟器件模块中可以使用
- 时序逻辑必须使用非阻塞赋值<=;组合逻辑的必须使用阻塞赋值=
- 模块划分
- 分开同步逻辑与异步逻辑
- 避免综合时的问题,简化约束和编码难度
- 例外:不可应用于非综合模块中(总线模块,总线监视器是模拟模块)除非他们被设计来综合仿真
- 分开控制逻辑和存储器
- 建议控制逻辑和存储器逻辑分成独立的模块
- 原因:便于高层的存储器模块的使用和便于重新描述行为不同的存储器类型
- 总结
- 初学者误区:verilog代码当作了程序,把电路设计当成了编程
- 如何写好高性能verilog HDL:
- 牢记并理解可综合“四大法宝”所对应的硬件结构
- 写前,确认电路的指标是什么:性能?面积?
- 硬件思维方式,代码不再是一行行的代码而是一块块的硬件模块
- 对所需实现的硬件电路“胸有成竹”
- 电路的质量取决于代码的书写方式,不要把电路性能优化寄希望于综合工具
在RTL书写中如何考虑延迟和面积
- 将晚到的数据放到最后一级
- 在RTL编码中考虑时延
- 多if语句,有优先级,最后一个if优先级最高
- 将晚到的数据放到最后一级,但要 保持电路功能
- 将原有输出b的条件都放在最后
- 单if语句 控制信号较晚
- 将延迟最大的分支单拿出来放在另一个always块中
- 嵌入case;将晚到的case及之前的条件提取出来,单独放在always中
- 先加后选和先选后加,其中有延迟信号时
- 在RTL编码中考虑面积
- 随着芯片工艺的进步和生产成本的降低,面积显得没有时序问题重要
- 减少设计面积:成本降低、功耗降低-特别是对于FPGA的设计-直接决定着FPGA的选型
- 一般综合过程中可以对面积进行优化,但在RTL代码中如果注意节约设计的面积,往往可以达到事半功倍的效果
- 较少设计面积:估计使用资源的数量
- 触发器:数量:由功能决定,很难减少。面积:比较好估计
- 加法器
- 乘法器
- 知到设计中哪些部分占用了较大的面积
- 组合逻辑仍是优化的重点->RTL代码->各种操作符
- RTL代码中的一个+可能对应着一个64位的加法器
- +-*/条件语句中的比较:判断其必要性,是否能用更简单的运算替代
- 如果必须使用复杂的运算符,则应考虑是否可以资源共享,综合器优化能力有限
- 多bits信号是否都参与操作,如果不是,则可以只对需要的部分bit进行操作
- 针对不同的设计:可能有各种各样的优化和改进的方法
- 编写代码:应对操作符有足够的重视
- 对有可能的简化的地方尽量简化
- 逻辑简化-减少面积的同时也减少了延迟
- 在RTL代码中考虑功耗问题
- 功耗公式
- 减少翻转频率的方法
- 门控时钟(综合工具插入)(直接关掉时钟)
- 增加使能信号,使得部分电路只有需要工作时才工作(信号不再翻转,时钟还在翻转)
- 对芯片的各个模块进行控制,在需要工作时才工作
- 除了有用信号和时钟翻转会消耗功耗,组合逻辑的毛刺也会消耗大量功耗。但是毛刺在设计中无法避免,因此只有尽量减少毛刺在电路中的传播,才可以减少功耗。即在设计中,尽量把产生毛刺的电路放在传播路径的最后。另外,可以使用一些减少毛刺的技术
- 对于有限状态机,可以通过低功耗编码来减少电路的翻转
- 考虑全局的功耗控制
- 在RTL编码中,注意消耗功率较多的电路
- 状态机
- 译码器
- 多路选择器
- 在综合中,使用门控时钟和其他减少功耗的优化技术
- 在RTL编码中考虑布线问题
- 布线(routing)最后的阶段:根据门级网表的描述实现各个单元的连接
- 布局:最关键的因素:修改RTL级设计,在RTL级考虑布线会避免出现无法布通的情况
- 即使最好的布局工具,还是可能出现无法布通的情况。
- 热点问题:在一个面积内占用大量的布线资源
- 原因:
- 在RTL编码时使用了特定的结构,如很大的MUX
- 像推起泡一样把大MUX推开
RTL设计的指导原则
- RTL级设计的评判标准
- 时序性能
- 所占面积
- 可测试性
- 可重用性
- 功耗
- 时钟域的分配
- 复位信号设计
- 是否与所用EDA工具匹配
- FPGA/CPLD-是否能发挥这些PLD的结构特点等
- 根据这些目标的组合和优先级设置,可以派生除很多不同的设计原则
- 一般指导原则:
- 面积与速度互换
- 乒乓操作
- 流水线设计
- 面积与速度呼唤
- 面积:一个设计所消耗的目标器件的硬件资源数量或者ASIC芯片的面积
- FPGA 可以用所消耗的触发器和查找表数量来衡量
- CPLD
- ASIC可以用设计的系统门衡量
- 速度:设计在芯片稳定运行时所能达到的最高频率,这个频率由设计的时序状况决定
- 面积和速度得基本原则
- 设计面积小与运行频率高是=>对立统一的矛盾体
- 科学的设计目标:=>面积和速度的平衡思想
- 面积和速度的平衡与互换原则
- 在满足设计时序要求(包括对设计最高频率的要求)的前提下,占用最小的芯片面积
- 在所规定的面积下,使设计的时序余量更大,频率跟高
- 应该认识到它们是和产品的质量、成本直接相关的
- 如果设计的时序余量比较大,运行频率比较高
- 设计的健壮性更强
- 整个系统的质量更有保证
- 设计所消耗的面积更小
- 在单位芯片上实现的功能模块更多
- 需要的芯片数量更少
- 整个系统的成本也随之大幅度削减
- 面积与速度冲突时=>优先满足时序=工作频率
- 面积与速度互换
- 一个设计时序余量较大,所能跑的频率远远高于设计要求
- 能通过功能模块复用减少整个设计所消耗的芯片面积
- 用速度优势对换面积的节约
- 一个设计的时序要求很高,普通方法达不到设计频率
- 可以通过将数据流串并转换
- 并行复制多个操作模块
- 对整个设计采取“乒乓操作”和“串并转换”的思想进行处理
- 在芯片输出模块处再对数据进行“并串转换”
- 操作技巧
- 模块复用
- 乒乓操作
- 串并转换
- 面积换速度
- 模块复制
- 乒乓操作
- 最大特点:
- 输入数据选择单元
- 输出数据选择单元
- 按节拍、相互配合的切换
- 经过缓冲的数据流->数据流运算处理模块->进行运算与处理
- 第二个优点:节约缓冲区空间
- 低速模块处理高速数据
- 实质是通过DPRAM这种缓存单元实现了数据流的串并转换,并行用“数据预处理模块1”和“数据预处理模块2”处理分流的数据,是面积与速度互换原则的体现
- 乒乓操作模块:站在这个模块的两端看数据,输入数据流和输出数据流都是连续不断的,没有任何停顿,因此非常适合对数据流进行流水线式处理
- 流水线式算法:完成数据的无缝缓冲与处理
- 流水线=使用寄存器切割组合逻辑->时间取决于切割后的最慢的阶段时间
- 没切割之前组合逻辑路径较长,有许多闲置
- 例子:频率理论提升三倍
- 比较:
- 总结:
- 特点:
- 通过插入寄存器,将长的串行逻辑链分成较小的部分
- 当系统运算是串行的时候,利用时钟控制,使运算依照顺序接续进行
- 在任何给定时刻,大部分电路都在工作
- 优点:
- 每一部分延时较小->可使用更快的时钟
- 大部分电路同时进行运算->可提高数据通过量
- 流水线的参数设计:
- 系统时钟取决于最慢的流水线级的延时
- 流水线时钟周期Tpipe=max{T1,T2,...Tm}
- 第i级的时钟周期Ti>tff+tsu+td,i+ts,i+1
- 流水线分割点及级数的确定要考虑的因素
- 单元延迟时间及时钟频率的大小决定了数据通过速率
- 过多的级数不一定能产生最快的结果
- 太多寄存器的插入会导致芯片面积增加,布线困难,时钟偏差增加
同步电路与跨时钟域电路设计
同步电路与亚稳态
- 同步电路
- 电路中的所有受时钟控制的单元,全部由一个统一的全局时钟控制
- EDA工具可以保证电路系统的时序收敛,有效避免竞争冒险现象
- 减少噪声影响
- 缺点:时钟偏斜
- 同一pll叫同步时钟
- 异步电路
- 跨时钟域传输
- 亚稳态:触发器无法在某个规定时间内达到一个可确认的状态
- 双锁存器(降低亚稳态概率)
- 单bit传输
- 慢时钟->快时钟:边沿检测(两级缓存,再边沿检测)
- 快时钟->慢时钟:脉冲同步器
DC设计综合
- 转译 优化 映射