关于task的一个问题请教
时间:10-02
整理:3721RD
点击:
在编写testbench时遇到一个问题,代码如下:
task pwm_output_1;
output high_side_pwm_in_o;
output low_side_pwm_in_o;
begin
#5000
high_side_pwm_in_o = 1;
low_side_pwm_in_o =0;
end
endtask
task pwm_output_2;
output high_side_pwm_in_o;
output low_side_pwm_in_o;
begin
#3000
high_side_pwm_in_o = 0;
low_side_pwm_in_o =1;
end
endtask
always @(posedge clk_t) begin
pwm_output_2 (high_side_pwm_in,low_side_pwm_in);
pwm_output_1 (high_side_pwm_in,low_side_pwm_in);
end
和下面这种情况比较
always @(posedge clk_t) begin
pwm_output_1 (high_side_pwm_in,low_side_pwm_in);
pwm_output_2 (high_side_pwm_in,low_side_pwm_in);
end
这两种情况只是把两个task在always 模块里的顺序改变了一下,得到了不同的波形,前面一种是先执行pwm_output_2后执行pwm_output_1,而后面一种是先执行pwm_output_1,后执行pwm_output_2,二者出来的波形都是方波,只是波形高低电平翻转的时刻不一样。
我的问题是:always语句是并行执行的,但为何在这里的仿真结果是顺序执行的?难道是因为调用task必须顺序调用?
task pwm_output_1;
output high_side_pwm_in_o;
output low_side_pwm_in_o;
begin
#5000
high_side_pwm_in_o = 1;
low_side_pwm_in_o =0;
end
endtask
task pwm_output_2;
output high_side_pwm_in_o;
output low_side_pwm_in_o;
begin
#3000
high_side_pwm_in_o = 0;
low_side_pwm_in_o =1;
end
endtask
always @(posedge clk_t) begin
pwm_output_2 (high_side_pwm_in,low_side_pwm_in);
pwm_output_1 (high_side_pwm_in,low_side_pwm_in);
end
和下面这种情况比较
always @(posedge clk_t) begin
pwm_output_1 (high_side_pwm_in,low_side_pwm_in);
pwm_output_2 (high_side_pwm_in,low_side_pwm_in);
end
这两种情况只是把两个task在always 模块里的顺序改变了一下,得到了不同的波形,前面一种是先执行pwm_output_2后执行pwm_output_1,而后面一种是先执行pwm_output_1,后执行pwm_output_2,二者出来的波形都是方波,只是波形高低电平翻转的时刻不一样。
我的问题是:always语句是并行执行的,但为何在这里的仿真结果是顺序执行的?难道是因为调用task必须顺序调用?
顶一下。
我觉得你这个就相当于:
always@(pos clk)
begin
out<=a;
out<=b;
end
和
always@(pos clk)
begin
out<=b;
out<=a;
end
但是这个编译会报错的,我这段代码可以编译通过,仿真还有波形,所以很奇怪。
两个always块是并行执行的,但每个always块的begin end块里的东西就是顺序执行的呀。
