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