首页 > 解决方案 > always_comb 中的临时变量会创建锁存器吗

问题描述

我有以下代码片段,其中临时变量用于计算数组中 1 的数量:

   // count the number 1s in array 
   logic [5:0] count_v; //temp
   always_comb begin
      count_v = arr[0];
      if (valid) begin
         for (int i=1; i<=31; i++) begin
            count_v = arr[i] + count_v;
         end
      end
      final_count = count_v;
   end

这个逻辑会为 count_v 创建一个锁存器吗?综合工具是否足够智能以正确综合此逻辑?我正在努力为这类场景找到任何编码建议。

另一个例子:

logic temp; // temp variable
always_comb begin
   temp = 0;
   for (int i=0; i<32; i++) begin
      if (i>=start) begin
         out_data[temp*8 +: 8] = in_data[i*8 +: 8];
         temp = temp + 1'b1;
      end
   end
end

标签: verilogsystem-verilog

解决方案


抱歉,Eddy Yau,我们似乎正在就您的帖子进行一些讨论。

这是一些示例代码:

module latch_or_not (
   input            cond,
   input      [3:0] v_in,
   output reg       latch,
   output reg [2:0] comb1,
   output reg [2:0] comb2

   );

reg [2:0] temp;
reg [2:0] comb_loop;

  // Make a latch
  always @( * )
     if (cond)
        latch = v_in[0];

  always @( * )
  begin : aw1
     integer i;
     for (i=0; i<4; i=i+1)
       comb_loop = comb_loop + v_in[i];
     comb2 = comb_loop;
  end

  always @( * )
  begin : aw2
     integer i;
     temp = 7;
     for (i=0; i<4; i=i+1)
       temp = temp - v_in[i];
     comb1 = temp;
  end

endmodule

如果按照 Xilinx Vivado 工具经过细化后得出的结果是这样的:

'latch' 输出很明显。您还会注意到 temp 不存在于最终结果中。

'comb_loop' 不是锁存器,但更糟糕的是:它是一个组合循环。逻辑的输出返回到输入。绝对不!

在此处输入图像描述


推荐阅读