一、引言
本文以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個輸入全部置位後經過兩個時鐘周期的延時後輸出了正确的結果,并且之後的邏輯結果不需要再等待兩個時鐘的延遲。