将矢量转换为数组

时间:2016-10-24 17:17:30

标签: verilog fpga

我有这样的矢量

wire [N:0] Vector[M:0];

我希望将其转换为大小为M * N的数组。伪代码可以是:

Array={Vector[M],Vector[M-1],Vector[M-2],...,Vector[0]}

所以我想在数组中连接向量的元素。 我尝试使用循环来做它,但是当我尝试模拟它时会给出一个没有描述的致命错误。有没有更简单的方法呢?感谢!!!

1 个答案:

答案 0 :(得分:3)

我猜你尝试过这样的事情:Array[N*(index+1) : N*index ] = Vector[index];在一个总是阻止。这不起作用,因为Verilog要求范围的两边都是常数(在模拟期间)。

有三种Verilog方法可以获得所需的任务:

  1. 位分配
  2. 数组切片分配
  3. 生成循环分配
  4. 位分配
    在Verilog-95(IEEE1364-1995)中,实现这一目标的唯一方法是使用双循环进行位分配:
    Array[N*index_m+index_n] = Vector[index_m][index_n];

    reg [M*N:0] Array;
    integer index_m, index_n;
    always @(Vector) begin // Verilog-95 style sensitivity list
      for(index_m=0; index_m <= M; index_m = index_m + 1) begin
        for(index_n=0; index_n <= N; index_n = index_n + 1) begin
          Array[N*index_m+index_n] = Vector[index_m][index_n];
    end
    endgenerate
    

    数组切片分配
    另一种方法是使用+:进行矢量切片(IEEE1364-2001中添加了一项功能。请参阅Indexing vectors and arrays with +:)。这允许一个变量起始索引和范围的常量偏移 Array[N*index +: N ] = Vector[index];

    reg [M*N:0] Array;
    integer index;
    always @* begin // Verilog-2001 style sensitivity list
      for(index=0; index <= M; index = index + 1) begin
        Array[index*N +: N ] = Vector[index];
    end
    endgenerate
    

    生成循环分配
    第三种方法是使用generate块(也在IEEE1364-2001中添加)。生成块for循环在详细说明时解开。如果Array[N*(index+1) : N*index ] = Vector[index];index,则可以使用genvar形式: 或者使用生成块

    wire [M*N:0] Array; // note 'wire'
    generate
    genvar g_index; // The 'g_' prefix is suggested coding style to identified genvars
    for(g_index=0; g_index <= M; g_index = g_index + 1) begin
      assign Array[(g_index+1)*N] : g_index*N] = Vector[g_index];
      //assign Array[g_index*N +: N ] = Vector[g_index]; // +: also works
    end
    endgenerate
    

    SytemVerilog(IEEE1800)添加了位流,可以一步Array = {>>{Vector}};执行操作,但我不知道它对于合成有多么常见。 (我通常在+:中使用SystemVerilog的foreach进行数组切片(always_comb