【心得】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

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

相关文章
相关标签/搜索