Verilog 在有时钟的进程内使用for循环;“无法生成逻辑”;

Verilog 在有时钟的进程内使用for循环;“无法生成逻辑”;,verilog,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(

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

    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)

我以前也用过类似的方法,但效果很好,我做错了什么?如何生成这些if语句?

您的输入向量是热的吗?您编写的代码不能保证地址只能写入一个值。试试这个:

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

for(forcount=0;forcount您的输入向量是不是很热?您编写的代码不能保证地址只能写入一个值。请尝试以下操作:

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

for(forcount=0;forcount您的输入向量是不是很热?您编写的代码不能保证地址只能写入一个值。请尝试以下操作:

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

for(forcount=0;forcount您的输入向量是不是很热?您编写的代码不能保证地址只能写入一个值。请尝试以下操作:

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

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


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

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


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

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


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

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


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

作为一个临时工作,可以考虑使用生成语句。 例如:

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)
genvari;
始终@(posedge clk)开始
如果(rst)开始

地址作为一个临时工作,可以考虑使用生成语句。

例如:

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)
genvari;
始终@(posedge clk)开始
如果(rst)开始

地址作为一个临时工作,可以考虑使用生成语句。

例如:

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)
genvari;
始终@(posedge clk)开始
如果(rst)开始

地址作为一个临时工作,可以考虑使用生成语句。

例如:

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)
genvari;
始终@(posedge clk)开始
如果(rst)开始


地址它不是一个热点,目标是赋予较高的地址优先级。我希望较高的地址覆盖较低的地址。它是一个领先的一个检测器。因此,您需要执行
if
,或者您肯定需要使用
break
。我希望较高的地址覆盖较低的地址。它的设计就是这样的这不是一个热点,目标是赋予较高的地址优先级。我希望较高的地址覆盖较低的地址。这是一个领先的检测器。因此,您需要执行
if
else
,或者您肯定需要使用
break
。我希望较高的地址erwrite the lower。它是特意设计的,并且按照我希望的方式工作。它不是一个热门的,目标是赋予较高的地址优先级。我希望较高的地址覆盖较低的地址。它是一个领先的一个检测器。因此,您需要执行
if
else
或者您肯定需要使用
中断。我希望上面的地址覆盖下面的地址。它是特意设计的,并且按照我希望的方式工作。它不是一个热点,目标是赋予更高的地址优先级。我希望上面的地址覆盖下面的地址。它是一个领先的一个检测器。因此,您需要执行
if
else
或de>有限地需要使用
中断
。我希望上面的地址覆盖下面的地址。它是专门设计的,并且按照我希望的方式工作。合成工具展开循环。根据
C\u INPUT\u LENGTH
的值和您的时钟周期时间限制,展开的逻辑可能不适合一个时钟周期。您尝试过吗增加时钟周期时间或减少
C_INPUT_LENGTH
?@Ari,即使for循环不适合单个时钟周期,也不会阻止其合成。此外,您可能希望尝试分离组合逻辑块和顺序逻辑块。我会将for循环放在一个always_comb块中,并将其输出分配给
ad使用
(@posedge clk)
中始终穿着
看起来您希望在单个周期中找到第一个1位,这是一种组合逻辑。请参见此处:。尝试:
如果(vector_i[forcount]=1'b1)
而不是
如果(vector_i[forcount]=1)
@ari您指的是什么组合代码?所有东西都在一个始终块中。合成工具展开循环。根据
C\u INPUT\u LENGTH
的值和您的时钟周期时间限制,展开的逻辑可能不适合一个时钟周期。您是否尝试过增加时钟周期时间或减少
C\u INPUT\u LENGTH
?@Ari,即使for循环不适合单个时钟周期,也不会阻止其合成。此外,您可能希望尝试分离组合逻辑块和顺序逻辑块。我会将for循环放在一个always_comb块中,并将其输出分配给
always
with
(@posedge clk)中的
address
。看起来您希望在单个周期中查找第一个1位,这是一种组合逻辑。请参见此处:。尝试:
如果(v