Перерыв или возврат из Always_ff / Always_comb - PullRequest
0 голосов
/ 20 октября 2018

Можно ли отрываться от всегда блока в Verilog?У меня большой блок, и он будет более читабельным с разрывами, по сравнению с несколькими вложенными операторами if / else.

Итак, я хочу что-то вроде этого:

always_ff @(posedge clk) begin
   ...

   if (x) begin
      ... 
      break;
   end

   ...
end

Я нашел одинрешение, но выглядит как взломать:

always_ff @(posedge clk) begin
repeat(1) begin

   ...

   if (x) begin
      ... 
      break;
   end

   ...
end
end

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы можете поместить свой код в функцию и использовать return вместо break

always_ff @(posedge clk) func1;
function void func1;
   if (x) begin
      ... 
      return;
   end

   ...
endfunction

Это можно синтезировать и принимать практически такое же количество нажатий клавиш.

0 голосов
/ 21 октября 2018

Невозможно сделать то, что вы хотите в синтезируемом коде.Кроме того, наличие большого блока ff обычно означает плохой стиль программирования verilog в любом случае.Вы должны попытаться разбить большой блок всегда на несколько отдельных меньших всегда _... блоков.

Цель синтезируемого кода verilog - описать поведение оборудования, которое вы хотите реализовать.В оборудовании нет «перерывов».Каждый блок Always_ff описывает флоп, возможно, с некоторой дополнительной логикой.Но в целом это должно выглядеть так:

 always_ff @(posedge clk)
      out <= in;

если вы добавите больше материала в блок, у вас должна быть очень веская причина для этого.Большие блоки FF заставят людей хмуриться.

Итак, опять же, вы должны разделить ваш Always_ff на набор флопов и комбинационной логики: always_ff и always_comb.Таким образом, вы сделаете его более читабельным и избежите множества проблем, которые могут возникнуть из-за больших блоков ff.

...