Verilog代碼和FPGA硬件的映射關係(一)

  代碼和硬件之間的映射關係是一個很奇妙的過程,也展現出人類的智慧。單片機內部的硬件結構都是固定的,無法改變,我們通過代碼操作着寄存器的讀寫,來執行各種複雜的任務。FPGA的硬件結構並不像單片機一樣是固定好的,而是由更加原始的基本邏輯單元構成,我們需要用HDL語言來描述我們要實現的功能,而並不需要關心硬件的結構是如何構建的,我們通過使用FPGA廠商的綜合器來將HDL所描述的功能代碼映射到我們的FPGA基本邏輯單元上,而這個映射的過程是綜合器幫我們自動完成的,我們並沒有直接用語言去操作這些基本邏輯單元,這也可以理解爲什麼HDL叫硬件描述語言,而不是硬件語言的原因。

  我們使用Verilog語言來描述功能,用Altera CycloneIV系列的EP4CE10F17C8芯片來驗證下面的例子,觀察我們編寫的Verilog代碼綜合後到底映射到了哪些硬件結構上。我們通過察看RTL Viewer、Technology Map Viewer(Post Mapping)\Chip Planner來得出驗證分析結果。

注:

RTL Viewer:寄存器級的視圖,可以看到寄存器和門電路,主要體現的是邏輯連接關係和模塊間的結構關係,和具體的FPGA器件無關;

Technology Map Viewer(Post Mapping):RTL所表達的結構進行優化,增加或減少一些模塊,更接近於最後底層硬件映射的結果,以便於映射到具體的FPGA器件上。

Chip Planner:只有進行佈局佈線後才能夠看到,在版圖的模型中真實的表達所使用的資源以及相對位置信息,還有模塊之間的路徑與連線關係都可以顯示出。

  我們的例子是給一個輸入信號,然後不進行任何邏輯運算直接輸出

 1 //--------------------------------------------------
 2 module  line(
 3   input  wire   in,
 4 
 5   output  wire  out
 6 );
 7 
 8 assign  out = in;
 9 
10 endmodule
11 //--------------------------------------------------

  代碼編寫完後點擊“Start Analysis & Synthesis”圖標進行分析和綜合。

RTL Viewer

  雙擊“Netlist Viewers”下的“RTL Viewer”查看RTL

  

  因爲代碼就是對RTL級層次的描述,所以RTL視圖只有一根連線,這和我們代碼設計思想的結果是完全

 

Technology Map Viewer(Post Mapping)

  雙擊“Netlist Viewers”下的Technology Map Viewer(Post Mapping)”。

 

  我們可以看到和RTL視圖不同的是輸入端口和輸出端口分別加上了buffer,這是我們代碼中並沒有的設計,是綜合器優化後自動加上的。

  

  雙擊上圖中藍色的buffer可以看到下圖中三角形的緩衝器。

    

Chip Planner

  點擊“Start Compilation”圖標進行全編譯,此過程會進行佈局不線。

  點擊“Chip Planner”圖標打開版圖模型,在“Flow Summary”報告中也可以看到全編譯後的信息後加詳細,其中只使用了兩個管腳資源。

  Chip Planner打開後的界面如圖所示,我們要找到代碼最後映射到版圖中的具體位置,我們可以在紅色框處的“Find what”處搜索定位,如果沒有找到“Find what”,按住鍵盤“Ctrl + F”就會自動出現。

 

  在圖中紅色區域中的“Find what”搜索RTL代碼中的信號名“in”,然後點擊“List”。

  繼續點擊“Go Next”。

  紅色區域中深藍色的小矩形塊就是輸入信號“in”所映射到版圖模型中的位置

   

  在選中“in”所映射的模塊的前提下點擊圖中左側“Generate Fan-Out Connections”圖標可以將從該位置扇出的連線顯示出來,一直點擊此扇出線會一致追蹤下去。 

 

  我們看到連線從“in”處開始,到”out“結束,並將”in“和”out“連到一起,這也就說明了代碼中的“in”和“out”之間確實是用一根導線連接的。圖中的①相當於我們外部的管腳輸入進來信號,經過內部連線,從管腳②輸出到外部。我們分別雙擊①和②打開模塊內部觀察其映射的結構。

  我們看到了一個完整的IOE內部結構,其中藍色顯示的是真實使用到的結構,灰色的是未使用到的結構。第一個圖是輸入的,第二個圖是輸出的。 

 

  我們根據信號的流向進行標號,①和⑦PAD,爲硅片的管腳,封裝在芯片內部,用戶看不到,PAD的輸入輸出往往和外部的Pin有一段連線。②和⑥分別是輸入緩衝器和輸出緩衝器,我們在Technology Map Viewer(Post Mapping)視圖中就已經看到過,這裏功能上是一樣的,只是具體的實現結構不同;③是一個輸入延時模塊,是用來調節輸入信號的相位延時(在靜態時序分析中會詳細講解其使用方法),右鍵點擊該模塊可以設置延時的時間,這是綜合佈局佈線工具自動給我們加的(當輸入信號綁定到時鐘管腳上時就不會自動連接到輸入延時模塊上),並不是我們在RTL代碼中設計的;④⑤⑧是和外部管腳以及其他層連接的接觸點,可以理解爲相當於是PCB中的過孔,⑧這裏用於連接到和外部信號輸入的管腳Pin上,④和⑤在內部通過導線連接到一起。

 

  上面的操作我們並沒有進行管腳的綁定約束,是開發工具自動給我們分配到一個任意位置的管腳,如果約束了具體的管腳,其在Chip Planner中映射的位置還會變化,但結構基本相同。

  綜合器在幫我們自動完成綜合和佈局佈線的過程中會根據我們的HDL代碼與實際的功能來做一些適當的優化,這些優化是爲了讓整個映射後的硬件更加適配具體的FPGA器件,所以有些時候我們用HDL描述的功能並不是我們所認爲的會使用到那部分基本邏輯單元,而是進行了優化後的結果,這些優化包括:面積的優化、速度的優化、功耗的優化、佈局不線的優化、時序的優化等。FPGA開發工具同樣也給用戶預留了一些可供用戶優化的選項設置,但這都要在用戶能夠熟練掌握開發工具和內部結構的前提下才能夠實現。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章