屏蔽输入解压缩数组

Masking input unpacked array

我想在给定特定信号的情况下“屏蔽”输入解压缩数组。如果该信号为 1,我希望输入全为零而不是给定的数组。

module thing (
  input clk,
  input rst,
  input packedBits[`PB_SIZE]
);
// ...
endmodule

module top (
  input clk,
  input rst
);

  logic packedBits[`PB_SIZE];

  mod_i thing (
    .clk(clk),
    .rst(rst),
    // I can manually put `PB_SIZE zeroes, but I want the compiler to do it for me
    .packedBits(rst ? {0,...,0} : packedBits)
  )
endmodule

当 `PB_SIZE 为 4 时仅输入 {0,0,0,0} 是可行的,但我如何才能以更通用的方式做到这一点?

您可以使用复制运算符:

.packedBits(rst ? '{`PB_SIZE{0}} : packedBits)

参考 IEEE 标准 1800-2017,第 5.11 节 数组文字

这是 EDA playground 上的完整示例。它在 Cadence 和 Synopsys 上运行,但在 Mentor 上有错误。 Mentor 似乎还不支持这种语法。


模拟器有时难以处理连接到模块端口的复杂表达式。使用单独的信号简化连接通常是个好主意。

`define PB_SIZE 5

module thing (input packedBits [`PB_SIZE]);
    initial #1 $display("%m %p", packedBits);
endmodule

module tb;
    bit rst = 1;
    logic packedBits      [`PB_SIZE];
    logic packedBitsGated [`PB_SIZE] = rst ? '{`PB_SIZE{0}} : packedBits;

    thing mod_i (.packedBits(packedBitsGated));

    initial begin
        packedBits = '{`PB_SIZE{1}};
        #1 $display("%m %p", packedBits);
    end
endmodule

这适用于 EDA playground 上的所有 3 个模拟器。

您可以在分配模式中使用 default。那就不用知道它的大小了。

.packedBits(rst ? '{default:0} : packedBits)