检查一段时间内输出信号的值

Checking the value of output signal over a period of time

我有一个 initial 块调用名为 power_task 的任务,如下所示

initial begin
#10;
power_task;
end

在 power 任务中,我有两个信号 power_apower_b。最初,power_a 变低,经过一定偏差后,power_b 变低。只要两个信号都很低,我就需要检查输出 q。在 window 期间输出 q 应该为低电平,其中 power_apower_b 信号为低电平。由于没有像时钟这样的其他信号,我不确定如何连续监控 q。我写了类似下面的内容

task power_task;

#1;
power_a=0;
#5; //skew
power_b=0;
   if (power_a==0 && power_b==0 && q==0) begin
   $display("pass");
   end
#50;
power_b=1;
#5;
power_a=1;
end
endtask

在上述任务中,if 语句仅在两个信号都为低电平之后而不是在整个 50 ns 时间内检查 q 的值 window。有人可以帮忙吗?

在任务之外使用一个always块,一个控制信号(check_en)和一个标志变量(pass):

reg pass = 1;
reg check_en = 0;

always @(check_en, q) begin
    if (check_en && q) begin
        $display("fail");
        pass = 0;
    end
end

initial begin
    #10;
    power_task();
    if (pass) $display("pass");
end

task power_task;
    #1;
    power_a=0;
    #5; //skew
    power_b=0;
    check_en = 1;
    #50;
    check_en = 0;
    power_b=1;
    #5;
    power_a=1;
endtask

always 块将持续监视 q 信号以了解启用后的任何变化。

您可以在 fork 块中使用 wait 语句

task power_task;
  begin
    reg fail;
    fail = 0;
    #1 power_a=0;
    #5 power_b=0; //skew
    fork : check_q
      wait (q) fail = 1;
      #50 begin
          if (fail) 
            $display("fail");
          else
            $display("pass");
          disable check_q;
        end
    join
    power_b=1;
    #5 power_a=1;
  end
endtask

不确定为什么需要检查 power_a/b 是否仍然为 0,除非有一些其他代码可以更改它。