Verilog for loops-合成

Verilog for loops-合成,verilog,system-verilog,hdl,Verilog,System Verilog,Hdl,我对Verilog很陌生,但我想正确地理解它。目前我正在FPGA上制作TxRx。我注意到我的代码消耗了大量的逻辑,尽管它不应该是这样的。所以我没有正确地编写代码。我知道哪里出错了,很明显,我的for循环正在对表达式进行并行化(特别是因为这个for循环嵌套在另一个for循环中)。编写代码以避免这种情况的正确方法是什么。代码正在运行,但效率不高。请随意评论,建议。我还在学习,所以每一个建议都可能是好的。先谢谢你 内部循环的每一行都有三个数据乘法和一个加法运算以及一些其他较小的运算(例如%16)。合成

我对Verilog很陌生,但我想正确地理解它。目前我正在FPGA上制作TxRx。我注意到我的代码消耗了大量的逻辑,尽管它不应该是这样的。所以我没有正确地编写代码。我知道哪里出错了,很明显,我的for循环正在对表达式进行并行化(特别是因为这个for循环嵌套在另一个for循环中)。编写代码以避免这种情况的正确方法是什么。代码正在运行,但效率不高。请随意评论,建议。我还在学习,所以每一个建议都可能是好的。先谢谢你

内部循环的每一行都有三个数据乘法和一个加法运算以及一些其他较小的运算(例如%16)。合成器展开循环并尝试合成逻辑以在单个时钟周期内完成所有这些操作,该时钟周期计数为6*256次乘法。这有很高的面积,留给资源共享的空间很小

您可以选择用一些性能来换取面积。我会尝试以下方法:

  • 在单个周期中实现循环的每个迭代:计算该迭代,保存结果,然后将其用于下一个时钟周期。这将使面积减少256倍,但需要256个时钟周期才能完成,即每256个时钟周期您可以接受新输入。您可以在一个时钟周期中使用不同的迭代次数进行实验。例如,您可以在单个循环中计算外部循环的每个迭代。这将减少16倍的面积,每次计算需要16个时钟周期

  • 如果性能非常重要,您可以尝试管道化电路。这会使您的代码更加复杂,但会显著增加吞吐量。例如,您可以有256个阶段+管道寄存器的区域开销,但您的时钟周期可以短256倍。同样,您可以尝试使用不同的管道阶段,并选择最适合您需要的一个


在单个时钟周期或多个时钟周期中实现迭代算法(参见simple_mult module)。

由于每个循环迭代都使用上一次迭代中的
tmp
值,因此代码不能以并行方式合成,因此自然会构建一个长的计算链。如果你对你的计算进行一点模糊处理,这样人们就可以理解你到底想实现什么,他们就能帮助你优化它。这个模块在做卷积运算。我编写了代码中的变量。