Verilog for 循环 - 综合
Verilog for loops - synthetization
我是 Verilog 的新手,但想正确理解它。目前我正在 FPGA 上制作 TxRx。我注意到我的代码消耗了大量的逻辑,尽管它不应该那样。所以我没有正确编写代码。我知道哪里错了,显然我的 for 循环正在对表达式进行并行化(特别是因为这个 for 循环嵌套到另一个 for 循环中)。编写代码以避免这种情况的正确方法是什么。该代码正在运行,但效率不高。欢迎评论,建议。我还在学习,所以每一个建议都可能是好的。先感谢您。
你的内部循环的每一行都有三个数据乘法和一个加法运算以及一些其他较小的运算(例如 %16)。合成器展开循环并尝试合成逻辑以在单个时钟周期内执行所有这些操作,这计数为 6*256 次乘法。这样面积大,资源共享的空间很小
您可以选择牺牲一些性能来换取面积。我会尝试以下操作:
在单个周期内实现循环的每次迭代:计算该迭代,保存结果,然后将其用于下一个时钟周期。这会将面积减少 256 倍,但需要 256 个时钟周期才能完成,也就是说,您可以每 256 个时钟周期接受一次新输入。您可以在一个时钟周期内尝试不同次数的迭代。例如,您可以只计算单个循环中外循环的每次迭代。这将使你的面积减少 16 倍,每次计算需要 16 个时钟周期。
如果性能非常重要,您可以尝试流水线化您的电路。这会使您的代码更复杂一些,但会显着增加您的吞吐量。例如,您可以有 256 个阶段 + 流水线寄存器的面积开销,但您的时钟周期可以短得多的 256 倍。同样,您可以尝试使用不同的流水线阶段,然后选择最适合您需求的阶段。
Here is an example 在单个时钟周期或多个时钟周期中实现迭代算法(参见 simple_mult 模块)。
我是 Verilog 的新手,但想正确理解它。目前我正在 FPGA 上制作 TxRx。我注意到我的代码消耗了大量的逻辑,尽管它不应该那样。所以我没有正确编写代码。我知道哪里错了,显然我的 for 循环正在对表达式进行并行化(特别是因为这个 for 循环嵌套到另一个 for 循环中)。编写代码以避免这种情况的正确方法是什么。该代码正在运行,但效率不高。欢迎评论,建议。我还在学习,所以每一个建议都可能是好的。先感谢您。
你的内部循环的每一行都有三个数据乘法和一个加法运算以及一些其他较小的运算(例如 %16)。合成器展开循环并尝试合成逻辑以在单个时钟周期内执行所有这些操作,这计数为 6*256 次乘法。这样面积大,资源共享的空间很小
您可以选择牺牲一些性能来换取面积。我会尝试以下操作:
在单个周期内实现循环的每次迭代:计算该迭代,保存结果,然后将其用于下一个时钟周期。这会将面积减少 256 倍,但需要 256 个时钟周期才能完成,也就是说,您可以每 256 个时钟周期接受一次新输入。您可以在一个时钟周期内尝试不同次数的迭代。例如,您可以只计算单个循环中外循环的每次迭代。这将使你的面积减少 16 倍,每次计算需要 16 个时钟周期。
如果性能非常重要,您可以尝试流水线化您的电路。这会使您的代码更复杂一些,但会显着增加您的吞吐量。例如,您可以有 256 个阶段 + 流水线寄存器的面积开销,但您的时钟周期可以短得多的 256 倍。同样,您可以尝试使用不同的流水线阶段,然后选择最适合您需求的阶段。
Here is an example 在单个时钟周期或多个时钟周期中实现迭代算法(参见 simple_mult 模块)。