Передача массива в качестве аргумента модулю в SystemVerilog Xilinx - PullRequest
0 голосов
/ 24 октября 2018

Я объявил следующий модуль 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
            };

Когда я смотрю в wavforms, все экземпляры module_1 получают правильный фрагмент y_in, исключая module_1_inst_2.К счастью для меня, я получаю Z для y_in в module_1_inst_2.Например, если я запускаю симуляцию, так как я печатаю значения 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 для модулей?или я что-то не так делаю?

1 Ответ

0 голосов
/ 24 октября 2018

Это поможет привести полный пример, подобный приведенному ниже, который отлично работает с другими симуляторами.Должна работать либо конкатенация массива {,,,}, либо шаблон назначения '{,,,}.Поэтому я подозреваю, что у вас либо проблема с инструментом, либо что-то не так с тем, что вы не показали.

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
...