Verilog:分层设计中的初始化

时间:2018-02-21 20:41:18

标签: verilog

我对reg初始化有一些疑问。

  1. 我可以在设计中放置初始块吗?这是一个好方法吗?
  2. 如何在我的底部设计中初始化注册?我是否需要在每个级别创建端口并从上到下提供初始值?对于每个模拟,初始值都不同。

2 个答案:

答案 0 :(得分:2)

第1点:
我们最近讨论了关于电子论坛的初步陈述。

  • 测试台的初始陈述是正常的。事实上,如果没有初始语句,编写测试代码会变得更加困难。
  • 在ASIC,CPLD或硬编程FPGA中无法做出初步陈述。
  • 您可以在大多数基于RAM的FPGA中使用初始语句,其中状态在加载FPGA后有效。但是,如果你有一个'reset'引脚或命令,恢复初始状态。因此,复位后的FPGA状态可能与启动状态不同,因此您的设计可能无法正常工作。
  • 在某些情况下,允许实际可合成模块中的初始状态,甚至是模块工作所必需的。见下面的例子。

示例1:您有两个寄存器,没有重置编码为:

divide_by_two <=  ~divide_by_two;
or 
divide_by_two <=  not(divide_by_two);

在模拟中始终保持“X”但实际上它将在0或1条件下开始,然后在两者之间切换。要在模拟中解决'X',您需要设置初始条件。如果初始条件为“1”或“0”,则代码应独立工作。

示例2:您有一个除以四个寄存器而没有重置编码为:

divide_by_four[1:0] <= {divide_by_four[0],~divide_by_four[1]};
or
divide_by_four[1:0] <= divide_by_four[0] & not(divide_by_four[1]);

允许这样做的原因是,在操作期间,两个寄存器经历四种可能状态中的每一种:00,01,11,10。它开始的四个中的哪一个无关紧要,序列将永远是重复。再次在模拟中解决“XX”问题,您可以设置初始条件。如果初始条件为00,01,10或11,则代码应独立工作。

许多设计师认为,除了上面的例子,在合成代码中使用初始语句是危险的,最好避免使用它们。

第2点:
您可以使用带有相应HDL代码的“重置”信号来设置启动条件,而不是初始语句。复位转到每个有寄存器的模块是正常的。

答案 1 :(得分:0)

取决于您的目标设计。

您可以 通常 使用带有FPGA的initial块。您可以在声明它的同一模块中初始化寄存器。不允许分层分配。如果添加复位输入,还可以使用同步复位初始化寄存器。大多数FPGA具有有限数量的具有异步复位/预置(如果有)的触发器。因此,initial块和同步复位是FPGA的最佳选择。

ASIC 通常 不会合成initial块。使用同步逻辑中的复位条件完成触发器的初始化。这通常是异步复位,但不是必需的。在ASIC的排序,同步或异步复位中。

对于这两种情况,要进行综合,初始化值需要是确定性的并由常数决定。它不能在输入端口或另一个寄存器的当前状态下导出。

即使您打算从不合成,也应遵循这些指南。否则调试会更具挑战性。