You need to enable JavaScript to run this app. Verilog实现Rosenbrock函数适配度计算输出不定值XX问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 21:36:00