【心得】Lattice後端使用經驗小結(ECP5UM,DDR3,Diamond3.10,Reveal邏輯分析)

NicoWei發表於2018-12-25

【部落格導航】 【導航】FPGA相關

背景

下邊的內容,適合初次使用Lattice的、具備FPGA開發經驗的同學。

1、初次使用,還真遇到不少的坑,Lattice的工具也有不少優缺點,通過總結,希望能縮短熟悉的時間。

2、具體問題,歡迎留言交流。

DDR3 IP例化

LEF5UM器件,應用DDR3控制器IP。主要分幾步:IP獲取,安裝,例化。

1、先在impl1目錄下,右鍵,新建sbx檔案,即Clarity Designer,通過該檔案,進行IP的例化管理。

2、開啟sbx,在選項卡“Lattice IP Server”裡點選IP聯網獲取IP列表。

3、選擇“DDR3 SDRAM Controller”,目前(18年12月)最新版本3.1,下載(格式exe)後安裝到指定目錄(如:C:\LatticeCore\ddr3_sdram_common_v3.1),這樣可以在選項卡“Lattice IP”中看到“ddr3 sdram controller 3.1”。

4、開啟ip,GUI介面如下,在本專案中,參考時鐘(RefClock)來自單板晶振產生的100M,ddr的工作頻率400M,雙沿也就800M。Memory Type選擇On-board Memroy,匯流排寬度16,配置x16,時鐘寬度1。Data_rdy to Write Data Delay選擇2,表示data_rdy有效之後必須在第2拍送資料。

注意:這裡涉及時序收斂上的編碼技巧。通常,使用者邏輯資料先存入fifo,再送給ddr3控制器,再加上控制器要求2拍給資料,這樣,fifo跟ddr3控制器之間時序就比較難收斂(如果很好收斂,那說明你在設計上已經關注到了這點),我的辦法很簡單,就是對fifo進行預讀操作,在讀使能送出之前,先預讀3拍出來,等ddr發出讀使能時,資料就不是從fifo到DDR3了,而是在這之間插入了幾拍的暫存器,從而緩解了時序壓力。

DDR3模擬

模擬指令碼我會單獨介紹,其實IP工程給出了模擬指令碼,借用過來修改修改就可以使用。這裡只提一個導致模擬只執行60多us就提前終止的小問題。

解決辦法,請仔細閱讀模擬工具的告警,工具明確說了,是Memory overflow,建議增加MEM_BITS引數或者定義MAX_MEM。綠色文字也給出了檔案路徑的指示,在ddr3_ddr3_x16.v中,include有引數檔案

ddr3_parameters.vh,就是同一目錄下,開啟vh檔案,搜尋MEM_BITS,預設為10,修改為16即可。

小結:遇到問題先不慌張,認真閱讀工具給出的提示資訊,通常會有解決思路。有同學說英文不好咋辦,那就複製貼上到網上的翻譯軟體唄,不然還能涼拌?

 

 

bit/mcs燒錄

Lattice工具一個不好用的地方,就是mcs燒錄得講究順序,否則會報錯。燒錄mcs的步驟: 

A、JTAG模式下,選擇Erase Only。

B、選擇SPI Flash,操作時可以不用verify,如下。

Reveal邏輯分析儀

FPGA廠家都會提供內嵌邏輯分析儀,Xilinx叫chipscope,Lattice的叫reveal,可以單獨安裝reveal程式,也可以在diamond工程中開啟。在“File List”的“Debug Files”裡,右鍵,點選Reveal Project Files,可新建*.rvl檔案,相對Xilinx,這個rvl比較好用,複製veriog程式碼訊號名,只要沒被優化,就可以很快找到。

新增訊號時,除了在trace signal setup裡選擇時鐘和觀察訊號之外,另外還需要在trigger signal裡設定,這點比Xilinx稍微麻煩點。 

trigger設定也有套路。第一步,在trigger unit中拉入訊號,可以在一個條件裡,也可以分開,operator可以不用管,到時抓波形時可以修改的。第二步,在trigger exprssion裡,直接把unit的name複製下來就好。

以上操作完畢,記得點選design rule check(下圖靠上的圖示),檢查是否有錯,然後點選insert debug,讓邏輯分析的時鐘自動新增到後端約束lpf檔案裡(在約束的首行)。

抓波形的其他技巧

  • 若要保留抓波形的相關檔案,需要複製*.bit,*.rvl和*.rvs檔案,同時,對*.rvs檔案內容的第一行進行修改,確保指向確定的檔案。
  • 出於測試目的,臨時新增的訊號,為防止被優化掉,可使用 reg signal_name/* synthesis syn_keep=1 */; 直接讓訊號保留,記住,完成綜合之後,要手工點選design fresh,這樣才能在rvl檔案中查詢到該新增的測試訊號。

後端約束lpf

不正確的約束,或者遺漏的約束,會導致跑的結果不符合預期。約束時,記得下邊幾個方面不要遺漏。

1、位置約束,這個和具體硬體相關,對照硬體PCB檔案找到相應管腳即可,並新增IO的電平屬性,也可通過ALLPORTS設定預設的電平。

1 LOCATE COMP "DDR_CLK_I" SITE "AD1" ;
2 IOBUF ALLPORTS IO_TYPE=LVCMOS33 ;
3 IOBUF PORT "CLK_27M_I" IO_TYPE=LVCMOS33 ;

2、時鐘約束,在【tool--netlist view】下邊,點net圖示,點開clock可看到整個專案裡的時鐘訊號,然後逐一確認時脈頻率並新增約束。

1 FREQUENCY NET "ddr_arbiter_inst/ddr_core_inst/U1_clocking/clk_in_c" 100.0    MHz PAR_ADJ 5.0 ;
2 FREQUENCY NET "user_clk" 200.0 MHz PAR_ADJ 40.0 ;
3 FREQUENCY NET "*/U1_clocking/clkop" 400.0 MHz PAR_ADJ 80.0 ;

3、DDR約束,直接參考IP例子ddr3_x16_eval.lpf抄過來就好(最多確認下那些訊號是否都有效),通常在下邊目錄:xxx\coregen_hwt_bit_v901_nocdr_noddr\ddr3_x16\ddr_p_eval\ddr3_x16\impl\lse

4、不需要時序分析的路徑。Xilinx的約束是TIG,Lattice就是BLOCK,免得後端工具把時間耗費在這些不需要時序分析的路徑上。

1 BLOCK PATH FROM CLKNET "clk_54m_pll" TO CLKNET "clk_148m5" ;
2 BLOCK NET    "video_rddr_scaler_inst/fifo_rst" ;

5、介面訊號的上下拉設定,通常設定為NONE,對按鍵、IIC則設定為上拉PULLMODE=UP。

後端報告

後端跑完,關注的資訊,包括:

  • 執行時間,決定了迭代的週期多久,方便評估驗證的效率。雖然報告沒給出時間耗費,但有起始時間(下圖synplify報告最前邊幾行)和最終產生bit的時間(看bit修改日期就知道),首尾做個減法就得到最終結果。

 

  • 時序報告,score不能太高,具體得分需要逐條分析,從而評估bit的質量,或者是否適當提高時序約束頻率,面積約束等策略。通過netlist的檢視,檢查時鐘路徑是否都覆蓋,避免每次跑出版本的功能不具備一致性。
  • 資源報告,評估後端風險,各個模組資源等

後記

先暫時列這些,想起了再補充。 

 

=======================

by NicoWei
2019-3-8 23:00:48

=======================

相關文章