目录
组合逻辑电路设计描述及优化
8.1、组合逻辑电路的描述方法
8.2、组合逻辑电路描述的常见问题
(1)敏感表不全
(2)组合逻辑描述中引入锁存器
(3)产生组合电路反馈
(4)无意识产生的线或逻辑
8.3、常见的组合逻辑电路描述
(1)Multiplexers
(2)Encoder / priority encoder / Decoder
(3)Comparator
(4)ALU / Logic / arithmetic operations
8.4、组合逻辑电路的优化
(1)模块复用和资源共享
(2)逻辑复制
(3)香农扩展运算
(4)流水线时序优化技术
组合逻辑电路的特点:任何时刻的输出仅与该时刻电路的输入有关,电路中不含反馈、记忆单元,仅仅通过若干门电路按照不同方式连接起来实现所需的逻辑功能。
组合逻辑框图 |
在Verilog的RTL级描述中常使用下面几种方式进行组合逻辑描述:
在多数情况下,assign和always这两种组合逻辑描述方法可互换,但也有不同:
使用always描述组合逻辑时要遵守以下规则:
因此,描述简单的组合逻辑选择assign。
描述组合逻辑的always块的信号敏感表不完整:可能会使综合前仿真时无法触发未列出的敏感信号相关的仿真过程,使得综合前后的仿真结果不一致。
e.g.:input a,b;
reg c;
always@(a)
c=a | | b;
避免办法:①always@(a or b)或者always@(*) ②观察综合工具警告、报错信息
组合逻辑描述中使用了一个reg,则:如果reg值随相关语句块的任何一个输入的变化而变化,则在综合时不会产生硬件寄存器;如果reg值不总是随相关语句块的输入变化而变化,则综合时会产生一个锁存器latch。
Latch是一种由电平触发的存储单元,是时序逻辑电路,主要用来保持或存储一段时间不改变的数据。
引入了latch的组合逻辑描述情况:
①在条件(if)语句不完整,且信号在条件语句前未赋初值;
②分支语句(case,casex等)中,分支语句不完整或分支语句中对信号赋值说明不完整,且信号在分支语句前没有初始赋值。
组合反馈环路是一种高风险的设计:①组合反馈环路的逻辑功能完全依赖于其反馈环路上组合逻辑的门延迟和布线延时等,如果这些延时有任何变化,其整体逻辑功能将改变;②组合反馈电路是数字同步逻辑设计的大忌,最容易因振荡、毛刺、时序违规等问题引起整个系统的不稳定和不可靠;③会造成后端精确静态时延分析难以实现。
避免组合电路反馈:任何反馈都应包含时序逻辑的寄存器;②检查综合工具报告的warning信息,发现有combinational loops后立即进行相应修改。
设计原则:每个变量只能在一个过程块中或一条assign语句中被赋值;否则定义的线或逻辑不能被综合(工具会报出警告,告知某变量被多个block驱动,因为大多数CMOS逻辑库不允许出现线或逻辑)。
(5)HDl描述所对应的硬件结构不合理
同样实现代价,性能较高,或同样的性能,较低的硬件代价。E.g.:
Y1 = A1+B1+C1 +D1;
Y2 = (A2+B2)+(C2 +D2);
实现的两种不同的电路效果 |
|
多路选择器是一个多输入、单输出的组合逻辑电路。它根据选择信号译码,从多个输入数据流中选取一个,送至到输出端。
Multiplexers的典型Verilog描述语句:①assign语句及条件操作符;②always结构:if…else及其嵌套语句;case多分分支语句。
关于多路选择器,个人体会:①二选一开关使用assign或if…else;②三/四选择开关可使用if…else、case/casez结构描述;③多选一开关建议使用case/casez结构描述;不使用if…else,因为if…else及其嵌套结构复杂、且易出错;而且在基于周期的仿真器中,case语句结构的仿真速度要比if…else语句块;④多选一超过8输入时,尽量拆分成多个小选择开关。
编码/译码电路,是将一组形式的二进制数据转化为另一种形式的二进制数据:编码器常用于将多位输入数据流编码成更短的码流,使得编码器的输出端口减少;译码器将先前编码过的数据解码,是编码器的逆过程,N位的输入最多可译码出2的n次方中编码的信息。
描述编码/译码电路的语句:assign、always结构(if…else及其嵌套结构、case/casex/casez描述结构、for循环结构)
个人体会:对于可综合的设计描述,一般情况下,使用case语句可读性好,不易出错,比使用if条件语句的编码风格好。使用for循环结构的行为级母爱书常应用于模拟验证(for循环结构的综合是通过展开循环来实现的,使用不当有可能造成编译时间很长,综合结果差,因此要慎用)。
比较操作一般作为某些操作的选择天剑,分算术比较和逻辑比较两大类。两个数值对象可使用算术比较操作符进行比较,两类操作符见下表:
操作 |
Verilog操作符 |
算术比较 |
== != < <= > >= |
逻辑比较 |
! && || |
注意:
①两个以上的比较对象不能用一个条件比较表达式,而要用到逻辑操作符;
②比较器具有1位的逻辑值,常用于各类表达式和条件表达式中:连续赋值assign的赋值表达式 assign flag=(a>=b);条件语句if…else的条件表达式;
③比较器的逻辑级数:对于算术比较器,随着比较位数的增加,其Verilog代码综合后的硬件开销会越来越大。E.g.两个N位二进制数的比较操作:
== (!=) 操作,逻辑级数为:é logmN ù+1 ;
>(>=)、<(<=) 操作,逻辑级数为:2×é logmN ù
AlU是CPU的核心功能部分,负责操作数的算术和逻辑运算。
要求:①将算术运算、逻辑运算、移位操作分开;②利用case、casex、casez描述形式描述ALU的相关操作;③严格控制各个分支的操作条件、避免任意扩大条件范围。最好做到操作条件的最小化,且能充分描述不同的行为。
从功能模块编码这个微观角度考虑节约面积,减少硬件实现代价。多个童磊功能单元在互斥条件下分时复用一个硬件电路单元。特点是节约了面积,减少了功耗,但有时可能会损失一些性能。
e.g.补码平方器 |
|
通过增加面积而改善时序条件的优化手段(空间换时间);一个最常见的场合是调整信号的扇出:以逻辑复制改善扇出,优化路径延时。
如果某逻辑的数据通路中存在关键路径,可采取完整的逻辑复制的方法优化时序(将该路径完整复制一份,选择器放在最后)。
香农扩展也是一种复制逻辑,以面积换取性能的时序优化手段,其扩展运算公式为:Fa,b,c=aF1,b,c+aF(0,b,c)
香农扩展通过逻辑复制、增加MUX(多路选择器)来缩短某个优先级高但组合路径长的信号的路径延时(信号a),从而提高该关键路径的工作频率,以增加面积换取电路时序性能的优化。
在实际的电路设计中,流水站内的功能都是组合逻辑完成的:有些信号的路径比较长(信号本身来得比较晚),从而造成时序电路的建立时间不够,直接降低了电路的工作频率,这种信号路径被称为关键路径。
关键路径信号一般要提取出来,以构造优化的描述,降低其延时;设计时如果知道存在的关键路径信号,则使该信号离输出更近一些,可以降低基于该信号的关键路径延时。
把规模较大,层次较多的组合逻辑分为几个级,在每一级插入寄存器组并暂存中间数据,上一级的输出是下一级的输入,即用寄存器合理分隔较长的组合逻辑路径。(当使用其他优化方法无法达到系统对工作频率的要求时,往往会采用流水线时序优化技术。)
各级之中最长的组合路径时间延迟决定系统的时钟频率。
流水线优化技术可以改善电路性能(缩短关键路径延时)提高主频,提高吞吐率,但是由于寄存器的延迟,增大了电路操作的首次延迟,也会增大一定的面积。
e.g.16位加法器划分为两级8位加法器 |
|