天天看點

【原創】流水線處理對比執行個體

一、引言

本文以8輸入與門為例,展示在 Vivado 下對 純8輸入與門的組合邏輯鍊 和 兩級流水線處理後的8輸入與門 的靜态時序分析(STA)報告,來直覺地展現流水線技術在數字設計中的重要性。

二、純8輸入與門組合邏輯鍊

Verilog代碼如下:

`timescale 1ns / 1ns

module test (
	input 	clk  ,    		// Clock
	input 	rst_n,  		// Asynchronous reset active low

	input	a	 ,
	input	b	 ,
	input	c	 ,
	input	d	 ,
	input	e	 ,
	input	f	 ,
	input	g	 ,
	input	h	 ,

	output reg out  
);

reg  a_ff;
reg  b_ff;
reg  c_ff;
reg  d_ff;
reg  e_ff;
reg  f_ff;
reg  g_ff;
reg  h_ff;


// 源寄存器
[email protected](posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        a_ff <= 1'b0;
        b_ff <= 1'b0;
        c_ff <= 1'b0;
        d_ff <= 1'b0;
        e_ff <= 1'b0;
        f_ff <= 1'b0;
        g_ff <= 1'b0;
        h_ff <= 1'b0;
    end
    else begin
    	a_ff <= a;
        b_ff <= b;
        c_ff <= c;
        d_ff <= d;
        e_ff <= e;
        f_ff <= f;
        g_ff <= g;
        h_ff <= h;
    end
end


// 目的寄存器
[email protected](posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        out <= 1'b0;
    end
    else begin
    	out <= ( (a_ff&b_ff) & (c_ff&d_ff) ) & ( (e_ff&f_ff) & (g_ff&h_ff) );
    end
end



endmodule
           

代碼綜合後的 RTL 圖如下所示。

可見标藍框的兩個方框就是由兩級 LUT 構成的8輸入與門、左半面八個 ff_reg 是資料通路的源寄存器、右面一個 out_reg 是目的寄存器。

【原創】流水線處理對比執行個體

在 .xdc 檔案中對電路進行位置限制和時序限制 ,其中時序限制僅需要進行主時鐘限制,主時鐘限制的 Tcl 指令如下。經過測試,選用 2GHz 的工作頻率對電路進行靜态時序分析。

create_clock -period 0.500 -name clk -waveform {0.000 0.250} [get_ports clk]
           

時序報告如下所示。可以發現在2GHz工作頻率下,在一些關鍵路徑的苛刻條件模型下仍是存在了 setup 時序違例。

【原創】流水線處理對比執行個體

由下圖可見 ,Vivado 對目的時鐘路徑做了走線延遲加大的處理來試圖增加 setup slack ,但在 2GHz 的高頻率下也無能為力。

【原創】流水線處理對比執行個體

三、兩級流水線處理

流水線技術就是打斷長組合邏輯鍊,在組合邏輯鍊中插入寄存器緩存中間資料,以減小觸發器間的組合鍊延遲,可以有效解決 setup 時序違例的問題。

本文在每個與門後插入一個觸發器,即使用兩級流水線對8輸入與門進行處理。

Verilog代碼如下:

`timescale 1ns/1ns

module pipeline (
	input 	clk  ,    		// Clock
	input 	rst_n,  		// Asynchronous reset active low

	input	a	 ,
	input	b	 ,
	input	c	 ,
	input	d	 ,
	input	e	 ,
	input	f	 ,
	input	g	 ,
	input	h	 ,

	output reg out  
);


reg		ff_ab;
reg		ff_cd;
reg		ff_ef;
reg		ff_gh;

reg		ff_u ;
reg		ff_d ;



// 第一級流水線
always @(posedge clk or negedge rst_n) begin
	if ( rst_n == 1'b0 ) begin
		ff_ab	<=	1'b0;
		ff_cd	<=	1'b0;
		ff_ef	<=	1'b0;
		ff_gh	<=	1'b0;
	end
	else begin
		ff_ab	<=	a & b;
		ff_cd	<=	c & d;
		ff_ef	<=	e & f;
		ff_gh	<=	g & h;
	end
end


// 第二級流水線
always @(posedge clk or negedge rst_n) begin
	if ( rst_n == 1'b0 ) begin
		ff_u	<=	1'b0;
		ff_d	<=	1'b0;
		out 	<=  1'b0;
	end
	else begin
		ff_u	<=	ff_ab & ff_cd;
		ff_d	<=	ff_ef & ff_gh;
		out 	<=  ff_u & ff_d;
	end
end



endmodule
           

代碼綜合後的 RTL 圖如下所示。

可見,原來觸發器間的兩級 LUT 被拆分成一級 LUT ,觸發器間的組合鍊縮短了。

【原創】流水線處理對比執行個體

 時序報告如下所示。在相同工作頻率下已經沒有 setup 違例的現象了,說明最大工作頻率得到了提高。這也就表明了流水線技術從提高電路最大工作頻率的方向上來提高電路的吞吐率。

【原創】流水線處理對比執行個體

四、功能驗證

使用 Modelsim 驗證兩級流水線8輸入與門的邏輯功能。

仿真結果如下圖所示,可見8個輸入全部置位後經過兩個時鐘周期的延時後輸出了正确的結果,并且之後的邏輯結果不需要再等待兩個時鐘的延遲。

【原創】流水線處理對比執行個體

繼續閱讀