System verilog 将向量解包到具有特定位宽度的数组中

System verilog 将向量解包到具有特定位宽度的数组中,system-verilog,System Verilog,假设我有一个位向量。我想把它转换成一个n位值的数组,其中n是一个变量(不是一个参数)。我可以使用流媒体运营商实现这一点吗?我尝试过这个(现在我只是尝试3的值,但最终“3”应该是可变的): 然而,我得到的结果是: # vsim -voptargs=+acc=npr # run -all # 00000000000000000000000000000000111110101100011010001000 # 0 = 101 # 1 = 111001 # 2 = 1110111 # 3 = 0 # 4

假设我有一个位向量。我想把它转换成一个n位值的数组,其中n是一个变量(不是一个参数)。我可以使用流媒体运营商实现这一点吗?我尝试过这个(现在我只是尝试3的值,但最终“3”应该是可变的):

然而,我得到的结果是:

# 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
模块tb;
位[51:0]向量='b111_110_101_100_011_010_001_000;
int W=3;
字节向量_字节[];
初始开始
vector_byte=新[$bits(vector)/3];
$B(矢量);
foreach(向量字节[i])开始

向量_字节[i]=向量[i*W+:8]&(1Tanks@dave_59。我认为这是唯一的解决方案。正如我提到的,“3”部分来自一个变量,而部分切片需要一个常量。我假设我必须自己将每个元素与另一个“for”循环组合在一起,对吗?如果变量介于1和8之间,你不需要另一个for循环,正如我在编辑的ans中所示如果超过8位,那么你需要另一个循环。
# vsim -voptargs=+acc=npr
# run -all
# 00000000000000000000000000000000111110101100011010001000
# 0 = 101
# 1 = 111001
# 2 = 1110111
# 3 = 0
# 4 = 0
# 5 = 0
# 6 = 0
# exit
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