【问题标题】:How does system verilog treat if statements in always_ff blocks系统verilog如何处理always_ff块中的if语句
【发布时间】:2019-12-06 04:59:11
【问题描述】:
always_ff @(posedge sysclk) begin
case(state) begin
  SOME_STATE begin
    if(some logic to check) begin
       variable1 <= 1;
       variable2 <= variable_a > 0 ? 0 : 1;
       end
    else begin
       variable1 <= variable_b > 0 ? 0 : 1;
       variable2 <= 1;
       end
    variable3 <= {variable1, variable2}; 
    end //this case
  endcase
end //always_ff

所有变量都是逻辑类型并且大小合适。

系统 verilog 会在将控制 var1 和 2 的语句分配给 var3 之前正确评估它们,还是将 always_ff 中的 if 语句视为非阻塞?为了清楚起见,还有更多其他 if 已被删除。

【问题讨论】:

    标签: fpga system-verilog intel-fpga


    【解决方案1】:

    always_ff 块内的非阻塞赋值会推断触发器。 if 声明无关紧要。因此,在您的示例代码中,variable1variable2variable3 在模拟中的行为都类似于触发器,因此在综合后将成为触发器。

    如果您希望variable1variable2 成为组合逻辑,那么您必须使用阻塞赋值

    always_ff @(posedge sysclk) begin
    case(state) begin
      SOME_STATE begin
        if(some logic to check) begin
           variable1 = 1;                           // <-----
           variable2 = variable_a > 0 ? 0 : 1;      // <-----
           end
        else begin
           variable1 = variable_b > 0 ? 0 : 1;      // <-----
           variable2 = 1;                           // <-----
           end
        variable3 <= {variable1, variable2}; 
        end //this case
      endcase
    end //always_ff
    

    如果你想要这个,那么我建议你在begin-end 块内声明variable1variable2

    always_ff @(posedge sysclk) begin
    <some type> variable1;                          // <-----
    <some type> variable2;                          // <-----
    case(state) begin
        ...
        variable3 <= {variable1, variable2}; 
        end //this case
      endcase
    end //always_ff
    

    这将阻止任何其他always 块能够看到这些变量,这将阻止潜在的模拟竞赛,如果其他一些always 块可以看到它们。 p>

    【讨论】:

      【解决方案2】:

      IF 语句将代表布尔逻辑,它将值驱动到您的触发器。

      我宁愿拆分always_comb进程中的组合逻辑和always_ff中的顺序逻辑。

      always_ff @(posedge sysclk) begin
         if (something)
          variable1 <= value; // Non Blocking assignment in always_ff block, variable 1 will be a Flip-Flop
      end //always_ff
      
      
      always_comb begin
         if (something)
          variable2 = value; // Non Blocking assignment in always_comb block, variable2 won't be a flop in this case, but just a combinatinal logic.
      end //always_comb
      

      您的 IF 语句将推断相同的逻辑,在 always_ff 和 always_comb 块中,推断的逻辑将作为将值加载到变量 1 的启用。

      我希望它能澄清你在问什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 2021-06-10
        • 1970-01-01
        • 2016-05-20
        • 1970-01-01
        相关资源
        最近更新 更多