问题出现如下:
1、使用的verilog语言;
2、modelsim仿真测试文件中(testbench),定义了一个变量(dout);
3、使用always语句对其赋值后,编译没报错,仿真时会出现下面几种情况:
第一种情况:
`timescale 1ns/1ps
module always_tb ();
reg clk;
reg link;
reg [7:0] dout;
initial begin clk <= 1'b0; link <= 1'b1; end
always #10 clk = ~clk;
always dout = (link) ? 8'h00 : 8'hff;
endmodule
结果:编译通过,仿真无结果,卡死
第二种情况:
`timescale 1ns/1ps
module always_tb ();
reg clk;
reg link;
reg [7:0] dout;
initial begin clk <= 1'b0; link <= 1'b1; end
always #10 clk = ~clk;
always #10 dout = (link) ? 8'h00 : 8'hff;
endmodule
结果:编译通过,仿真通过,dout前10ns时间无数据。
第三种情况:
`timescale 1ns/1ps
module always_tb ();
reg clk;
reg link;
wire [7:0] dout;
initial begin clk <= 1'b0; link <= 1'b1; end
always #10 clk = ~clk;
assign cmos_data = (cmos_vsync) ? 8'h00 : 8'hff;
endmodule
结果:编译通过,仿真通过
总结:
个人觉得always语句表示总是给某一变量赋值,当在always语句中没有加延时时间(如情况1),相当于always语句一直在执行,仿真根本反应不过来;当在always语句中加延时时间#10(如情况2),相当于在延时10ns过后才进行一次dout的赋值;那为什么使用assign连续赋值语句的时候(如情况3),仿真就能正常进行,难道与变量类型有关,还是跟modelsim执行代码有关?