逊299 2024-08-23 02:57 采纳率: 50%
浏览 47

verilog两个for循环嵌套无法综合

verilog使用两个for循环嵌套的代码,可以仿真而且计算结果正确,综合的时候却核心模块缺失。
已经尝试过减少一个for循环,还是无法综合。而且不报错,查vivado的log报告也找不到问题。
自己核对了没有什么硬件不能实现的语言。
值得一提的是,在这之前写了单个for循环的代码(是我把纯流水线的代码改为CYCLE迭代复用形式的前身),这个代码是完全可以综合的,算法内容完全一致。
还请各位帮忙看下或者提供些经验性建议……感恩

// FOR LATENCY == CMAX, high latency case
module sqrt_binary_high_v1_0 #(parameter SIZE = 8'd30, HALF_SIZE = 8'd15, LATENCY_CONFIG = 15, CYCLE_CONFIG_MAX = 15, CYCLE = 4) (
    input i_clk,
    input i_aclken,
    input i_rst_n,
    input [SIZE-1 : 0] i_p,
    output [HALF_SIZE - 1:0] o_u
);

localparam REMAINDER = CYCLE_CONFIG_MAX % CYCLE; // r1
localparam FOR = (CYCLE_CONFIG_MAX % CYCLE == 0) ? (CYCLE_CONFIG_MAX / CYCLE) : (CYCLE_CONFIG_MAX / CYCLE + 1); // q1
localparam REMAIN_LATENCY = CYCLE_CONFIG_MAX - (CYCLE - 1);


wire [HALF_SIZE-1:0] u [HALF_SIZE-1:0]; 

wire [SIZE-1:0]      r_cycle [CYCLE_CONFIG_MAX-1:0];
wire [SIZE-1:0]      p_cycle [CYCLE_CONFIG_MAX-1:0];
wire [HALF_SIZE-1:0] u_cycle [CYCLE_CONFIG_MAX-1:0];

assign u[0][HALF_SIZE-1]   = (i_p[SIZE-1:SIZE-2] >= 2'b01);

assign p_cycle[0][SIZE-1:SIZE-2] = i_p[SIZE-1:SIZE-2] - 2'b01;
assign p_cycle[0][SIZE-3:0]      = i_p[SIZE-3:0];
assign u_cycle[0][HALF_SIZE-1]   = (i_p[SIZE-1:SIZE-2] >= 2'b01);


generate
genvar i, j;

for (i = 0; i < CYCLE; i = 1 + i) begin: loop_cycle
for (j = 0; j < FOR; j = 1 + j) begin: loop_logic
if((i*FOR+j)<= CYCLE_CONFIG_MAX-2)begin
    ipsxe_floating_point_register_v1_0 #(SIZE + HALF_SIZE) u_register(
        .i_clk(i_clk),
        .i_aclken(i_aclken),
        .i_rst_n(i_rst_n),
        .i_d({p_cycle[i*FOR+j], u_cycle[i*FOR+j]  }),
        .o_q({r_cycle[i*FOR+j], u_cycle[i*FOR+j+1]})
    );
    
    assign p_cycle[i*FOR+j+1][(SIZE-1-(i*FOR+j+2)*2+1)+:(i*FOR+j+4)] = u_cycle[i*FOR+j+1][HALF_SIZE-(i*FOR+j+1)] ? (r_cycle[i*FOR+j][SIZE-(i*FOR+j+1)-:(i*FOR+j+4)] - {1'b0, u_cycle[i*FOR+j+1][HALF_SIZE-1-:(i*FOR+j+1)], 2'b01}) : (r_cycle[i*FOR+j][SIZE-(i*FOR+j+1)-:(i*FOR+j+4)] + {1'b0, u_cycle[i*FOR+j+1][HALF_SIZE-1-:(i*FOR+j+1)], 2'b11});
    if (i*FOR+j < HALF_SIZE - 2)begin
        assign p_cycle[i*FOR+j+1][SIZE-1-(i*FOR+j+2)*2:0]            = r_cycle[i*FOR+j][SIZE-1-(i*FOR+j+2)*2:0];
    end
    assign u_cycle[i*FOR+j+1][HALF_SIZE-1-(i*FOR+j+1)]               = ~p_cycle[i*FOR+j+1][SIZE-(i*FOR+j+1)];
    assign u[i*FOR+j] = u_cycle[i*FOR+j];
end
else begin
end
end
end

if(REMAIN_LATENCY != 0)begin
    ipsxe_floating_point_distributed_shiftregister_wrapper_v1_0 #(REMAIN_LATENCY,HALF_SIZE) u_sr_output(
        .din(u[HALF_SIZE-1]),
        .clk(i_clk),
        .i_aclken(i_aclken),
        .rst(~i_areset_n),
        .dout(o_u)
    );
end
else begin
    assign o_u = u[HALF_SIZE-1];
end


endgenerate
endmodule

  • 写回答

2条回答 默认 最新

  • 吃不了席 2024-08-23 02:58
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的代码来看,你使用了两个嵌套的for循环来生成硬件模块。在这种情况下,你需要确保每个生成的硬件模块都有正确的连接和输入输出信号。在你的代码中,我发现了一些可能的问题:

    1. ipsxe_floating_point_register_v1_0实例化时,你没有为所有输入和输出信号提供连接。你需要确保所有的输入和输出信号都被正确地连接到相应的信号上。

    2. assign p_cycle[i*FOR+j+1][(SIZE-1-(i*FOR+j+2)*2+1)+:(i*FOR+j+4)]这一行,你可能遇到了位宽问题。你需要确保位宽是正确的,以避免综合错误。

    3. if(REMAIN_LATENCY != 0)begin这个条件语句中,你可能需要检查REMAIN_LATENCY的值是否正确。如果REMAIN_LATENCY为0,那么这个条件语句将不会执行,可能会导致输出信号o_u没有被正确赋值。

    为了解决这些问题,你可以尝试以下修改:

    1. 确保所有输入和输出信号都被正确地连接到相应的信号上。例如,你可以检查ipsxe_floating_point_register_v1_0实例化时的输入输出信号是否正确连接。

    2. 检查位宽是否正确。你可以使用$bits()函数来获取信号的位宽,并确保它们与预期的位宽相匹配。

    3. 检查REMAIN_LATENCY的值是否正确。如果REMAIN_LATENCY为0,那么你可能需要修改条件语句,以确保在所有情况下都能正确赋值给o_u

    希望这些建议能帮助你解决问题。如果问题仍然存在,建议你提供更多关于错误的详细信息,以便更好地诊断问题。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月23日
  • 创建了问题 8月23日

悬赏问题

  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线