实施HDL代码时应遵循哪些最佳做法?
与更常见的软件开发领域相比,有哪些共性和差异?
答案 0 :(得分:61)
答案 1 :(得分:47)
关于此主题的最佳书籍是Reuse Methodology Manual。它涵盖了VHDL和Verilog。
特别是一些在软件中没有完全匹配的问题:
有些相同的内容包括
答案 2 :(得分:25)
HDL就像Verilog和VHDL似乎真的鼓励意大利面条代码。大多数模块由几个“始终”(Verilog)或“进程”(VHDL)块组成,可以按任何顺序排列。模块的整体算法或功能通常是完全模糊的。弄清楚代码是如何工作的(如果你没有编写代码)是一个痛苦的过程。
几年前,我遇到this paper,概述了一种更加结构化的VHDL设计方法。基本思想是每个模块只有2个过程块。一个用于组合代码,另一个用于同步(寄存器)。它非常适合生成可读和可维护的代码。
答案 3 :(得分:6)
在HDL中,代码的某些部分可以同时工作,例如两行代码“可以同时工作”,这是一个优点,明智地使用。 这是一个习惯于逐行语言的程序员最初可能很难掌握的东西:
应该特别注意启动过程 - 一旦你的芯片正常运行,你已经做了很大的工作。
在硬件上进行调试通常比调试软件困难得多:
首选简单代码,之后还有其他方法可以加速代码 它已经在运行,例如使用更高速的芯片等。
避免组件之间的“智能”协议。
HDL中的工作代码比其他软件更加珍贵,因为硬件很难调试,因此重用,并且还考虑使用模块的“库”,其中一些模块是免费的,而另一些则是出售的。
设计不仅要考虑HDL代码中的错误,还要考虑编程芯片上的故障,以及与芯片接口的其他硬件设备,因此应该考虑一个易于设计的设计校验。
一些调试提示:
如果设计包含多个构建块,则可能需要从这些块之间的接口创建线到芯片外部的测试点。
您需要在设计中保存足够的行,以转移要使用外部设备检查的有趣数据。您也可以使用这些行和您的代码来告诉您当前的执行状态 - 例如,如果您在某些地方收到数据 一点,你给行写了一些值,在执行的后期你写了另一个值,等等'
如果你的芯片是可重新配置的,这将变得更加方便,因为你可以定制特定的测试,并在你去的时候重新编程每个测试的输出(这与leds :)非常相似。 )
修改强>
通过智能协议,我的意思是,如果您的两个物理单元连接,它们应该与最简单的通信协议进行通信。也就是说,不要在它们之间使用任何复杂的自制协议。
原因是这个 - 由于您有模拟器,因此在FPGA / ASIC内部“填补”错误非常容易。 因此,如果您确定数据是按照您的需要进行的,并在程序发送时将其输出, 你已达到硬件乌托邦 - 能够在软件级别工作:)(使用模拟器)。 但是如果你的数据没有达到你想要它的方式,你必须找出原因......你必须连接到线路,这并不容易。
找到线路上的错误很难,因为你必须连接到具有特殊设备的线路,记录线路的状态,在不同的时间,你必须确保你的线路按照协议。
如果你需要连接两个物理单元,使“协议”尽可能简单,直到它不会被称为协议:) 例如,如果单元共享时钟,则在它们之间添加x数据线,并使一个单元写入那些单元并读取另一个单元,从而例如在每个时钟下降时传递一个“字”,在它们之间具有x位。 如果您有FPGA,如果原始时钟速率对于并行数据来说太快 - 您可以根据实验控制速度,例如使数据保持在至少't'时钟周期等线上。 我假设并行数据传输更简单,因为您可以以更低的时钟速率工作并获得相同的性能,而无需在一个单元上拆分您的单词,而在另一个单元上重新组装。 (希望每个单位收到的'时钟'之间没有延迟)。 即使这可能太复杂了:)
关于SPI,I2C等'我还没有实现任何一个, 我可以说我已经连接了两个从同一个时钟运行的FPGA的支路,(不记得中间电阻的确切形成),速率要高得多,所以我真的想不出一个很好的理由来使用这些,作为在您自己的FPGA之间传递数据的主要方式,除非FPGA位于彼此非常远的地方,这是使用串行总线而不是并行总线的一个原因。
某些FPGA公司使用JTAG来测试/编程他们的产品,但不确定它是否用作高速传输数据的方式,而且它是一种协议...(仍然可以有一些内置的芯片支持)。
如果您确实需要实施任何已知的协议,请考虑使用预先制作的HDL代码 - 可以找到或购买。
答案 4 :(得分:5)
答案 5 :(得分:4)
对于FPGA,Xilinx有this page。几乎所有这些都适用于其他FPGA供应商,或者具有相同的规则。 ASIC设计非常适用。
英特尔推荐了HDL编码样式和设计建议(PDF)under this page。