关于Verilog hdl 中循环语句forever编译错误的疑问。

`timescale 1us/1us
module clocktest;
reg Clk_in,Rst_in,S1_in,S2_in;
wire Spk_out;
wire[6:0] Display_out;
wire[2:0] Sel_out;
parameter HALF_PERIOD=50;
//产生10KHZ 时钟
initial
begin
Clk_in=0;
forever #HALF_PERIOD Clk_in=~Clk_in; 第十三行
end
//产生复位信号
initial
begin
Rst_in=1;
#(2*HALF_PERIOD) Rst_in=0;
#(10*HALF_PERIOD) Rst_in=1;
end
//产生调节小时信号
initial
begin
S1_in=1;
#(35000*HALF_PERIOD) S1_in=0;
#(60000*HALF_PERIOD) S1_in=1;
end
//产生调节分钟信号
initial
begin
S2_in=1;
#(95000*HALF_PERIOD) S2_in=0;
#(60000*HALF_PERIOD) S2_in=1;
end
clock t(.Spk(Spk_out),.Display(Display_out),.Sel(Sel_out),
.Clk(Clk_in),.Rst(Rst_in), .S1(S1_in),.S2(S2_in));
endmodule
编译后出现
Error (10119): Verilog HDL Loop Statement error at clocktest.v(13): loop with non-constant loop condition must terminate within 250 iterations
Error: Can't elaborate top-level user hierarchy
Error: Quartus II Analysis & Synthesis was unsuccessful. 2 errors, 0 warnings

Verilog 这个语言有两个部分,一部分是可综合的用来生成电路,一部分是不可综合的用来写testbench(测试脚本)。你贴的程序是不能综合的那部分,是testbench。不能综合的那部分非常的接近C语言,适合写测试文件。
我在网上看了一下,你是参考的《基于Verilog HDL设计的多功能数字钟》这篇论文
你贴的这部分代码是modelsim调用的仿真测试文件,不是用来综合的。
文献中“测试模块源代码如下:”这句话以上的代码是用来综合的。你先了解一下verilog的语法,以及quartus和modelsim的使用。然后看这篇论文你就明白了,才9月离答辩还远吧。
你要是真正对FPGA感兴趣,建议认真学一下。很好的一个范例。麻雀虽小,五脏俱全。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-28
forever #HALF_PERIOD Clk_in=~Clk_in; 把HALF_PERIOD直接用个常数替代看看。不然还是直接用always好了
第2个回答  2011-09-28
首先,你这样写来进行仿真是没有问题的,只是quartus进行编译的时候是一起进行综合的,这个forever一直循环执行是不能综合的。就算改成了for(i=。。。。)进行有条件的循环时,quartus编译时analysis可以通过但这个TB文件的synthesis仍然不会通过的。 建议你使用VCS或modelsim等仿真工具进行仿真。
相似回答