如何输出多维数组切片

时间:2014-09-17 06:44:43

标签: multidimensional-array system-verilog

假设我有一个多维数组:

logic [7:0] mda [7:0];

我现在要做的是将mda[7:4]分配给输出端口,即定义如下:

output [31:0] odata;

当然,我可以通过使用连接来实现:

assign odata = {mda[7], mda[6], mda[5], mda[4]};

但是应该(并且可能是)更简单的方法来做到这一点。第一次尝试将是:

assign odata = mda[7:4];

这是错误的,因为类型(解压缩< - >压缩数组)不匹配。我所有的投射尝试(例如32'(mda[7:4]))都失败了。问题是:将该切片分配给输出端口的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

你可以使用for循环...大多数综合工具在常数范围内的for循环都没有问题:

module dut(output [31:0] odata);

  logic [7:0] mda [7:0];  

  reg[31:0] data;
  always @* begin
    data = 0;
    for(int i=7; i >=4; i--) begin
      data <<= 8;
      data |= mda[i];
    end
  end

  assign odata = data;

endmodule

这是一个快速测试:http://www.edaplayground.com/x/GfM

答案 1 :(得分:3)

您可以使用流媒体运营商:

initial begin
  logic[31:0] data;

  mda[7] = 'hde;
  mda[6] = 'had;
  mda[5] = 'hbe;
  mda[4] = 'hef;
  data = { >> { mda[7:4] }};

  $display("data = ", data);
end

这在程序上下文中完美地起作用,但在连续的赋值上下文中(由于某种原因)不起作用。这意味着这不起作用:

assign odata = { >> { mda[7:4] }};

你必须找到一个解决方法,在这里你可以在程序上下文中进行流式处理(可能是一些always块),然后将结果分配给你的线。