System verilog SystemVerilog中可变宽度的位切片

System verilog SystemVerilog中可变宽度的位切片,system-verilog,System Verilog,我试图使用+:操作符访问数组的某些部分,但是得到臭名昭著的[variable]并不是一个恒定的错误。唯一的问题是,我希望从数组中获取的宽度也在变化 这是我的循环: logic [N-1:0] a; logic [2**N-2:0] b; for (i = 0; i < N; i++) a[i] = b[(2**i)-1 +: 2**i] == {(2**i){1'b1}}; 从逻辑上讲,我非常确定我提供的循环可以工作,但是SystemVerilog不允许使用非常量来设置宽度(在a

我试图使用
+:
操作符访问数组的某些部分,但是得到臭名昭著的
[variable]并不是一个恒定的
错误。唯一的问题是,我希望从数组中获取的宽度也在变化

这是我的循环:

logic [N-1:0] a;
logic [2**N-2:0] b;
for (i = 0; i < N; i++)
    a[i] = b[(2**i)-1 +: 2**i] == {(2**i){1'b1}};
从逻辑上讲,我非常确定我提供的循环可以工作,但是SystemVerilog不允许使用非常量来设置宽度(在
a:
之后)。 当起始索引和宽度都依赖于非常量变量时,如何使用
+:
运算符?或者,考虑到
N
可能是一个很大的数字,有没有其他方法可以做到这一点

谢谢

编辑:

这可以通过轮班完成,以下是工作代码:

for (i = 0; i < N; i++)
    a[i] <= ((b >> (2**i)-1) << ((2**N) - (2**i) - 1)) == 
             {(2**N-1){1'b1}} << ((2**N) - (2**i) - 1);

(i=0;i
a[i]>(2**i)-1)不能使用宽度可变的
+:
。它实际上只是变换和面具的简写。例如,在您的案例中,类似于以下内容的内容应该适用:

  logic [N-1:0] a;
  logic [2**N-2:0] b;
  always_comb begin
   for (int i = 0; i < N; i++) begin
    logic [2**N-2:0] tmpb, tmp1;
    tmpb = b >> ((2**i)+1);
    tmp1 = ((2**N)'(1) <<  (2**i)) - 1;
    a[i] = (tmpb & tmp1) == 0;
   end
  end

逻辑[N-1:0]a;
逻辑[2**N-2:0]b;
总是从梳子开始
对于(int i=0;i>((2**i)+1);

tmp1=((2**N);(1)您不能使用宽度可变的
+:
。它实际上只是移位和掩码的简写。例如,在您的情况下,类似于以下的内容应该可以使用:

  logic [N-1:0] a;
  logic [2**N-2:0] b;
  always_comb begin
   for (int i = 0; i < N; i++) begin
    logic [2**N-2:0] tmpb, tmp1;
    tmpb = b >> ((2**i)+1);
    tmp1 = ((2**N)'(1) <<  (2**i)) - 1;
    a[i] = (tmpb & tmp1) == 0;
   end
  end

逻辑[N-1:0]a;
逻辑[2**N-2:0]b;
总是从梳子开始
对于(int i=0;i>((2**i)+1);

tmp1=((2**N)“”(1)您可以使用带掩码的“+:”运算符的组合

   parameter N  = 8; localparam N2 = 2**(N-1);
   logic [N-1:0] a;
   logic [2**N-1:0] b;

   initial begin
      b       ={8'b000001,4'b1111,2'b01,1'b1};
      for (int i = 0; i < N; i++)
          a[i]  = (b[(2**i)-1 +: N2] | ~N2'((1 << 2**i)- 1)) == '1;
      $displayb(a,,b);
      end
参数N=8;localparam N2=2**(N-1);
逻辑[N-1:0]a;
逻辑[2**N-1:0]b;
初始开始
b={8'b000001,4'b1111,2'b01,1'b1};
对于(int i=0;ia[i]=(b[(2**i)-1+:N2]| ~N2'((1您可以使用带掩码的“+:”运算符的组合。)

   parameter N  = 8; localparam N2 = 2**(N-1);
   logic [N-1:0] a;
   logic [2**N-1:0] b;

   initial begin
      b       ={8'b000001,4'b1111,2'b01,1'b1};
      for (int i = 0; i < N; i++)
          a[i]  = (b[(2**i)-1 +: N2] | ~N2'((1 << 2**i)- 1)) == '1;
      $displayb(a,,b);
      end
参数N=8;localparam N2=2**(N-1);
逻辑[N-1:0]a;
逻辑[2**N-1:0]b;
初始开始
b={8'b000001,4'b1111,2'b01,1'b1};
对于(int i=0;ia[i]=(b[(2**i)-1+:N2]| ~N2'((1您可以使用
+:
,前提是右侧为常量或
genvar

logic [N-1:0] a;
logic [2**N-2:0] b;
for (genvar i = 0; i < N; i++) begin : gen_a
    assign a[i] = b[(2**i)-1 +: 2**i] == {(2**i){1'b1}};
end
逻辑[N-1:0]a;
逻辑[2**N-2:0]b;
对于(genvar i=0;i

请注意,此for循环是一个generate for循环,它不在程序块内(即
begin
-
end

如果右侧为常量或
genvar
,则可以使用
+:

logic [N-1:0] a;
logic [2**N-2:0] b;
for (genvar i = 0; i < N; i++) begin : gen_a
    assign a[i] = b[(2**i)-1 +: 2**i] == {(2**i){1'b1}};
end
逻辑[N-1:0]a;
逻辑[2**N-2:0]b;
对于(genvar i=0;i
请注意,此for循环是一个generate for循环,它不在程序块内(即
begin
-
end