将数组作为参数传递给 SystemVerilog Xilinx 中的模块
Passing array as argument to a module in SystemVerilog Xilinx
我已经声明了以下 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 slice 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 数组?还是我做错了什么?
如果能提供一个完整的示例,如下所示,它可以与其他模拟器一起正常工作,将会有所帮助。数组连接 {,,,}
或赋值模式 '{,,,}
都应该有效。
所以我怀疑你有工具问题,或者你没有显示的东西有问题。
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
我已经声明了以下 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 slice 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 数组?还是我做错了什么?
如果能提供一个完整的示例,如下所示,它可以与其他模拟器一起正常工作,将会有所帮助。数组连接 {,,,}
或赋值模式 '{,,,}
都应该有效。
所以我怀疑你有工具问题,或者你没有显示的东西有问题。
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