目录
1、@和wait在initial块中的一些奇怪的事情
initial begin
a = 0;
#2;
a = 1;
end
initial begin
wait(a == 1); //wait
a = 0;
$display("1");
end
initial begin
wait(a == 1); //wait
$display("2");
end
// 打印只能打印出 1;
initial begin
a = 0;
#2;
a = 1;
end
initial begin
@(posedge a ); //@
a = 0;
$display("1");
end
initial begin
@(posedge a );//@
$display("2");
end
//打印出1和2
1、首先@是边沿触发,当检测到上升沿时就执行下面的
2、wait是电平触发,电平=1时,检测。
@的结果很容易理解,但是为什么wait,initial块应该是同时进行的,为什么好像是第一个initial块结束了才执行第二个。(打个flag)
感觉是和仿真器有关,虽然sv仿真器将initial块之间并行运行,但是在是在cpu运行过程中每条指令都依旧是串行执行,所以对于不消耗时间的initial块,他是有先后执行顺序的。仿真器会将第一个执行完毕再执行下一个。
2、forever 内部没有延时
forever 内部如果没有延时,好像会导致仿真无法结束?
3、fork join进程
fork
$display(1);
$display(2);
$display(3);
join/join_any/join_none
$display(4);
join : 1234
join_any:1423
join_none:4123
fork-join进程的一些的理解
1、fork-join内部两个进程的先后顺序
通常我们接收的观念是内部进程并行执行,那它所谓的的先后顺序指的是什么呢。
如果两个进程在同一刻仿真时间,会先执行上面的进程(和initial块的并行执行性质一样),如果在不同的仿真时刻是并行的。
module test;
bit a;
initial begin
a = 0;
fork
begin
a = 1;
$display("a = %d",a);
end
$display("a = %d",a);
join
end
endmodule
看结果,两个进程是等到a = 1 ,才开启下个进程。
原因:和仿真器有关,虽然sv仿真器将initial块之间并行运行,但是在是在cpu运行过程中每条指令都依旧是串行执行,所以对于不消耗时间的initial块,他是有先后执行顺序的。仿真器会将第一个执行完毕再执行下一个。
2、program/module 内部执行到begin-end时结束的区别
program会将最后的这一刻的仿真时间的语句执行完毕就停止,注意是同时刻的仍然会执行,下一时刻的就不再运行。而module仿真不会终止。
program示例:
`timescale 1ns/1ps
program test;
initial begin
fork
$display(1);
$display(2);
$display(3);
#2
$display(5);
join_none
$display(4);
end
endprogram
// join:12345
//join_any:1423,没有5哦
//join_none:4123,没有5哦
module的示例:
`timescale 1ns/1ps
module test;
initial begin
fork
$display(1);
$display(2);
$display(3);
#2
$display(5);
join/any/none
$display(4);
end
endmodule
// join:12345
//join_any:14235,
//join_none:41235,
3、fork join内部加了begin end,begin_end的线程顺序执行。
示例2:thread1 和thread 2并行执行。
//示例1
fork begin
process1
process2
end join
示例2
fork
begin //thread1
process1
process2
end
begin //thread2
process1
process2
end
join