流水线编程方式分析
0赞下面为两个流水线与非流水线编写的两个例子:
非流水线代码如下:
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能够更好的满足时序,并可以提高系统的设计频率。