我在verilog中有一个静态数组,我正在读取一个值并尝试在数组中找到该值的索引。
为此,我已经完成了
array[0:200] = {32h'14151,...};
reg[8:0] val_idx = 511;
reg[31:0] val;
generate begin: hash
for(genvar i = 0 ; i < 200; i = i + 1) begin: hash_loop
always@ (posedge clk) begin
case(value)
array[i]:
val_idx <= i;
endcase
end
end
end endgenerate
然而,当我尝试使用Vivado进行合成时,我得到Multiple Driver Nets
200次并且它会失败。这样做的正确方法是什么?如果这个问题很愚蠢的话,我是verilog的新手。
答案 0 :(得分:2)
生成for循环再现代码。因此,您所写的内容将扩展为:
always@ (posedge clk) begin
case(value)
array[0]:
val_idx <= 0;
endcase
end
always@ (posedge clk) begin
case(value)
array[1]:
val_idx <= 1;
endcase
end
etc.
从中您可以看出val_idx是由两个始终语句驱动的。
您可能认为这些陈述是独立的,但事实并非如此。 那是因为你没有指定默认值,因此规则是在那种情况下val_id应保持不变。
删除genvar并在时钟部分内使用正常的for循环。
注意:
reg [8:0] val_idx = 511; 不会像你想象的那样工作! 使用 val_idx&lt; = 511; 作为“始终”部分中的第一个语句。
您的代码将扩展为大量逻辑。您将获得200个8位比较器,这些比较器将得到部分优化。联想记忆作为专用逻辑完成的原因是有原因的。