吴明

FPGA 何去何从(四)

1
阅读(871) 评论(5)

“聪明的数据结构配上愚蠢的代码,远比反过来要好得多”---《大教堂与集市》

“让我看你的流程图但不让我看表,我会仍然搞不明白。给我看你的表,一般我就不再需要你的流程图了,表能让人一目了然。”---《人月神话》

端口port 就是VHDL verilog 和sv重要的数据结构或表,设计前约定端口有什么信号怎么交互是十分重要的,特别是由不同人员完成不同功能时,这个可比其他编程语言复杂多啦。如果设计中不能有效沟通,少了或多了某个信号,又或者某个信号描述不当,都会造成设计问题。再者程序代码是需要优化的,下一版本为了兼容必须有一样的端口,至少是以前端口的超集,这个问题也会制约设计优化,当然了,一开始就设计好端口不就行了吗?

在我看来那是不可能的

“事情只有重复做一遍之后,才能真正了解”---《人月神话》

设计是不断进步的,未来的能力也一定比现在的强,除非你觉得你已经是完人一个,以后写的已经不能再提高了,也应了那句话“不要把程序写死”,而当前的verilog VHDL开发模式就是已经把端口写死了!不管verilog写得多么漂亮,代码对得多么整齐,注释写得多么详细,都无法改变port定义的杂乱。可以回想自己写过的UART和SPI,端口都定义了什么信号,是否可以直接连接。其实这也引申出一个问题,一个模块是否需要定制的端口信号(UART的RX,TX,SPI的 CS SCK MOSI MISO是固定的专有信号,并不包括),我经过半年的摸索得出的答案是否定的,更激进的想法是,模块就应该抛弃传统的自定义端口信号,全部使用通用接口比如axi avalon。如果UART和SPI都使用axi来设计完全就可以实现互联。

UART UART_inst (

    .tx         (tx        ),

    .rx         (rx        ),

    .rx_axis (rx_axi_stream_inf ),    //interface 

    .tx_axis (tx_axi_stream_inf )    //interface 

);


SPI SPI_inst (

    .csn     (csn                       ),

    .sck     (sck                       ),

    .mosi  (mosi                     ),

    .miso  (miso                     ),

    .rx_axis (tx_axi_stream_inf ),    //interface 

    .tx_axis (tx_axi_stream_inf )    //interface 

);

这不过是个开始,如果全部的模块全部使用axi4来设计,那么FPGA开发就像搭积木一样,可以任意拼接,轻轻松松就能突破1W 的限制(我最近独立开发的项目除去IP资源,已经达到6K LUT,但是我只是觉得设计工作才刚刚开始,突破6W LUT不成问题)。这就是sv interface 带来的巨大优势。

通用的说法是,编程语言没有高低,图灵完备的不同语言是可以相互替代的。这只是理论情况,现实是残酷的,对于计算机来说语言是没有什么区别,用java C++ python开发,都能相互替换,但是对于人类大脑来说语言是有高低之分的,语言的特性 特点,决定了大脑的思维方式。不然就不会有 Ruby Go这些语言被创造出来,既然java ,C都能做出了,为什么要创造出Ruby,Go呢?sv就是这样的存在,sv虽然是verilog的超集,但是显然设计模式已经不一样了。

下面来说说sv这么做设计,上面说过FPGA设计就想搭积木,只要我有足够多的不同类型的积木我就可以搭建任意的系统。这个有点像人类的语言,句子不过是有主 谓 宾 ,只要知道足够多的词汇,就能任意的表达句子。那个sv interface 系统需要多少的类型积木呢?以 axi4为例

1、master类型,包括axi master,axi lite master,axi stream master,一个microblaze就是典型的axi master(还有其他的非CPU axi master),一个视频流输入就是 axi stream master

2、slaver类型,包括axi slaver,axi lite slaver,axi stream slaver,xilinx IP配置大都是axi lite slaver

3、interconnect,多口到单口的,单口到多口的,多口到多口的,包括stream interconnect,lite interconnect,axi interconnect,interconnect是interface设计的核心,有了interconnect设计就可以分割设计而不用考虑相互影响,A设计I2C到SPI的系统,不需要考虑B设计的UART到SPI的系统(SPI为共享的)。仿真时也可以完全独立仿真A设计的master模块,完全不需要等待B设计slaver模块才能进行验证,只需要各自的模块满足axi标准控制时序。大大减少设计交互和减少设计设计,而且可靠性还可以很大的提高。xilinx的interconnect一直是闭源的,stream interface也不是很好用,也没有多口到单口的 lite ,到目前为止我已经实现了axi stream interconnect ,lite interconnect,axi interconnect一直没用的,也就没有写。

4、FIFO,直接输出FIFO,可以自己设计,也可以用IP。

学习外语需要积累词汇,interface设计也是,虽然前期很困难,要写很多模块,一个一个积累模块,慢慢的就有足够多的积木搭建各式各样的系统,积累得越多以后的设计也快越简单。即使以后模块需要升级优化,也是十分方便的,不会出现牵一发动全身,这就是一个演化的过程。

当然随着模块越积越多,传统的组织模块方式必然落后(sv对verilog比没有变化),这时就需要第二级的设计,现在我也没摸清思路,也只是觉得sv可能只是一种过渡阶段


  1. 每次都想设计一个很好的接口,每次都发现最终各个模块随着资源啊,新加的功能的什么的,弄得不忍直视

  2. 不错,不错,不错

  3. 太棒了,舅服你

     

  4. 学习了,,

  5. 不错,不错,不错