waljj

流水线编程方式分析

0
阅读(2162)

下面为两个流水线与非流水线编写的两个例子:

非流水线代码如下:

module test (clk, clr, a, b, c, d, result);

input clk, clr;

input [7:0] a, b, c, d;

output reg [31:0] result;

reg [7:0] atemp, btemp, ctemp, dtemp;

always @(posedge clk or negedge clr) begin

     if (!clr) begin

          atemp <= 0;

          btemp <= 0;

          ctemp <= 0;

          dtemp <= 0;

          result <= 0;

      end else begin

          atemp <= a;

          btemp <= b;

          ctemp <= c;

           dtemp <= d;

           result <= (atemp * btemp) *(ctemp *dtemp);

       end

end

endmodule

 

其RTL图如下:

流水线代码如下:

module test (clk, clr, a, b, c, d, result);

input clk, clr;

input [7:0] a, b, c, d;

output reg [31:0] result;

reg [7:0] atemp, btemp, ctemp, dtemp;

reg [15:0] int1, int2;

always @(posedge clk or negedge clr) begin

    if (!clr) begin

        atemp <= 0;

        btemp <= 0;

        ctemp <= 0;

        dtemp <= 0;

        int1 <= 0;

        int2 <= 0;

         result <= 0;

      end else begin

         atemp <= a;

         btemp <= b;

         ctemp <= c;

          dtemp <= d;

          int1 <= atemp * btemp;

          int2 <= ctemp * dtemp;

          result <= int1*int2;

     end

end

endmodule

其RTL图如下:

分析上面的verilog语句和RLT图可以看出:

  Pipeline 比non_pipeline 使用的资源更多,且输出数据比non_pipeline滞后了一个时钟周期。

  但是register_to_register 时间明显减小了,直观上看,比non_pipeline减小了一个乘法逻辑。

  可见在资源足够的条件下,使用pipeline能够更好的满足时序,并可以提高系统的设计频率。