删除多驱动程序网络

时间:2018-03-10 11:45:53

标签: verilog fpga

我在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的新手。

1 个答案:

答案 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位比较器,这些比较器将得到部分优化。联想记忆作为专用逻辑完成的原因是有原因的。