移除多驱动器网络

Removing Multi-driver nets

我在 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 的新手,如果问题很愚蠢,我深表歉意。

A 生成 for-loop 重现代码。因此,您正在写的内容扩展为:

   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 是由两个 always 语句驱动的。

您可能认为这些陈述是独立的,但事实并非如此。 那是因为您没有指定默认值,因此规则是在这种情况下 val_id 应该保持不变。

删除 genvar 并在时钟部分使用正常的 for-loop。

备注:

reg[8:0] val_idx = 511; 并不像您认为的那样工作! 使用 val_idx <= 511; 作为 'always' 部分中的第一个语句。

你的一段代码会扩展成大量的逻辑。你得到 200 eight-bit 个比较器,它们将得到部分优化。将关联存储器作为专用逻辑块来完成是有原因的。