移除多驱动器网络
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 个比较器,它们将得到部分优化。将关联存储器作为专用逻辑块来完成是有原因的。
我在 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 个比较器,它们将得到部分优化。将关联存储器作为专用逻辑块来完成是有原因的。