我正在阅读 IEEE 标准 Verilog 硬件描述语言(特别是 IEEE Std 1364-2001),它明确定义和讨论了可模拟的Verilog。不幸的是,该文件没有涉及综合的概念。
我还没有找到可综合Verilog 的类似参考资料。我发现的只是模糊的规则,或者不必要的限制性规则。
在哪里可以学习可综合 Verilog 的形式语言?
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 @(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)