搜索
bottom↓
回复: 2

有关HDL程序时序优化问题,各位大牛都来讨论一下……

[复制链接]

出0入0汤圆

发表于 2011-12-1 09:40:42 | 显示全部楼层 |阅读模式
在写HDL代码时,在逻辑正常后,但在实际的芯片上并不能保证正常运行,近来使用verilog在塞灵思virtex II 上面写程序,200MHz工作时钟,仿真一切正常,但在实际的芯片上运行时就不能正常工作了,但将工作时钟降成100MHz时程序稳定运行。时序在前期仿真通过后利用时序分析仪的帮助也进行了一定的优化,实在不知再怎么优化了,大牛们指点一下……

以下是我优化时用的一些原则或办法吧,其中第一条后来验证效果不是很好:

1)逻辑条件判断“A==B”和“A!=B”全部换成“!(A^B)”和“A^B”



2)复杂的逻辑条件判断全部单独用一个时钟去判断,如:

if(A>1000 && A<=1000000 && B>1000 && B<=10000)

改为如下:

reg Flag;

Flag <= A>1000 && A<=1000000 && B>1000 && B<=10000;

if(Flag)

这种大小判断略微还好一些,对于减法等运算一定不能在if条件中直接计算,否则会导致很差的逻辑时序;



3)如果给IP核的数是经过较为复杂的运算得到的,尽量经过一级缓存后再传给IP核,如:

reg [31:0] Diff,Res_reg; reg [15:0] MeasureDiffCnt;

                        if(start_cal_d1)
                                begin Res_reg <= Res_reg + Diff; end
                        else if({LocMeasureDataRdy_d1,LocMeasureDataRdy_d2} == 2'b10)
                                begin Res_reg <= 0; MeasureDiffCnt <= 0;DividorCe <= 0; end
                        else
                                begin Res_reg <= Res_reg; end

MstDividor    MstDividor_inst(
      .clk(clk_200m),
      .ce(DividorCe),
      .dividend(Res_reg),

      .divisor(MeasureDiffCnt),
      .quotient(Quotient),
      .remainder(Remainder),
      .rfd()
      );

如上所示,即32bit位宽的Res_reg要经过累加运算后作为除法IP核的输入,当然这也许不算是十分复杂的计算,但对于速度较低和时钟工作较高的场合,也会对逻辑时序造成影响,因些改为如下运算:

reg [31:0] Res_in_div;
reg [15:0] DiffCnt_in_div;
always @ (posedge clk_200m)
        if(!rst)
                begin
                        Res_in_div <= 0;
                        DiffCnt_in_div <= 0;
                end
        else
                begin
                        Res_in_div <= Res_reg;
                        DiffCnt_in_div <= MeasureDiffCnt;
                end


MstDividor                                MstDividor_inst(
                                                .clk(clk_200m),
                                                .ce(DividorCe),
                                                //.dividend(Res_reg),
                                                .dividend(Res_in_div),
                                                //.divisor(MeasureDiffCnt),
                                                .divisor(DiffCnt_in_div),
                                                .quotient(Quotient),
                                                .remainder(Remainder),
                                                .rfd()
                                                );

如上所示,即将计算结果进行一级缓存后再给除法IP核,这样时序会好一些……

当然有些IP核会自带缓存,那就另当别论了

4)根据我自己亲自验证,将减法运算改为等效的加法运算并不能优化逻辑时序,如下所示:

以下变量均为32位reg型,即reg [31:0]

将以下运算:

                                        diff1 <= LocDataD2 - SlvDataD2;
                                        diff2 <= LocDataD2 - SlvDataD1;
                                        diff3 <= LocDataD1 - SlvDataD2;
修改为等效的以下运算:


                                        diff1 <= (LocDataD2 + 1) + (~SlvDataD2);
                                        diff2 <= (LocDataD2 + 1) + (~SlvDataD1);
                                        diff3 <= (LocDataD1 + 1) + (~SlvDataD2);
最后的仿真结果会更坏,因此不建议这么做。

5)位宽越多,做运算如加、减、比较大小等耗时越大,这个可以自己用数电里学到的知识将对应的电路画出来,看看要经过多少级逻辑延时才可以得到结果,因此能用较少的位数表示时就用较少的位数吧。

6)对于HDL代码,一般都需要有一个状态机程序,即会用一个case语句控制整个程序的的流程,举个例子来说吧:

假如需要五个状态来表示:

reg [2:0] State

case(State)

3'b000:

3'b001:

3'b010:

3'b011:

3'b100:

default:

endcase

这样的判断个人认为逻辑时序会比较差,因为基本闲置了最高位,只有最后一个状态才用到了最高位,我认为按如下方式写比较好:

reg [2:0] State

case(State)

3'b111:

3'b110:

3'b101:

3'b100:

3'b011:

default:

endcase

这个我没有太多的理论依据,同样可以画出实现电路图去论证一下,反正我在仿真的时候使用后者得到了较好的逻辑时序,大家可以试一下哦。

7)对于运算级数的优化,如:

A<= A1 + A2 + A3 + A3;

优化为:

A<= (A1 + A2) + (A3 +A4);

这个不是我自己试出来的,是从书上看到的,具体见《Xilinx FPGA 开发实用教程》(田耘,徐文波,清华大学出版社)第96页例3-7。书上说第一种写法有三个延迟,而第二个写法只有两个延迟。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-12-8 09:28:24 | 显示全部楼层
学习学习。。。。。
    来去试试。。。。

出0入0汤圆

发表于 2012-2-17 16:07:41 | 显示全部楼层
学习了。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表