Verilog FPGA语言的编译器是否执行优化?

Verilog FPGA语言的编译器是否执行优化?,verilog,compiler-optimization,fpga,Verilog,Compiler Optimization,Fpga,计算机语言(如C/C++、Fortran、Julia等)的现代编译器的一个更有用的特性是,它们能够在生成二进制代码之前对代码执行优化。如果我用Verilog编写一个函数来生成一个FPGA“硬件”特殊函数,编译器会执行任何优化吗?作为一个具体的例子,假设我想设置一个多项式求值器,使用,并且一些系数是0,编译器会看到这一点并优化掉有效的noop吗 是的。示例中的优化称为“恒定传播”。当涉及到优化布尔或算术表达式时,所有编译器中的技术都是相同的。编译器将尽可能简化任何表达式。另一种优化方法是“死代码消

计算机语言(如C/C++、Fortran、Julia等)的现代编译器的一个更有用的特性是,它们能够在生成二进制代码之前对代码执行优化。如果我用Verilog编写一个函数来生成一个FPGA“硬件”特殊函数,编译器会执行任何优化吗?作为一个具体的例子,假设我想设置一个多项式求值器,使用,并且一些系数是0,编译器会看到这一点并优化掉有效的noop吗

是的。示例中的优化称为“恒定传播”。当涉及到优化布尔或算术表达式时,所有编译器中的技术都是相同的。编译器将尽可能简化任何表达式。另一种优化方法是“死代码消除”,如果分支条件为常数,则可以消除未关闭的分支,并且执行的分支成为无条件的。但是,在RTL转换为硬件表示形式之后,优化过程与软件编译器非常不同

Verilog在generate语句中有循环,这些循环总是在合成时完全展开。

如果一个循环的迭代次数适中且固定,编译器会将其展开到硬件中吗?这种语言似乎既有可能实现标准的并行展开(当循环独立时),也有可能实现串行展开(当每次迭代修改某个值时)。硬件中不存在循环。硬件中不存在与此相关的程序性声明。RTL代码中的循环在硬件中实现的方式对于本论坛来说是一个太宽泛的话题。不可能是这样的,是吗?我不是硬件专家,所以我可能是错的,但我可以想象硬件应该能够实现重复,只要递减计数器不为零并且设置了“ready for next iteration”(为下一次迭代做好准备)标志,它就会运行。这些是不可能的,还是在某种程度上不实用(即不稳定的)?我认为我们正在进入术语的细微差别。如果没有对您编写的HDL代码如何合成为AND、OR和NOT逻辑门结构的正确理解,我们就不会走得很远。虽然FPGA中有“可编程”功能,但FPGA并不像编译软件那样运行编译后的程序在主机处理器上运行。我想我现在看到了问题所在——我所描述的可能不可避免地会导致硬件中的某个地方出现竞争情况。用Verilog编写的任何循环,无论是生成for还是过程for,都必须展开到硬件中。