我有一个位向量(一个热编码,又名,一位且只有一位为 1),它表示另一个向量上的位图。例如,假设这些是我的变量:
logic [3:0] bitmap;
logic [7:0] data_vector[3:0];
assign bitmap = 4'b0010;
我想访问与
data_vector
中断言位相对应的 bitmap
的索引(本例中为 data_vector[1])。
一个明显的方法如下:
logic [7:0] selection;
always_comb begin
for (integer i = 0; i < 4; i++) begin
if (bitmap[i]) begin
selection = data_vector[i];
end
end
end
我想知道是否有更有效的方法来做到这一点。以下情况是不可能的
selection = {8{bitmap[0]}} & data_vector[0] | ...
|{8{bitmap[3]}} & data_vector[3];
因为这只是一个解释问题的小例子。预先感谢:)
你可以做
selection = data_vector[$clog2(bitmap));
如果这需要可综合并且您的综合工具不支持 $clog2,那么您可以自己编写该函数,或者坚持您最初编写的内容。
假设您的位图是 256 位,并且您想要生成 8 位的索引。
logic [255:0] bitmap;
logic [7:0] idx;
always_comb begin
idx = '0;
for (int i = 0; i < 256; i++) begin
if (bitmap[i]) begin
idx |= 8'(i);
end
end
end