传递向量并对其执行操作会导致 X
Passing a vector and performing operations on it results in X
这是我要实现的模块。我想要做的是,接收一个矢量,比如 2 位宽,有 4 个元素,我将其线性化并从测试平台传递到 test_module1。现在我想对其进行去线性化并对其执行一些组合操作以获得基于 Rosenbrock 函数的适应度值。但是,我得到的适应度值为 XX。
我无法理解这里的问题。
module test_module1 ( x, fitness);
input [4*2 -1:0] x;
output [1:0] fitness;
wire [1:0] x_i;
wire [1:0] x_im1;
wire [1:0] fitness_val = 2'b00;
wire [3:0] a;
wire [3:0] b;
wire [1:0] x_array1 [3:0];
genvar k;
assign fitness = fitness_val;
genvar j;
generate
for (j =0 ; j <4 ; j = j+1) begin
assign x_array1[j] = x[2*j +: 2];
end
for (k=1; k<4; k=k+1) begin
assign x_i = x_array1[k];
assign x_im1 = x_array1[k-1];
assign a = 100*(x_i[1:0] - x_im1[1:0])*(x_i[1:0] - x_im1[1:0]);
assign b = (1 - x_im1[1:0])*(1 - x_im1[1:0]);
assign fitness_val = fitness_val + a[2:1] + b[2:1];
end
endgenerate
endmodule
测试平台:
module tb_tm1();
wire [1:0] fitness;
wire [4*2-1:0] x_array;
test_module1 tm1(x_array, fitness);
assign x_array = 8'b11100100;
endmodule
我得到的输出是这样的:
X
(未知值)的原因是由于多个驱动程序争用同一信号。
例如,信号 fitness_val
有 5 个驱动程序。第一行是:
wire [1:0] fitness_val = 2'b00;
这是一个连续赋值,这意味着模拟器总是试图将其驱动到0。其他4个驱动程序来自for
k
循环:
assign fitness_val = fitness_val + a[2:1] + b[2:1];
如果您要手写循环,您将有 4 行相同的 assign
行。 fitness_val
应该只有 1 个驱动程序,而不是 5 个。
您在那个 for
循环中有所有 5 个信号的多个驱动程序。
assign fitness_val
行的另一个问题是它创建了一个组合循环。您不应在连续作业的左轴和右轴上同时显示 fitness_val
。
这是我要实现的模块。我想要做的是,接收一个矢量,比如 2 位宽,有 4 个元素,我将其线性化并从测试平台传递到 test_module1。现在我想对其进行去线性化并对其执行一些组合操作以获得基于 Rosenbrock 函数的适应度值。但是,我得到的适应度值为 XX。
我无法理解这里的问题。
module test_module1 ( x, fitness);
input [4*2 -1:0] x;
output [1:0] fitness;
wire [1:0] x_i;
wire [1:0] x_im1;
wire [1:0] fitness_val = 2'b00;
wire [3:0] a;
wire [3:0] b;
wire [1:0] x_array1 [3:0];
genvar k;
assign fitness = fitness_val;
genvar j;
generate
for (j =0 ; j <4 ; j = j+1) begin
assign x_array1[j] = x[2*j +: 2];
end
for (k=1; k<4; k=k+1) begin
assign x_i = x_array1[k];
assign x_im1 = x_array1[k-1];
assign a = 100*(x_i[1:0] - x_im1[1:0])*(x_i[1:0] - x_im1[1:0]);
assign b = (1 - x_im1[1:0])*(1 - x_im1[1:0]);
assign fitness_val = fitness_val + a[2:1] + b[2:1];
end
endgenerate
endmodule
测试平台:
module tb_tm1();
wire [1:0] fitness;
wire [4*2-1:0] x_array;
test_module1 tm1(x_array, fitness);
assign x_array = 8'b11100100;
endmodule
我得到的输出是这样的:
X
(未知值)的原因是由于多个驱动程序争用同一信号。
例如,信号 fitness_val
有 5 个驱动程序。第一行是:
wire [1:0] fitness_val = 2'b00;
这是一个连续赋值,这意味着模拟器总是试图将其驱动到0。其他4个驱动程序来自for
k
循环:
assign fitness_val = fitness_val + a[2:1] + b[2:1];
如果您要手写循环,您将有 4 行相同的 assign
行。 fitness_val
应该只有 1 个驱动程序,而不是 5 个。
您在那个 for
循环中有所有 5 个信号的多个驱动程序。
assign fitness_val
行的另一个问题是它创建了一个组合循环。您不应在连续作业的左轴和右轴上同时显示 fitness_val
。