IC设计|插流水级的一个问题

最近我在思考一个问题,自己有一个初步的答案。写出来看看有没有高人可以指点。

我们都知道写完RTL code是需要做综合的,确定一下自己的代码会不会有timing不meet的问题。如果有的话,既不是multicycle又不是flase path,就说明组合逻辑太大了,需要做逻辑切割。把一段长的组合逻辑切割成两段或者多段更短的。

问题在于,我们切割的时候,是修改的RTL代码,RTL代码的coding能力跨度比较大的,既可以coding 行为,比如加减乘除,基本的case语句,if语句,for循环,也可以coding基本的门电路,比如说与或非等逻辑。

考虑下面的简单的逻辑(=表示左边是wire型,<=表示左边是reg型):

A = B & C & D & E & F & G;

我们可以切割成下面两段,中间加一级寄存器H和I,从而优化timing:

H <= B & C & D;
I <= E & F & G;
A= H & I;

上面的RTL代码是比较好切割的,因为在RTL代码,有一堆离散的变量和门电路,可以很好的分离切割。

考虑下面一个情况,你应该怎么切割:

reg [31:0]A;
reg [30:0]B;
reg [30:0]C;
A <= {1'b0,B}+{1'b0,C};

这段代码在RTL里面就一行,变量就两个。假如说当前时钟是600M,从B到A的path无法meet,你应该怎么做?

或者下面的情况,对5bit的A和10bit的B做一个无规律的映射:

reg [4:0] A;
reg [9:0] B;
case B:
0_0000_0001 :  A<= 11101;
0_0000_0010:   A <=11000;
............(无规律的代码)........
1_1111_1111: A <= 10010;
endcase

现在从B到A的path在600M的timing下不meet,你有什么办法切断这段组合逻辑,让其可以meet?

换而言之,当从RTL上看不到明显合适的切割点时,你怎么做逻辑切割?

我有一个思路是:将其统统用真值表进行卡诺图化简,得到最简单的与非门构成的表达式,然后再行切割。毕竟再复杂的组合逻辑,也可以写成输入构成的与非门表达式组合。

IC设计|插流水级的一个问题》有2条评论

  1. 以前学ic时候也思考过这个,结论也差不多这样。。。所以有时候也一直纠结Verilog写法要什么level比较合适,过于底层适合优化但是不适合人阅读理解,过于高级又会让人难以想到代码的电路实现。。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关