从always_ff / always_comb中断或返回

时间:2018-10-20 17:23:13

标签: verilog system-verilog

是否有可能打破Verilog中的始终阻止?我有一个很大的块,与多个嵌套的if / else语句相比,带有中断的可读性更高。

所以我想要这样的东西:

always_ff @(posedge clk) begin
   ...

   if (x) begin
      ... 
      break;
   end

   ...
end

我找到了一个解决方案,但是它看起来像一个hack:

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

   ...

   if (x) begin
      ... 
      break;
   end

   ...
end
end

2 个答案:

答案 0 :(得分:1)

您可以将代码放入函数中,并使用return代替break

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

   ...
endfunction

这是可合成的,并且需要的击键次数几乎相同。

答案 1 :(得分:0)

无法通过可合成的代码来完成所需的操作。同样,具有较大的ff块通常在任何情况下都意味着不良的Verilog编程风格。您应该尝试将大的Always块拆分为多个单独的较小的alway _...块。

可综合的Verilog代码的目的是描述您要实现的硬件的行为。在硬件中没有“中断”。每个always_ff块都描述一个触发器,可能带有一些附加逻辑。但一般来说,它应该像这样:

 always_ff @(posedge clk)
      out <= in;

如果您在块中添加更多内容,则必须有很好的理由。大型ff街区会让人们皱眉。

因此,再次,您应该将always_ff分为一组触发器和组合逻辑:always_ff和always_comb。这样,您将使它更具可读性,并避免了大型ff块可能导致的多个问题。