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

硬件描述语言(Verilog、VHDL等)的最佳实践是什么,verilog,vhdl,hdl,Verilog,Vhdl,Hdl,在实现HDL代码时应遵循哪些最佳实践 与更常见的软件开发领域相比,有哪些共同点和不同点?这方面的最佳书籍是。它涵盖了VHDL和Verilog 特别是一些在软件中没有精确匹配的问题: 没有门闩 小心复位 检查内部和外部计时 仅使用可合成代码 注册所有模块的输出 注意阻塞与非阻塞分配 小心组合逻辑的敏感列表(或在Verilog中使用@(*) 一些相同的包括 使用CM 进行代码审查 测试(模拟)你的代码 在适当的时候重用代码 有最新的时间表 拥有规范、用例或敏捷客户 像Verilog和VHDL这

在实现HDL代码时应遵循哪些最佳实践


与更常见的软件开发领域相比,有哪些共同点和不同点?

这方面的最佳书籍是。它涵盖了VHDL和Verilog

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

  • 没有门闩
  • 小心复位
  • 检查内部和外部计时
  • 仅使用可合成代码
  • 注册所有模块的输出
  • 注意阻塞与非阻塞分配
  • 小心组合逻辑的敏感列表(或在Verilog中使用@(*)
一些相同的包括

  • 使用CM
  • 进行代码审查
  • 测试(模拟)你的代码
  • 在适当的时候重用代码
  • 有最新的时间表
  • 拥有规范、用例或敏捷客户

像Verilog和VHDL这样的HDL似乎真的鼓励使用意大利面代码。大多数模块由几个“始终”(Verilog)或“进程”(VHDL)块组成,它们可以是任意顺序。模块的整体算法或功能通常完全模糊。弄清楚代码是如何工作的(如果你没有写的话)是一个痛苦的过程

几年前,我偶然发现了一种更结构化的VHDL设计方法。基本思想是每个模块只有2个进程块。一个用于组合代码,另一个用于同步(寄存器)。它非常适合生成可读和可维护的代码

  • 在HDL中,代码的某些部分可以同时工作,例如两行代码“可以同时工作”,这是一个优势,要明智地使用。 这是一个习惯于逐行语言的程序员一开始可能很难掌握的东西:

    • 可以根据您的需要创建长而具体的管道
    • 您可以让您的大模块同时工作
    • 您可以创建多个单元,并并行执行工作,而不是使用一个单元对不同的数据执行重复操作
  • 应该特别注意引导过程——一旦你的芯片功能正常,你就已经取得了巨大的进步

硬件调试通常比软件调试困难得多,因此:

  • 简单的代码是首选,有时还有其他方法来加速您的代码 它已经在运行,例如使用更高速度的芯片等

  • 避免组件之间的“智能”协议

  • HDL中的工作代码比其他软件更宝贵,因为硬件是很难调试的,因此重用,也考虑使用一些免费的和其他的模块的“库”。

  • >P>设计不仅要考虑HDL代码中的缺陷,还要考虑你正在编程的芯片上的故障,以及其他与芯片接口的硬件设备,所以人们应该真正考虑一个易于检查的设计。p>
一些调试提示:

  • 如果一个设计包括几个构建块,人们可能希望创建从这些块之间的接口到芯片外部测试点的线路

  • 您将希望在设计中保存足够的行,以便将感兴趣的数据转移到外部设备进行检查。您还可以使用这些行和您的代码来告诉您当前的执行状态—例如,如果您在某个时间接收到数据 在这一点上,您将一些值写入行,在执行的稍后阶段,您将写入另一个值,等等'

    如果您的芯片是可重新配置的,这将变得更加方便,因为您可以定制特定的测试,并在进行测试时重新编程每个测试的输出(这与LED非常匹配:)

编辑:

通过智能协议,我的意思是,如果两个物理单元连接,它们应该使用可用的最简单通信协议进行通信。也就是说,不要在它们之间使用任何复杂的自制协议

原因是这样的吗- 由于有模拟器,在FPGA/ASIC中修补bug相对来说很容易。 因此,如果您确定数据是按您的需要提供的,并且在程序发送数据时输出, 您已经达到了硬件乌托邦——能够在软件级别工作:)(使用模拟器)。 但是如果你的数据没有按你希望的方式到达你的手中,你必须找出原因。。。你必须接通线路,那可不是那么容易

在线路上发现错误是很困难的,因为您必须使用特殊设备连接到线路,这些设备记录线路在不同时间的状态,并且您必须确保您的线路按照协议运行

如果需要连接两个物理单元,请尽可能简化“协议”,直至不再称之为协议:) 例如,如果这些单元共享一个时钟,则在它们之间添加x条数据线,并使一个单元写入这些数据线,而另一个单元读取这些数据线,从而在每个时钟下降时传递一个在它们之间有x位的“字”。 如果您有FPGA,如果原始时钟速率对于并行数据来说太快,您可以根据您的实验控制其速度,例如使数据保持在至少“t”时钟周期的线路上等。 我假设并行数据传输更简单,因为您可以在较低的时钟速率下工作并获得相同的性能,而不需要在一个单元上拆分字,然后在另一个单元上重新组装。(希望每个单元接收的“时钟”之间没有延迟)。 甚至这可能也太复杂了:)

关于SPI、I2C等,我没有实现任何一个, 我可以说,我连接了两个从同一个时钟运行的FPGA的分支(不记得中间电阻的确切形式),速率要高得多,所以我真的