在时钟进程内使用for循环:“无法生成逻辑”

时间:2014-06-24 15:24:50

标签: verilog

我想在一个时钟进程中生成一些语句,如下所示:

    parameter C_INPUT_LENGTH      = 32;
    parameter C_OUTPUT_NUM_BITS   = 5;

    reg [C_OUTPUT_NUM_BITS-1:0]        address;
    reg [C_INPUT_LENGTH-1:0]           vector_i;

    always@(posedge clk) begin        
       if(rst) begin
          address <= 0;
       end 
       else begin

         if (vector_i[0] == 1) begin
            address <= 0;
         end

         if (vector_i[1] == 1) begin
            address <= 1;
         end

         ...

         if (vector_i[C_INPUT_LENGTH-1] == 1) begin
            address <= C_INPUT_LENGTH-1;
         end

       end
    end // always@ (posedge clk)

我是这样做的:

    integer                            forcount;
    always@(posedge clk) begin        
       if(rst) begin
          address <= 0;
       end 
       else begin

          for (forcount = 0;forcount <= C_INPUT_LENGTH-1 ;forcount = forcount + 1) begin
             if (vector_i[forcount] == 1) begin <--
                address <= forcount;
             end
          end 

       end
    end // always@ (posedge clk)

Xilinx vivado(2014.1)给出了以下错误,参考上面指出的行:

[Synth 8-903] failed to generate logic

我在使用过去类似的方法之前已经完成了这项工作,但是我做错了什么?如何生成这些if语句?

3 个答案:

答案 0 :(得分:3)

根据Xilinx,这是CR 801365中记录的已知错误。在某些情况下,使用整数作为循环计数器会导致此问题。它将在vivado 2014.3中修复。

解决方案是用适当大小的信号类型reg替换整数。

答案 1 :(得分:0)

你的输入vector_i是热的吗?您编写的代码并不保证地址只会写入一个值。试试这个:

for (forcount = 0;forcount <= C_INPUT_LENGTH-1 ;forcount = forcount + 1) begin
  if (vector_i[forcount] == 1) begin
     address <= forcount;
     break;
  end
end 

第一次条件为真时,添加break语句将跳出for循环。请注意,这将生成一些进位链逻辑,使用case statement可能会获得更好的结果。

答案 2 :(得分:0)

作为临时解决方法,您可以考虑使用生成语句。

例如:

genvar i;

always @(posedge clk) begin
  if (rst) begin
    address <= 0;
  end else begin
     generate 
       for (i = 0; i < C_INPUT_LENGTH; i = i + 1) begin: foreach_input
         if (vector_i[i]) address <= i;
       end
     endgenerate
   end // if (rst)
 end  // always @(posedge clk)

编辑:哦,没关系 - 我错过了Xilinx推荐的解决方法,只是使用尺寸变量而不是迭代器的“整数”。那会更容易!