Verilog: два блока всегда @ (posedge clk) находятся в одном коде verilog - PullRequest
1 голос
/ 19 апреля 2020

У меня есть вопрос, что два always @(posedge clk) blocks будут идентичны одному always @(posedge clk) block.

Например,

always @(posedge clk) begin
    // do task1
end

always @(posedge clk) begin
   // do task2
end

идентичен этому?

always @(posedge clk) begin
    // do task1
    // do task2
end

Спасибо

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

Нет, это не так.

В первом примере две задачи выполняются параллельно. Во втором они выполняются последовательно.

Вот крайний пример, когда вещи не только отличаются, но даже есть неприятный побочный эффект. Итак, давайте сначала определим часы и две задачи:

reg clk,a,b;

   initial
   begin
      clk = 1'b0;
      a = 1'b0;
      b = 1'b0;
      forever
         #50 clk = ~clk;
   end

task task1;
begin
   #10;
   a <= 1'b1;      
   #30;
   a <= 1'b0;
end
endtask


task task2;
begin
   #10;
   b <= 1'b1;      
   #70;
   b <= 1'b0;
end
endtask

Теперь, если мы будем вызывать задачи по отдельности, каждая из них заканчивается до конца тактового цикла.

always @(posedge clk) begin
    task1;
end

always @(posedge clk) begin
   task2;
end

Это дает следующую форму волны, в которой шаблон повторяется каждый такт, а две формы волны параллельны:

enter image description here

Если мы используем второй код, общее время в задании на больше, чем тактовый цикл .

always @(posedge clk) 
begin
   task1;
   task2;
end

Это дает различную форму волны, в которой паттерны расположены последовательно, но также повторяется каждый секундный тактовый цикл.

enter image description here

2 голосов
/ 19 апреля 2020

Это зависит. Если между двумя задачами нет зависимостей, которых обычно не бывает для синтезируемых RTL, то это не имеет значения.

Но если существует требование, что задача 1 выполняется перед задачей 2, то только один блок always может гарантировать это.

...