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

标签 arrays system-verilog

我正在尝试部分选择 2D 打包数组作为 1D 向量。我认为打包数组是连续存储的,因此可以被视为一维向量。但是以这种方式访问​​数组是非法的还是我忽略了某些东西?

我有一些示例,其中以这种方式分配多维数组可以在没有警告的情况下工作。但看起来不允许以这种方式访问​​它们。

请看一下这段代码,看看我的意思。当代码运行时,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

最佳答案

如果声明一个二维压缩数组,但只选择一个维度,即指第一个维度,就像未压缩数组一样。压缩数组与一维压缩数组的赋值兼容,但您仍然需要提供正确的数组索引。

您可以执行多种操作来将二维数组作为一维数组进行访问。

您可以使用串联的部分选择

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

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

   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
         

关于arrays - 部分选择多维 systemverilog 数组作为 1D 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49553662/

相关文章:

Python换行符打印两次

arrays - 反转多维数组 - 函数式编程风格

javascript - 生成不在颜色数组中的颜色的最快方法

verilog - 如何正确处理零位宽情况?

system-verilog - 读取总线信号的问题。与我的 Modelsim DE 10.2c 和 10.4 进行比较。 EDAplayground Modelsim 10.1d 有不同的结果

design-patterns - 在 systemverilog 源代码树中注册一个源文件的偏移量

system-verilog - 如何在 SystemVerilog 中进行扩展?

system-verilog - UVM 测试台中的断言模块

Javascript - 避免调用多个 array.filters

JavaScript 从文本字段的动态表中将数据读入数组