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

【博客導航】 【導航】FPGA相關html

背景

下邊的內容,適合初次使用Lattice的、具有FPGA開發經驗的同窗。後端

一、初次使用,還真遇到很多的坑,Lattice的工具也有很多優缺點,經過總結,但願能縮短熟悉的時間。ide

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

DDR3 IP例化

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

一、先在impl1目錄下,右鍵,新建sbx文件,即Clarity Designer,經過該文件,進行IP的例化管理。測試

二、打開sbx,在選項卡「Lattice IP Server」裏點擊IP聯網獲取IP列表。優化

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

四、打開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拍送數據。spa

注意:這裏涉及時序收斂上的編碼技巧。一般,用戶邏輯數據先存入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

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

一、位置約束,這個和具體硬件相關,對照硬件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 ;

二、時鐘約束,在【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 ;

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

四、不須要時序分析的路徑。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" ;

五、接口信號的上下拉設置,一般設置爲NONE,對按鍵、IIC則設置爲上拉PULLMODE=UP。

後端報告

後端跑完,關注的信息,包括:

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

 

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

後記

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

 

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

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

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

相關文章
相關標籤/搜索