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