硬件描述语言的最佳实践是什么(Verilog,VHDL等)

时间:2008-11-28 23:17:09

标签: verilog vhdl hdl

实施HDL代码时应遵循哪些最佳做法?

与更常见的软件开发领域相比,有哪些共性和差异?

6 个答案:

答案 0 :(得分:61)

答案 1 :(得分:47)

关于此主题的最佳书籍是Reuse Methodology Manual。它涵盖了VHDL和Verilog。

特别是一些在软件中没有完全匹配的问题:

  • 没有闩锁
  • 小心重置
  • 检查内部和外部时间
  • 仅使用可合成代码
  • 注册所有模块的输出
  • 小心阻止与非阻止分配
  • 注意组合逻辑的敏感列表(或在Verilog中使用@(*))

有些相同的内容包括

  • 使用CM
  • 有代码审核
  • 测试(模拟)您的代码
  • 适当时重复使用代码
  • 拥有最新的时间表
  • 有规范或用例或敏捷客户

答案 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)

这是需要JBDAVID的10条诫命进行硬件设计的问题。

  1. 使用版本/版本控制,就像在软件中一样。 SVN和Hg是免费的。
  2. 要求代码在签入前通过语法检查。 LINT工具更好。
  3. 使用全强度硬件验​​证语言进行设计验证。 System-Verilog几乎是一个安全的选择。
  4. 跟踪错误。 Bugzilla和GNATS是免费工具。 FogBugz需要一点$。
  5. 使用断言来捕获错误使用的问题。
  6. Coverage Triad实现了稳定的设计:在模拟和正式工具中测量代码覆盖率,功能覆盖率和断言覆盖率。
  7. Power is King:使用CPF或UPF来捕获,执行和验证您的Power-Intent。
  8. 真正的设计往往是混合信号,使用混合信号语言来验证模拟与数字。 Verilog-AMS就是这样一种解决方案。但不要过火。 Realnumber建模可以完成混合信号行为的大多数功能方面。
  9. 使用硬件加速来验证必须使用硅的软件!
  10. 语法识别HDL / HVL的文本编辑器是开发人员IDE的最低要求。

答案 5 :(得分:4)

对于FPGA,Xilinx有this page。几乎所有这些都适用于其他FPGA供应商,或者具有相同的规则。 ASIC设计非常适用。

英特尔推荐了HDL编码样式和设计建议(PDF)under this page