1

我正在阅读 IEEE 标准 Verilog 硬件描述语言(特别是 IEEE Std 1364-2001),它明确定义并讨论了可模拟的Verilog。不幸的是,该文件没有涉及合成的概念。

我无法为可合成的Verilog 找到类似的参考资料。我发现的只是模糊的规则,或不必要的限制性规则。

我在哪里可以学习可综合 Verilog 的形式语言?

4

1 回答 1

4

IEEE 1364.1 是题为Verilog Register Transfer Level Synthesis的 1364 Verilog 标准的补充,它试图定义一个通用的可综合子集。但是,正如 Jerry 所指出的,不同的工具支持不同的结构,要确定特定于工具的行为,您需要查阅工具文档。

可合成的 Verilog 没有正式的(BNF 风格)语法定义。代码是否可合成取决于用法和语法。例如,由具有不完全敏感性的 always 构造描述的行为,如always @(a) o = a || b,是不可综合的。(大多数工具将合成该代码,就好像敏感度列表是完整的,从而导致可能的模拟/合成不匹配。)

像锁存器和乘法驱动网络这样的电路结构可以从 Verilog 描述中合成,但在大多数设计规则下是不允许或不鼓励的。考虑到目标库的选择,也有不支持或不建议的可合成结构。例如,描述大于所选 FPGA 技术支持的最大值的 RAM,或者描述目标库中不存在的三态驱动程序。

可合成的 Verilog 坚持的一般结构是:

  • 用连续赋值(assign语句)建模的组合逻辑
  • 用 always 块建模的组合逻辑,它应该使用块分配,并且要么有一个完整的敏感性列表,要么使用always @*
  • 使用 always 块建模的顺序逻辑(触发器),它应该使用非阻塞分配,并且具有单独的 posedge 时钟(用于同步复位或非复位触发器)或 posedge 时钟和 posedge 或 negedge 复位(用于异步复位触发器)在敏感度列表中。

顺序逻辑最安全的编码风格是在顺序 always 块中只编码复位逻辑:

always @(posedge clk or posedge reset)
  if (reset)
    q <= reset_value;
  else
    q <= next_value;

但是,如果您小心的话,您可以在顺序块中编写额外的组合逻辑。这样做可能有意义的常见情况是翻牌前的多路复用器:

always @(posedge clk)
  if (!sel)
    q <= sel0_value;
  else if (sel)
    q <= sel1_value;
  else
    q <= 'bx;
于 2012-04-05T18:06:30.167 回答