> 文章列表 > 逻辑优化基础-shannon decomposition

逻辑优化基础-shannon decomposition

逻辑优化基础-shannon decomposition

1. 简介

在逻辑综合中,香农分解(Shannon decomposition)是一种常用的布尔函数分解方法。它将一个布尔函数分解为两个子函数的和,其中每个子函数包含一个布尔变量的取反和非取反的部分

具体来说,假设对于一个布尔函数 F(x1,x2,...,xn)F(x_1, x_2, ..., x_n)F(x1,x2,...,xn)

进行香农分解,首先选定进行分解的变量,假设为xkx_kxk,则该香农分解可以表示为:

F(x1,x2,...,xn)=xk∗Fk(x1,x2,...,xn,xk=1)+xk′∗Fk′(x1,x2,...,xn,xk=0)F(x_1, x_2, ..., x_n) = \\\\ x_k * F_k(x_1, x_2, ..., x_n, x_k=1) + x'_k * F_k'(x_1, x_2, ..., x_n, x_k=0) F(x1,x2,...,xn)=xkFk(x1,x2,...,xn,xk=1)+xkFk(x1,x2,...,xn,xk=0)
其中,xkx_kxk 是函数 FFF 的一个输入变量,xk′x'_kxkxkx_kxk 的取反,FkF_kFk 是当 xk=1x_k=1xk=1FFF 的取值为真时的部分函数,Fk′F_k'Fk 是当 xk=0x_k=0xk=0FFF 的取值为真时的部分函数。

这个分解的意义在于,它将一个布尔函数 FFF 分解成了两个子函数 FkF_kFkFk′F_k'Fk,这两个子函数相互独立,因为它们只与 FFF 的一个输入变量 xkx_kxk 有关。这种分解可以用于减少门电路的复杂度,从而实现更快的逻辑运算和更小的电路面积,如何拿到更小的面积,后续了解到了再补充,本文主要是得到更快的速度。

香农分解的基本思想可以进一步扩展到多个输入变量的情况,即将一个布尔函数 F(x1,x2,...,xn)F(x_1, x_2, ..., x_n)F(x1,x2,...,xn) 分解成两个子函数 F0 和 F1,其中 F0 和 F1 分别只与 x1x_1x1 取 0 和 1 时的输入变量 x2,x3,...,xnx_2, x_3, ..., x_nx2,x3,...,xn 有关。这种扩展的香农分解方法被称为递归香农分解(Recursive Shannon Decomposition),在实际的逻辑综合和电路设计中得到了广泛的应用。

2. 示例

假设有一个函数:
F=(a,b,c,x)F = (a, b, c, x) F=(a,b,c,x)
以变量 xxx 进行分解,则可以得到以下表达式:
F=x.(a,b,c,1)+x′.F(a,b,c,0)F = x.(a, b, c, 1) + x′.F(a, b, c, 0) F=x.(a,b,c,1)+x′.F(a,b,c,0)
如果用电路图来表示以上分解的话,如下所示:

逻辑优化基础-shannon decomposition

更近一步,常数的信号通常可以被优化掉,变成以下的结构:

逻辑优化基础-shannon decomposition

我们可以看到,经过香农分解后,信号 xxx 距离输出 outputoutputoutput 最近,xxx 所在的路径是整个 logic cone 中最快的一条。

所以说如果在电路 output required time 确定的情况下,某一个信号的 arrival time 非常的晚,可以把这个信号向靠近output的方向 push,从而降低电路的延迟。

这种做法的缺点也是显而易见的,至少在这个例子中,面积几乎一直出于增长的状态。

按照上面简介部分介绍的递归香农分解继续执行的话,可以得到如下电路:

逻辑优化基础-shannon decomposition

2.1 个人理解

做timing优化的时候主要是将那些 arrival time 比较慢的信号尽可能的往 output 推,所以也就是说要基于这些 arrival time慢的信号进行香农分解。

3. 特殊案例(pipeline loop)

香农分解是优化电路中 looplooploop 的一种有效技术。当你对 looplooploop 中的逻辑执行香农分解时,looplooploop 中的逻辑会移动到 looplooploop 外部。从而可以对移动到循环外部的逻辑进行 pipelinepipelinepipeline 处理。

假设有以下一个 looplooploop 电路,因为是在一个 looplooploop 里面,所以这一部分信号不能进行 pipelinepipelinepipeline

逻辑优化基础-shannon decomposition

该电路有一个单独的 registerregisterregister 和一个额外的输出,我们可以通过执行香农分解将这个 looplooploop 的逻辑移动到外部以进行 pipelinepipelinepipeline,具体的做法如下:

我们知道 registerregisterregister outputoutputoutput的值只能为 0 或者 1,所以我们可以将驱动 registerregisterregister 的逻辑复制(duplicate)一份,一份 registerregisterregister 的输入为 000, 一份为 111,即对于这个outputoutputoutput 进行香农分解,即可得到以下的电路:

逻辑优化基础-shannon decomposition