我想在一个时钟进程中生成一些语句,如下所示:
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语句?
答案 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推荐的解决方法,只是使用尺寸变量而不是迭代器的“整数”。那会更容易!