我知道verilog是一个HDL,它的全部是关于并行处理,但我面临的问题是我必须编写一份报告,说明为什么一部分C ++代码在HDL环境中更好。
所以我有C ++代码,我在Verilog中写道。它完美地运作。现在我必须编写一份关于Verilog中这部分代码如何更快的报告。所以我必须进行执行时间比较。
我设法使用以下方法找到我的C ++代码的执行时间:
#include <iostream.h>
#include <time.h>
using namespace std;
int main()
{
clock_t t1,t2;
t1=clock();
//code goes here
t2=clock();
float diff ((float)t2-(float)t1);
cout<<diff<<endl;
system ("pause");
return 0;
}
现在我如何才能在Verilog中获得相同的结果? Xilinx编译器中是否有任何选项可以告诉我这段代码在编程到FPGA板上后产生最终结果需要多长时间?或者我可以在代码中添加能够提供此结果的内容吗?
谢谢
答案 0 :(得分:6)
我认为你完全忽略了这一点。你没有在Verilog中执行程序,你用它设计硬件。它是硬件描述语言。运行Verilog的模拟并使用$time
或$realtime
命令将不会告诉您算法在硬件中运行所需的时间。
您需要做的是将您的Verilog合成到FPGA,然后查看综合报告,了解从算法输入的更改到输出有效所需的时间。当然,您可能需要添加流水线或使用综合约束来从合成中获得合适的结果。这不是一个微不足道的过程,所以期望花时间学习它是如何完成和完成的。
答案 1 :(得分:1)
Verilog是关于描述硬件行为的。 verilog模拟器用于模拟计算机上的描述。 verilog模拟器用于模拟fpgas中的行为实现。
在任何情况下,模拟或仿真都需要多个周期。您的C ++程序只需“1”个循环。所以,首先你要让它运行多个周期,提供时钟变化。像这样:
for (int i = 0; i < MAX_CYCLES; i++) {
myClk = ~ myClk;
executeMyCode(myClk);
}
对于verilog模拟,你需要这样的东西来切换时钟:
initial begin
for (int i = 0; i < MAX_CYCLES; i++) begin
#1 myClk= ~myClk
end
$finish;
end
你无法在fpgas中合成上述内容,因此对于仿真,您需要使用时钟并告诉仿真器运行多长时间(MAX_CYCLES?),确保时钟的变化次数与c ++或仿真时间相同。
verilog模拟在计算机上并行从不并行运行。它只是通过改变模型不同部分的评估顺序来假装这样做。
仿真基于硬件实现实现真正的并行性。
根据代码的性质,您可能会发现c ++更好: - )。
答案 2 :(得分:-1)
我认为你要找的是:$ time
这是一个简单的例子: http://www.asic-world.com/verilog/vbehave2.html example