将向量解压缩为一定位宽的数组

问题描述

假设我有一个向量位。我想将其转换为 n 位值的数组,其中 n 是变量(而不是参数)。我可以使用流运算符来实现吗?我尝试了这一点(现在我只想尝试3的值,但最终'3'应该是可变的):

module tb;
  bit [51:0] vector = 'b111_110_101_100_011_010_001_000;
  byte vector_byte[];
  
  initial begin
    $displayb(vector);
    vector_byte = {<<3{vector}};
    foreach(vector_byte[i])
      $display("%0d = %0b",i,vector_byte[i]);
  end
endmodule

我期望的是:

vector_byte = '{'b000,'b001,'b010 ... 'b111};

但是,我得到的输出是:

# vsim -voptargs=+acc=npr
# run -all
# 00000000000000000000000000000000111110101100011010001000
# 0 = 101
# 1 = 111001
# 2 = 1110111
# 3 = 0
# 4 = 0
# 5 = 0
# 6 = 0
# exit

我只是在使用流运算符吗?

解决方法

流运算符仅适用于连续流。您需要在每个字节中插入5'b00000。

module tb;
  bit [51:0] vector = 'b111_110_101_100_011_010_001_000;
  int W = 3;
  byte vector_byte[];
  
  initial begin
    vector_byte = new[$bits(vector)/3];
    $displayb(vector);
    foreach(vector_byte[i]) begin
      vector_byte[i] = vector[i*W+:8] & (1<<W)-1; // mask W is in range 1-8
      $display("%0d = %0b",i,vector_byte[i]);
    end
  end
endmodule