Verilog是用来描述可综合的硬件电路,相比C语言,最显著的区别在于HDL语言具备以下硬件设计的基本概念:
Verilog可综合描述风格,常见的语法描述对应的硬件电路结构
可综合风格
1. 完整的always敏感信号列表
- 所有的组合逻辑或锁存的always结构必须有敏感信号列表。这个敏感信号列表必须包含所有的输入信号。
- 原因:综合过程将产生一个取决于除敏感列表中所有其它值的结构,它将可能在行为仿真和门级仿真间产生潜在的失配。
2. 不允许Wait 声明和# delay声明
- Wait 声明语句,不论是清楚还是含糊,都不能用于可综合设计。
- 原因:从RTL级转换到gate级的综合工具一般都不支持Wait 声明和# delay声明,为了有效的综合,这些语句应该避免。
例外:在不需要进行综合的行为模块中,如测试模块、表示行为的虚拟器件模块中可以使用。
在时序电路中必须使用非阻塞赋值(<=) 组合逻辑电路必须使用阻塞赋值(=)
3. 每个always敏感信号列表对应一个时钟
- 在综合过程中,每个Verilog always敏感信号列表只能对应一个时钟。
- 原因:这是将每一个过程限制在单一寄存器类型的要求。
高性能的编写方法
1. If-else相关语句的硬件结构映射及优化
1.1 if-else硬件结构
- 映射的结构:Multiplexing Hardware (多路选择器),输出结果由输入的选择条件决定。
上图代码映射为两个加法器和一个多路选择器,代码与电路等价。
- 重构if-else映射的硬件结构
通常来说加法器的结构较为复杂,晶体管数量较多,所以减少了一个加法器,减小了硬件的面积。
分析两种电路的传播延迟:
第一个电路中数据通道的延迟是一个加法器和一个选择器,控制通道只有一个选择器。
第二个电路中数据通道和控制通道的延迟都是一个加法器和一个选择器。
如果Aflag到来的时间比较晚,那么第二种电路的性能会比第一种电路的性能差。
需根据输入约束,小心设计:先“加”后“选”,先“选”后“加”
1.2 单if语句
映射为无优先级的判断结构
1.3 多if语句
映射为具有优先级的判断结构
- 最后一级选择信号具有最高优先级
- 具有优先级的多选结构会消耗组合逻辑,不推荐
- 在某些设计中,有些信号要求先到达(如关键的使能信号、选择信号等),而有些信号需要后到达(如慢速信号、有效时间较长的信号等),此时则需要使用if…if…结构。=> 设计方法:最高优先级给最迟到达的信号。
2. case相关语句的硬件结构映射及优化
无优先级的判断结构:
- 与单if语句的区别:条件互斥
- 多用于指令译码电路
3. Latch
3.1 慎用Latch
- 综合器很难解释latch,因此,除非特殊用途,一般避免引入latch。通常只在异步电路和门控时钟会用到latch。
- latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触 发,同步控制。
- latch容易产生毛刺(glitch),DFF则不易产生毛刺。
- latch将静态时序分析变得极为复杂。
一般的设计规则是:在绝大多数设计中避免产生latch。latch最大 的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所 以,只要能用D触发器的地方,就不用latch。
易引入latch的途径:使用不完备的条件判断语句。
防止产生非目的性Latch的措施:
- 使用完备的if…else语句
- 为每个输入条件设计输出操作,为case语句设置default操作
- 仔细检查综合器生成的报告,latch会以warning的形式报告
3.2 full-case和parallel-case综合器指令
- 实际情况已经完备,但是综合器会判断不完备
综合器和现实生活的悖论,直接使用综合器对电路进行综合,那么就会产生一个latch。
解决:可以使用full case的原语, 告诉综合器,当前case结构所列条件已完备。
- 如果条件不互斥,则存在优先级:
解决:可以使用paralle_case, 告诉DC,所有条件均互斥,且并行,无优先权。
4. 逻辑复制,均衡负载
在电路设计过程中如果发现某个电路的负载比较多,那么可以通过逻辑复制,降低关键信号的扇出,进而降低该信号的传播延迟,提高电路性能。
5. 资源共享,减小面积
如果发现电路中存在较多的公共单元,也可以通过资源共享的方式来减小面积。但是一般来说共享会导致性能下降,所以还要根据性能和面积进行取舍。
6. 资源顺序重排,降低传播延迟
如图A信号来的较晚,我们就可以尽可能把它放到后面,隐藏其延迟。
7. ”:?“ 仅用于连线,always用于逻辑运算
模块划分
分开异步逻辑与同步逻辑
- 建议分开异步逻辑与同步逻辑
- 原因:避免综合时的问题,简化约束和编码难度。
- 例外:不可应用于非综合模块中(例如:总线模块,总线监视器或是模拟模块)除非他们被设计来综合仿真。
分开控制逻辑和存储器
- 建议控制逻辑和存储器逻辑分成独立的模块
- 原因:便于高层的存储器模块的使用和便于重新描述为不同的存储器类型
在RTL书写中如何考虑延迟、面积等
在RTL编码中考虑时延问题
例1:假设b信号的延迟较大,到来较晚,那么,电路应该如何修改?
多if结构具有优先级,所以直接把b信号放最后是不行的,需要加上其它满足的条件。
修改:
例2:
改进:
例3:对应的电路结构
改进:
例4:信号CONTROL到达时间较晚,如何修改能够提高电路性能?
改进:复制数据路径,将CONTROL信号放到最后
例5:假设A信号到来较晚,如何修改能够提高电路性能?
改进:
在RTL编码中考虑面积问题
随着芯片工艺的进步和生产成本的降低,面积显得没有时序问题重 要。
为何要减少设计面积:
- 成本降低、功耗降低
- 直接决着FPGA的选型
一般综合过程中可以对面积进行优化,但在RTL编码中如果注意节约设计的面积,往往可以达到事半功倍的效果。
如何减少设计面积:
- 估计设计使用资源的数量
- 知道设计中哪些部分占用了较大的面积 (触发器、加法器、乘法器)
操作符
组合逻辑是改进的重点。
例1:
如果,必须使用复杂的运算符,则应考虑是否可以资源共享。尽管电路逻辑综合工具也会在综合的过程中采用资源共享的方法进行优化,但是,综合器的策略是有限的,因此,在编写RTL的时候,应该尽量考虑共享,而不是把这项工作完全留给综合工具。
例:
这样可以减少两个不必要的加法器,实际的设计中资源共享可能 不会像这样明显,因此,平时应该按照这样的思路多多练习。
多比特信号
除了操作符,多比特的信号往往会占用比较大的资源,应该给予重视。
- 应该看一看这个信号的所有比特是否都需要参与操作,如果不 是,则可以只对需要的部分比特进行操作
例:
在RTL编码中考虑功耗问题
主要措施:
- 门控时钟
- 增加使能信号,使得部分电路只有在需要工作时才工作;
- 对芯片各个模块进行控制,在需要工作时才工作;
- 除了有用信号和时钟的翻转会消耗功耗,组合逻辑产生的毛刺 也会大量消耗功耗。但是,毛刺在设计中无法避免,因此,只 有尽量减少毛刺在电路中的传播,才可以减少功耗。即,在设计中,尽量把产生毛刺的电路放在传播路径的最后。另外,可以使用一些减少毛刺的技术。
- 对于有限状态机,可以通过低功耗编码来减少电路的翻转
在RTL编码中考虑布线问题
在布线阶段,通常热点是一个影响布线质量的问题。
- 热点是指设计的功能需要在一个面积内占用大量的布线资源
- 热点产生原因:RTL编码时使用了特定的结构,如很大的 MUX
例:
- 这种结构产生的热点,在综合的时候,导致的延迟是看不出来的 ,只有到了 布线阶段才能给看到它的负面影响。因此,我们在RTL阶段应该重视这种电路,及早发现可能在布线阶段产生的问题。
- 如果设计的功能中确实需要采用大的mux,可以通过其他方式改变他的结构。其基本的思路是将一个大的mux分解为多级较小的mux。
RTL设计指导原则
根据这些目标的组合和优先级设置,可以派生出很多不同的设计原则。
指导原则: 面积与速度互换,乒乓操作,流水线设计
面积与速度互换
面积和速度两个要素始终贯穿RTL设计,是衡量设计质量的终极标准
1、面积
定义: 一个设计(FPGA/CPLD/ASIC)所消耗的目标器件的硬件资源数量或者ASIC芯片的面积。
- FGPA: 可以用所消耗的触发器(CFF)和查找表(CLUT)数量来衡量。
- ASIC:可以用设计的面积、门数衡量。
2、速度
定义:设计在芯片上稳定运行时所能够达到的最高频率,这个频率由设计的时序状况决定。
决定因素:时钟周期,PAD to PAD Time,Clock Setup Time,Clock Hold Time,Clock-to-Output Delay
- PAD: 硅片的管脚,是封装在芯片内部的
3、面积和速度的平衡与互换原则
设计面积最小和运行频率最高是对立统一的矛盾体
科学的设计目标
- 面积:在满足设计时序要求(包含对设计最高频率的要求)的前提下,占用最小的芯片面积
- 速度: 在所规定的面积下,使设计的时序余量更大,频率更高
- 要求:应该认识到它们是和产品的质量、成本直接相关的
- 若面积和速度产生冲突,应采取速度优先的原则——满足时序,工作频率
4、面积与速度互换
理论:
一个设计如果时序余量较大,所能跑的频率远远高于设计要求
- 能通过功能模块复用减少整个设计所消耗的芯片面积
- 用速度的优势对换面积的节约
一个设计的时序要求很高,普通方法达不到设计频率
- 可以通过将数据流串并转换
- 并行复制多个操作模块
- 对整个设计采取”乒乓操作”和”串并转换”的思想进行处理
- 在芯片输出模块处再对数据进行”并串转换”
从宏观上看,整个芯片满足了处理速度的要求,这相当于用面积复制换取速度的提高
操作技巧:
- 模块复用
- 乒乓操作
- 串并转换
模块复用&串并转换
本例是一个路由器设计实例。假设输入数据流的速率是450Mbit/s,而在FPGA上设计的数据处理模块的处理速度最大为150Mbit/s,由于处理模块的数据吞吐量满足不了要求,因此直接在FPGA上实现是一个“不可能完成的任务”。此处采取模块复用&串并转换。
整个数据吞吐量的保障,是依赖于三个子模块并行处理来完成的,也就是通过占用更多的芯片面积,来实现高速处理。
- step1: 输入数据进行串并转换,将450Mbit/s的输入数据流的速率转换为三个150的数据流。
- step2:将转换后的数据流交给三个子模块并行处理,每个子模块的吞吐量为150Mbit/s。
- step3:并串转换,输出450Mbit/s的数据流,满足预期数据传输速率。
乒乓操作
乒乓操作是一个常常应用于数据流控制的处理技巧
乒乓操作的最大特点是通过“输入数据选择单元”和“输出数据选择单元”按节拍、相互配合的切换,将经过缓冲的数据流没有停顿地送到“数据流运算处理模块”进行运算与处理。
优点:
- 把乒乓操作模块当做一个整体,站在这个模块的两端看数据,输入数据流和输出数据流都是连续不断的,没有任何停顿,因此非常适合对数据流进行流水线式处理。所以乒乓操作常常应用于流水线式算法,完成数据的无缝缓冲与处理。
- 可以节约缓冲区空间。(WCDMA基带的应用)
- 可以实现用低速模块处理高速数据流的效果。
流水线
流水线的参数设计中,系统时钟取决于最慢的流水线级的延时。
流水线的定义:通过插入寄存器的形式来提高电路运行频率的方法, 叫做流水线。
流水线的特点&好处
特点
- 通过插入寄存器,将长的串行逻辑链分成较小的部分。
- 当系统运算是串行的时候,利用时钟控制,使运算依照顺序接续进行。
- 在任何给定 时刻,大部分电路都在工作。
优点
- 每一部分延时较小=>可使用更快的时钟。
- 大部分电路同时进行运算=>可提高数据通过量。
流水线参数设计
系统时钟取决于最慢的流水级的延时
流水线分割点及级数的确定要考虑的因素
- 单元延迟时间及时钟频率的大小决定了数据通过速率
- 过多的级数不一定能产生最快的结果
- 太多寄存器的插入会导致芯片面积增加,布线困难,时钟偏差增加。
实例:
插入两级寄存器,电路的工作频率就取决于加法器、
求绝对值、求对数值三者的最大值,而且每个时刻三部分都在运行。