Можно ли сделать вызов задачи внутри оператора ожидания в системе Verilog? - PullRequest
0 голосов
/ 18 февраля 2020
wait((irq == 1'b1) || (wb_bus.master_read(2'b10,DON) DON == 16'h8000));

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Не уверен, чего вы пытаетесь достичь, но я предполагаю, что вы ждете либо irq == 1, либо чтения шины, чтобы получить 16'h8000. В этом случае вы можете отключить две операции, дождаться завершения любой из них и затем остановить их. Обратите внимание, что существует дополнительный оператор fork, необходимый для того, чтобы disable fork не убивал ВСЕ дочерние потоки. См. Ответ @ dave_59 здесь .

fork // Container fork to reduce scope of `disable fork`
  begin
    fork // Actual fork we want to do!
      begin
        wait(irq == 1'b1);
      end
      begin
        logic [15:0] DON;
        do begin // Assuming you want to keep reading until the value is what you want
          wb_bus.master_read(2'b10,DON)
        end
        while(DON != 16'h8000)
      end
    join_any;
    disable fork; 
  end
join
0 голосов
/ 18 февраля 2020

Нет, не напрямую. Но косвенно, вероятно, не собирается делать то, что вы хотите. (Что мы понятия не имеем, что это такое. См. XY Проблема )

Предполагая, что master_read является трудоемкой задачей, вы можете обернуть ее не пустой функцией, которая всегда возвращает true. Затем выполните fork wb_bus.master_read(2'b10,DON); join_none внутри функции. Если master_read не занимает много времени, сделайте его функцией с возвращением void.

Но вы не можете контролировать, как часто выполняется выражение и, следовательно, как часто вызывается задача. Если irq и DON изменятся одновременно, он может быть вызван один или два раза.

...