确定哪些 Verilog 工具可综合的精确规则

Ran*_*lue 2 verilog

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

我还没有找到可综合Verilog 的类似参考资料。我发现的只是模糊的规则,或者不必要的限制性规则。

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

And*_*ndy 5

IEEE 1364.1 是 1364 Verilog 标准的一个附件,标题为Verilog Register Transfer Level Synthesis,它试图定义一个通用的可综合子集。然而,正如 Jerry 指出的那样,不同的工具支持不同的构造,并且要确定特定于工具的行为,您需要查阅工具文档。

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

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

可综合的 Verilog 需要遵循的一般结构是:

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

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

always @(posedge clk or posedge reset)
  if (reset)
    q <= reset_value;
  else
    q <= next_value;
Run Code Online (Sandbox Code Playgroud)

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

always @(posedge clk)
  if (!sel)
    q <= sel0_value;
  else if (sel)
    q <= sel1_value;
  else
    q <= 'bx;
Run Code Online (Sandbox Code Playgroud)