我正在使用Quartus将组合电路合成到FPGA。现在我想在不考虑资源消耗的情况下获得最佳的最大频率。当前的关键路径由一系列乘法组成,如下所示:
res = a * b * c *d
我想知道Quartus是否有可能自动生成具有较短关键路径的等效组合逻辑:
ab = a * b
cd = c * d
res = ab * cd
关键路径上只有两个乘数。我发现Quartus的在线文档提到这是可能的,但没有关于如何做的说明:UsingTimeQuestAnalyzer
由于我不想改变这种组合电路的时序,所以流水线在这里不起作用。
答案 0 :(得分:1)
像Quartus这样的综合工具通常基于HDL(VHDL / Verilog)代码构建初始内部结构,然后根据约束和区域重新组织和优化该结构,以及工具具有操作结构的规则的扩展。最后,该工具进行时序检查,以确定最终设计的时间安排。
对于乘法*
运算符的实现,Quartus只使用a * b * c * d
的左关联属性实现*
,因此为((a * b) * c) * d
,并且不适用要使(a * b) * (c * d)
符合时间要求的关联规则。
所以如果你想把乘数设为:
res = (a * b) * (c * d)
你可以帮助编写HDL的综合工具(使用VHDL):
ab <= a * b;
cd <= c * d;
res <= ab * cd;
并记住制定符合要求的时序约束,以检查生成的实现是否满足所需的时序。路径要求可以类似于a
到res
,最长延迟为12 ns:
set_max_delay -from [get_ports a[*]] -to [get_ports res[*]] 12
...
RTL和技术结构如下图所示:
res = a * b * c * d
之类的表达式给出了这种结构:
按照预期实施时间顺序。
因此,如果您通过HDL代码建议的结构将满足时序,则通常可以通过HDL代码的结构来控制实现,并且综合工具无法在满足时序要求的情况下进一步优化区域。