部分选择多维systemverilog数组作为1D向量

时间:2018-03-29 10:24:03

标签: arrays system-verilog

我试图将2D打包数组选择为一维矢量。我认为打包的数组是连续存储的,因此可以被视为一维向量。但是以这种方式访问​​阵列是违法的还是我忽略了什么?

我有几个例子,这种方式分配多维数组没有警告。但看起来不允许以这种方式访问​​它们。

请看一下这段代码,看看我的意思。代码运行时arr显示X个值。我本地计算机上的Questa和Aldec on EDA Playground都报告超出范围警告。

// Code your testbench here
// or browse Examples
module tb;  
  logic [2:0][7:0] TEMP = {{8'h22},{8'h11},{8'h00}};
  logic [11:0] arr;
  bit clk;
  initial begin
     #30 $finish;
  end
  initial begin
    forever clk = #5 ~clk;
  end
  always_ff@(posedge clk)
    begin
      arr <= TEMP[12+:12]; //warns and doesn't work
      //arr <= TEMP[0+:12]; //warns but works!!
      TEMP[2:1] <= TEMP[1:0];
      TEMP[0] <= TEMP[2];
    end
  always_ff@(posedge clk)
    begin
      $display("arr : %h", arr);
      $display("TEMP[0] : %h",TEMP[0]);
      $display("TEMP[1] : %h",TEMP[1]);
      $display("TEMP[2] : %h",TEMP[2]);
  end
endmodule

2 个答案:

答案 0 :(得分:1)

如果声明一个二维打包数组,但只选择一个维度,即引用第一个维度,就像解压缩数组一样。打包数组与1-d打包数组兼容,但您仍需要提供正确的数组索引。

您可以通过多种方式将二维阵列作为一维阵列进行访问。

您可以使用连接的部件选择

arr = {TEMP}[0+:12];
arr = s.

您可以在打包结构中声明打包的数组。然后将整个结构视为一维阵列。

struct packed {logic [2:0][7:0] TEMP;} s = {{8'h22},{8'h11},{8'h00}};
arr = s[0+:12};
arr = s.TEMP[0]; // if you want to access the array

还有一个压缩联合,它为您提供了多种方式来访问相同的压缩1-D数组

   union packed {
                  logic [2:0][7:0] TEMP;
                  logic [5:0][3:0] NIB;
                } u = {{8'h22},{8'h11},{8'h00}};

   arr = u[0+:12];
   arr = u.NIB[2:0];// also 12 bits

答案 1 :(得分:0)

TEMP定义为

logic [2:0][7:0] TEMP

您正在声明2D打包数组。外部尺寸有3个元素;内部维度有8个元素。

由于它是打包数组,您还可以将其视为24位数字。但是,当您索引TEMP时,您正在索引外部维度。因此,TEMP[12]是外部维度的元素12。但是外部维度没有元素12(元素编号为2:0)。因此,您会收到警告以及X。 (与Verilog中的情况一样)当您索引超出范围的元素时,将返回该类型的默认值,在这种情况下,类型为logic,是X

所以,当你说

  arr <= TEMP[12+:12]; //warns and doesn't work

您要将arr设置为TEMP的元素23:12。所有这些元素都超出了范围,所以你得到X s(它“不起作用”)。但是,当你说

  arr <= TEMP[0+:12]; //warns but works!!

您将arr设置为TEMP的元素11:0。元素2:0在范围内,因此返回TEMP的实际值,但元素11:3超出范围,因此返回X s。但是,由于这是一个打包数组,arr设置为96'hXXXXXXXXX210(或其他),而arr为12位宽,所有X都被截断,所以你的代码“有效”。