Verilog实现Rosenbrock函数适配度计算输出不定值XX问题求助
问题根源
你代码里存在3个核心错误直接导致输出不定值:
- 多驱动冲突:你在generate的k循环外部定义了
x_i、x_im1、a、b、fitness_val这几个全局wire变量,但k从1到3共3次循环,每次循环都对同一个全局wire做assign赋值,相当于同一条硬件连线被多个驱动源同时控制,自然会输出不定值X。 - 位宽配置严重不足:你定义
a为4位,但是计算项100*(x_i - x_im1)^2的最大值远大于4位能表达的最大值15,会发生严重溢出,计算结果完全错误。同时fitness_val仅2位,也根本存不下累加后的适配度结果。 - 累加逻辑错误:wire类型不支持累积赋值,你写的
assign fitness_val = fitness_val + ...本质是把线的输出接回自身输入,再叠加多驱动问题,根本无法得到正确累加结果。
修复后的代码
module test_module1 ( x, fitness); input [4*2 -1:0] x; // 调整输出位宽到8位,适配计算结果范围 output [7:0] fitness; wire [1:0] x_array1 [3:0]; // 定义累加中间变量数组,用于存储每一步的累加结果 wire [7:0] sum_stage [2:0]; genvar j; generate // 解线性化逻辑保留,无问题 for (j =0 ; j <4 ; j = j+1) begin assign x_array1[j] = x[2*j +: 2]; end // 第一次迭代单独处理,初始累加值为0 assign sum_stage[0] = 100*(x_array1[1] - x_array1[0])*(x_array1[1] - x_array1[0]) + (1 - x_array1[0])*(1 - x_array1[0]); // 后续迭代串联累加,中间变量放在循环内部避免多驱动 for (j=2; j<4; j=j+1) begin: rosenbrock_calc wire [7:0] a = 100*(x_array1[j] - x_array1[j-1])*(x_array1[j] - x_array1[j-1]); wire [7:0] b = (1 - x_array1[j-1])*(1 - x_array1[j-1]); assign sum_stage[j-1] = sum_stage[j-2] + a + b; end endgenerate assign fitness = sum_stage[2]; endmodule
测试台代码仅需要调整fitness的位宽匹配即可:
module tb_tm1(); wire [7:0] fitness; wire [4*2-1:0] x_array; test_module1 tm1(x_array, fitness); assign x_array = 8'b11100100; // 可选加仿真打印语句验证结果 initial begin #10; $display("fitness = %d", fitness); $finish; end endmodule
内容的提问来源于stack exchange,提问作者GeekyScientist
相关产品推荐
相关产品推荐

