simstart.sv代码如下
module simstart1;
logic a1=0;
logic a2, a3, a4, a5;
bit rstn, clk;
assign a2 = a1; // assign
initial begin // initial
a3 = a1;
end
always @(posedge clk, negedge rstn) begin // sequential logic
if(rstn === 'b0) a4 <= 0;
else a4 <= a1;
end
always @(a1) begin // combination logic
a5 <= a1;
end
initial begin
#10ns rstn <= 0;
#20ns rstn <= 1;
end
initial forever #5ns clk <= !clk;
endmodule
编译完成后,add ware添加到波形,此时还没有run,仿真没有开始。四值逻辑类型变量默认值为X,二值逻辑类型变量默认值为0。
当运行run 0
命令时,是指的运行一个时间片,即无穷多个delta-cycle
通过对比仿真加载后各个信号的数值和仿真执行了run 0后各个信号的数值,可以看出代码assign a2 = a1
被执行,所以a2的值由x变成了0。第一个initial
块也被执行,代码a3 = a1
使得a3的值也由x变成了0。而两个always
块并没有执行,此时的a4,a5的值还是x。
所以得出结论:assign在0时刻会执行一次,而always必须等到信号变化才执行。