在現今應用FPGA進行芯片電路設計的領域,已經使用HDL語言以及擁有強大功能的邏輯綜合工具來進行設計。同時,高速電路也越來越被普遍使用,這一趨勢使得芯片設計工程師把眼光越來越多的投向對后端布局布線的控制,因為對于高速設計,精細的后端控制是保障電路可靠運行的重要條件。在實踐中,精細的后端控制也越來越顯出它的重要性,同時要求設計者投入到這個方面的時間也越來越多。 問題的提出 實際的應用中,由于綜合工具的介入,由它所輸出的網表,有時候是非常難被設計者所理解的。這主要由三個方面的原因引起:1. 網表中除了在源程序中的寄存器能夠被明顯標志以外,其它的組合邏輯被映射(Map)到LUT中,但綜合工具并沒有提供一種很有效且有意義的方式進行對組合邏輯的命名,這使得設計者不容易找到組合邏輯的對應關系;2. 網表中元件(Component)之間的連接變得非常復雜;3. 由于綜合工具的運用,會“優化”掉一些它認為是“冗余”的邏輯或增加一些它認為是“必要”的邏輯。 上述因素直接影響到后端的布局布線控制。當然,設計者可以在約束文件(UCF)中使用用戶套(U_Set)、層次套(HU_Set)以及設置一個設計層次中元件相對的距離等措施來做一些后端控制。這樣的設置可以很好的控制寄存器的布局和布線,但并不能夠很好地完成對組合電路的布局布線控制。很明顯,對于高速設計,這樣的控制顯然是非常必要的。這使得我們要找到一種更好的方法來控制組合電路。 這個新方法應該滿足以下兩個條件。1. 對于高速設計,當通常控制方法難以達到要求的時候,這個新方法應該能夠完全控制模塊內部的布局布線;2. 用這個新方法建立的模塊在上層調用的時候所采用的仿真模型應該很容易建立,并且很容易保證它和建立模塊的功能上的一致性。滿足這兩個要求的方法就是建立宏模塊,更準確的說是建立硬件宏模塊,簡稱硬宏。 傳統的建立硬宏的方式是在Xilinx提供的FPGA Editor中直接在FPGA內部來建立目標電路,然后把它存為一個宏文件。然后,在上層進行調用。這種方法的弊端是顯而易見的。1. 要在這樣一個“艱苦”的環境下建立一個硬宏是一件非常麻煩的事情。設計者必須進入到Slice內部,來控制一個Slice內部的器件選擇和器件之間的連線,同時也正由于它非常的麻煩,導致了設計很容易出錯;2. 這樣設計出來的宏的功能驗證非常繁瑣;3. 要為這樣的宏建立仿真模型也很麻煩,一般的方法是人為的直接編寫一個行為仿真模型,然后在上層設計中調用這個仿真模型,然而要保證仿真模型和宏之間的一致性也是一件不太容易的事情。另外還有一種使用Xilinx的Foundation建立宏的方法,這個方法在進一步討論部分將會提到它的不足之處。 解決方法 鑒于以上的原因,現在采用另外一個新的流程(圖1)來設計并建立一個宏。 第一步,為了使設計者不必進入到Slice里面進行電路的設計,而有一個很好的設計環境,使用Aldec公司的Active-HDL來進行宏內部電路的輸入。在Active-HDL中,有一個庫管理(Library Manager)功能,在這個庫管理中,有很多子庫,每個子庫都有它不同的用途。在這些子庫中,Schematic子庫專門為Xilinx提供圖形輸入的。設計者調用這類庫的元件來建立宏的內部電路。 這一步需要注意:1.時鐘進入芯片的時候,應該通過BUFGP進入。通過BUFGP把時鐘引入全局時鐘網絡。BUFGP并不是一個物理上對應的元件,Xilinx只是為了方便設計者的調用,而把IBUFG和BUFG在表示上合成一個元件。但當用到DLL或其他時鐘連接方式的時候,應該把BUFGP拆開,單獨的使用IBUFG和BUFG;2.在各個PIN的位置,要加上相應電氣參數的IBUF或OBUF;3. 強烈建議對SLICE里面的元件進行詳細的了解;4.對于寄存器,寄存器和組合邏輯之間的連線,組合邏輯和組合邏輯之間的連線,都使用有意義的名字,以方便在下端工具中查看電路時,與上端電路圖的對應;5.在設計的時候應該把關鍵路徑記錄下來,在下端檢查的時候要防止出現組合電路競爭。 第二步,直接對這個電路進行功能仿真。Schematic庫中的元件可以直接支持基于門級的功能仿真。直接對這個電路圖仿真可以從一開始就保證宏的功能正確性。Active-HDL提供了一個非常友好的仿真界面。它可以把仿真波形進行存儲,而且,在以后的仿真中可以把第一次仿真所存儲的輸入向量波形當成激勵。這樣的做法大大地提高了效率,因為不用再為了一個小模塊而專門編寫它的測試基準(Test Bench)。 第三步,由Active-HDL直接輸出EDIF網表,在這個網表中記錄了宏的內部電路信息。Active-HDL可以把圖形轉換成三種語言形式的網表,VHDL、Verilog HDL和EDIF。而其他的上層輸入工具一般只能輸出兩種,VHDL和Verilog HDL,如Mentor Graphics的HDL Design Series。選擇Diagram菜單中的Set Target HDL選項來實現這一語言的切換。請注意,Set Target HDL選項只有在圖形輸入方式的時候才出現在Diagram菜單中。 第四步,把Active-HDL產生的這個EDIF網表直接交給Xilinx的后端工具進行處理。這樣,就繞開了綜合工具的干預,使得精細的下端控制成為可能。值得注意的是,由于繞開了綜合工具,很多綜合工具原來要做的工作就必須由設計者自己去做。這就是為什么第一步提到要添加相應電氣參數的IBUF和OBUF以及時鐘引腳要添加全局時鐘緩沖器(BUFG)的原因。如果在第一步中忘記了這一點,會直接導致后端的映射工具把設計中的電路全部清空,然后報告出錯。后端工具只需要進行三個步驟的處理就可以了,即翻譯、映射以及布局和布線,其他的處理都不需要。處理完后會生成一些關鍵的文件,分別是project_name.ngd、project_name.ncd和map.ncd。 第五步,把處理得到的project_name.ncd文件拿到FPGA Editor中進行宏的生成。注意在使用FPGA Editor打開這個文件的時候,應該選擇Read Write模式進入。進入之后,首先應該做的工作就是把設計中所有的IBUF和OBUF全部刪除。這可以在LIST窗口來進行。在刪除的同時,與這些IBUF和OBUF連接的連線也被同步刪除。這樣一來,就只剩下了功能部分。值得一提的是,在第四步中映射對電路進行處理的時候會完成把組合電路映射到LUT的功能。但由于在第一步中對組合電路和組合電路之間的連線使用了有意義的名稱命名,使得在這一步中要找到原始電路圖中的對應并不難。這一點是使用綜合工具流程所不能實現的。設計者通過名字的對應,就找到在第一步中記錄的關鍵路徑,通過使用Delay功能來顯示線路延遲,從而判斷電路是否可以工作。如果不行,使用FPGA Editor中的相應工具來進行路徑的重新布線,這個布線可以使用人工布線。在這一步中嚴禁進行邏輯修改,而只允許進行布線修改。具體怎么使用FPGA Editor可以參考FPGA Editor用戶指南。當完成了修改過后,把NCD文件另存為NMC文件,這樣就生成了需要的硬宏。 第六步,生成宏的邏輯仿真模型。再回到Active-HDL中,打開宏的電路圖,使用Set Target HDL的語言切換功能,把圖形轉成Verilog HDL網表或是VHDL網表。這個網表就可以作為宏的仿真模型。因為這個網表是由標準HDL形成,那么它可以在任何HDL仿真器中調用,如ModelSim和VCS等。 至此整個流程的介紹全部完成。 進一步的討論 關于流程的替代方案。事實上,整個流程似乎用Xilinx的Foundation也能完成。但是,有一個關鍵的步驟Foundation是不能完成的,那就是Foundation不能根據電路圖輸出基于Verilog HDL和VHDL的仿真模型,這樣直接影響了宏的仿真通用性。另外,Foundation自己提供的仿真環境又相當不完善。 關于仿真模型和宏的功能一致性。由于仿真模型和宏的網表都來自于一個電路圖,這樣從上層保證了兩者的一致性。另外,在第五步中,嚴禁進行邏輯修改,又進一步的保證兩者的功能一致性,排除第二次建模的可能,從而把人為的錯誤減到最低。 關于完全控制后端布局布線。在FPGA Editor中,設計者可以根據上下層名稱對應來確定關鍵路徑,從而進行完全人為的布局布線控制,這就是在第一步中使用有意義名稱的原因所在。 很明顯的一點,這個流程不應該作為一個大項目的主要開發流程,因為,這樣人力消耗太多,同時也失去了使用HDL語言和開發綜合工具的意義。比較合適的一種用法是把它使用在關鍵路徑模塊和常規控制不能達到預期要求的模塊上,因為它可以提供對后端的完全人為的控制,排除工具對設計的干擾。將基于HDL語言的設計方法與這種建立并使用硬宏的方法相結合,對基于FPGA的高速電路設計大有裨益。 |