FPGA中改善時序性能的方法_advanced FPGA design

  本文內容摘自《advanced FPGA design》對應中文版是 《高級FPGA設計,結構,實現,和優化》第一章中的內容安全

  FPGA中改善時序,我相信也是你們最關心的話題之一,在這本書中列舉了一些方法供給你們參考。dom

1,插入寄存器(Add Register Layers),在中文版中被翻譯成:添加寄存器層次。即,在關鍵路徑中插入寄存器。工具

  這種方式會增長設計的時滯(clock latency)。插入了幾個寄存器,結果輸出就會延長几個週期,在不違反設計規格(對clock latency有要求)以及功能沒有影響的時滯狀況之下能夠這麼作。優化

 

2,並行結構。把串行改爲並行。最典型的就是乘法器了。spa

  做爲一個16bit的乘法器,最省資源的就是等待16個clock出結果,也能夠是設計成面積最大可是出來結果速度最快的,只須要一個週期就能夠出來結果。翻譯

 

3,邏輯展開(Flatten Logic Structures)。中文版一樣翻譯的很保守:展平邏輯結構。設計

  仔細看了看,以爲裏面應該包含了連個知識點。第一是邏輯複製,特別是針對大扇出(詳情在altera的官方視頻資料中有提到),一般使用generate或者是在綜合器中設定。第二個是消除代碼中的優先級。這裏須要多說一句:如今的工具很智能,就算你寫成if   else 有優先級的結構,有時候也能綜合出並行結構。若是並行也符合你的設計要求,爲了安全起見,最好仍是寫成case這種並行結構比較好。code

 

4,寄存器平衡 (Register Balancing)。視頻

  寄存器平衡就是在你的關鍵路徑中移動你的寄存器。第一就是你手動移動 ——  改代碼。第二就是設定綜合器讓它本身移動 —— 不到萬不得已不這麼幹,由於這麼多致使代碼移植性變差。blog

 

5,路徑重組

  這是最有意思的一個方法,也是體現你的設計水平的方式。結果書中給出的例子確實讓我驚訝了一下。爲啥呢,先貼出代碼

  初版:

 1 module randomlogic_1(
 2     output reg [7:0] Out,
 3     input [7:0] A, B, C,
 4     input clk,
 5     input Cond1, Cond2);
 6 always @(posedge clk)
 7     if(Cond1)
 8         Out <= A;
 9     else if(Cond2 && (C < 8))
10         Out <= B;
11     else
12         Out <= C;
13 endmodule            

 

第二版:

 1 module randomlogic_2(
 2     output reg [7:0] Out,
 3     input [7:0] A, B, C,
 4     input clk,
 5     input Cond1, Cond2);
 6 
 7 wire CondB = (Cond2 & !Cond1);
 8 
 9 always @(posedge clk)
10     if(CondB && (C < 8))
11         Out <= B;
12     else if(Cond1)
13         Out <= A;
14     else
15         Out <= C;
16 endmodule

  從代碼上來看2版好像還比初版路徑更長,由於 out <= B,的路徑從  Cond2 && (C < 8) 變成了 (Cond2 & !Cond1) && (C < 8)。彷佛還變長了,怎麼叫優化了呢?實際上,若是咱們不看下面的圖,本身模仿RTL Viewer,發現2版的關鍵路徑真的比1短。書中給出的圖示也是如此,這是初版的視圖,關鍵路徑經歷了4個器件

 

 

 

這是第二版的視圖,關鍵路徑竟然少了一個器件。

這就是我驚訝的地方,由於這種作法從代碼上看不出來。因此須要更高的硬件知識才能駕馭啊。

 

 

歡迎加入: FPGA廣東交流羣:162664354

      FPGA開發者聯盟: 485678884

相關文章
相關標籤/搜索