0

我已经声明了以下 systemverilog 模块:

module module_top
    (
        input  logic                              clk,
        input  logic                              rst,
        input  logic signed [7  : 0 ] x_in,
        input  logic signed [5  : 0 ] y_in [24:0]
    );
    module_1 module_1_inst_1( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[4 : 0 ]));
    module_1 module_1_inst_2( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[9 : 5 ]));
    module_1 module_1_inst_3( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[14: 10]));
    module_1 module_1_inst_4( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[19: 15]));
    module_1 module_1_inst_5( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[24: 20]));
endmodule

module module_1
    (
        input  logic                              clk,
        input  logic                              rst,
        input  logic signed [7 : 0 ] x_in,
        input  logic signed [5 : 0 ] y_in [4:0]
    );
always_ff @(posedge clk) begin
    $display("INFO: ", $sformatf("y_in=%p", y_in));
end

endmodule

我正在使用 Vivado 2018.2 对此模块进行功能测试。我将测试台中的以下数组传递给 module_top:

    y_in =  {
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b001111,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b001111,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b001111,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b000000,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b001111
            };

当我查看波形时,module_1 的所有实例化都得到了正确的 y_in 切片 excpet module_1_inst_2。对我来说,我在 module_1_inst_2 中得到了 y_in 的 Z。例如,如果我运行模拟,因为我在时钟的每个 pos 边缘打印 y_in 值,我得到以下信息:

INFO: y_in='{15,15,15,15,15}
INFO: y_in='{6'bzzzzzz,6'bzzzzzz,6'bzzzzzz,6'bzzzzzz,0}
INFO: y_in='{15,15,15,15,15}
INFO: y_in='{15,15,15,15,15}
INFO: y_in='{15,15,15,15,15}

但是,如果我将此打印移动到层次结构的上一级(module_top),则 y_in 具有正确的所有值。当我检查波形时,我得到了同样的观察结果。

另一方面,如果我将 y_in 宽度从 6 位更改为 7 位,它会起作用!所以我猜 Xilinx 不能正确支持模块的 passign 数组?还是我做错了什么?

4

1 回答 1

1

举一个像下面这样的完整示例会有所帮助,它可以与其他模拟器一起正常工作。数组连接{,,,}或分配模式'{,,,}都应该起作用。所以我怀疑你要么有工具问题,要么你没有显示的东西有问题。

module module_top
    (
        input  logic                              clk,
        input  logic                              rst,
        input  logic signed [7  : 0 ] x_in,
        input  logic signed [5  : 0 ] y_in [24:0]
    );
    module_1 module_1_inst_1( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[4 : 0 ]));
    module_1 module_1_inst_2( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[9 : 5 ]));
    module_1 module_1_inst_3( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[14: 10]));
    module_1 module_1_inst_4( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[19: 15]));
    module_1 module_1_inst_5( .clk(clk), .rst(rst), .x_in(x_in), .y_in(y_in[24: 20]));
endmodule

module module_1
    (
        input  logic                              clk,
        input  logic                              rst,
        input  logic signed [7 : 0 ] x_in,
        input  logic signed [5 : 0 ] y_in [4:0]
    );
always_ff @(posedge clk) begin
  $display("%m INFO: ", $sformatf("y_in=%p", y_in));
end

endmodule
module top;
  logic signed [5  : 0 ] y_in [24:0];
  bit clk,rst;
  logic signed [7  : 0 ] x_in;
  module_top dut (.*);
  always #2 clk++;
  initial begin
     y_in =  {
                1,2,3,4,5,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b001111,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b001111,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b000000,
                6'b001111, 6'b001111, 6'b001111, 6'b001111, 6'b001111
            };
    #10 $finish;
  end
endmodule
于 2018-10-24T20:17:14.703 回答