Vivado verilog 1 LUT 单元形成组合循环

问题描述 投票:0回答:1

在进行比特流传输时,我遇到了大约 100 个与组合循环相关的错误。 导致这些错误的信号是 addr_121f、addr_store_1_f 和 addr_store_2_f。 我很难理解为什么我的代码会导致这些组合循环错误。

代码说明: addr_store_1_f存储的是jump_1触发时addr_121f的值,jump_1依赖于addr_store_1_f和其他值。同样,addr_store_2_f 和 addr_122f 具有相同的用途,但没有与“addr_122f”相关的错误。

//simplify the assignment code below:
//assign jump_1= (some signals)?(addr_121s == addr_store_1_f + some value)
//assign jump_2= (some signals)?(addr_122s == addr_store_2_f + some value)
assign input_last_addr_1 = addr_store_1_f + addr_temp_cal_2;
assign input_last_addr_2 = addr_store_2_f + addr_temp_cal_2;                                                                   
assign last_addr_1 = (ram_cs == READ_FROM_S) ? addr_store_1_s + addr_temp_cal_1 : (ram_cs == READ_FROM_F) ? addr_store_1_f + addr_temp_cal_1 : input_last_addr_1;
assign last_addr_2 = (ram_cs == READ_FROM_S) ? addr_store_2_s + addr_temp_cal_1 : (ram_cs == READ_FROM_F) ? addr_store_2_f + addr_temp_cal_1 : input_last_addr_2;
assign jump_1= (conv_start) ? (ram_1_w_sd)? (ram_cs == READ_FROM_S) ? (addr_121s == last_addr_1):(addr_121f == last_addr_1) : 0 : 0;
assign jump_2= (conv_start) ? (ram_2_w_sd)? (ram_cs == READ_FROM_S) ? (addr_122s == last_addr_2):(addr_122f == last_addr_2) : 0 : 0;
assign addr_f_r_stop =  !(cs==FIRST_ROW_SD && ram_1_w_sd && ram_cs == READ_FROM_SD);
/////////////////////////////////////////////////////////////////////////
always@(posedge clk)begin//conv_b reading input from ram1
    if( ram_cs==CLEAR_STATE || ram_cs==SD_TO_F || ram_cs==F_TO_F || ram_cs==F_TO_S || ram_cs == TO_OUT)begin//change 1 is one clk before READ_FROM_F 
        addr_1f_r <= 1;
        addr_2f_r <= 0;
        addr_store_1_f <= 0;
        addr_store_2_f <= 0;
    end
    else if(ram_cs!= READ_FROM_S  )begin //input valid high indicates that the conv_cell will take value and the input is valid to store
        if( addr_f_r_stop && conv_start && input_valid)begin
                    if(ram_1_jump)
                    addr_2f_r <= addr_2f_r + 1;
                    if(ram_2_jump)
                    addr_1f_r <= addr_1f_r + 1;
        end
        if(jump_1)begin
            addr_store_1_f <= addr_121f +1;
        end
        if(jump_2)begin
            addr_store_2_f <= addr_122f +1;
        end
        
        
    end
end
////////////////////////////////////////////////
assign addr_121f = (conv_start) ? ( wen_121f ) ? addr_121f_w : (input_valid) ?  addr_1f_r : addr_121f : 0;
////////////////////////////////////////////////////

错误信息示例: 错误:[DRC LUTLP-1] 组合循环警报:1 个 LUT 单元形成组合循环。这可能会产生竞争条件。时序分析可能不准确。首选解决方案是修改设计以删除组合逻辑循环。如果已知并理解循环,则可以通过确认条件并对循环中的任一网络设置以下 XDC 约束来绕过此 DRC:“set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets ]”。循环中的一个网络是 design_1_i/e_top_0/inst/conv_top_1/addr_store_2_f[28]_i_9_n_0。请评估您的设计。循环中的单元格为:design_1_i/e_top_0/inst/conv_top_1/addr_store_2_f[28]_i_9。

verilog hdl vivado soc
1个回答
0
投票

感谢 Sharvian,这里的问题是您无法为其自身分配网络。例如,如果您尝试分配 a = (input_valid) 之类的操作?乙:甲;, 它将导致错误“组合循环警报:1 个 LUT 单元形成组合循环”。

© www.soinside.com 2019 - 2024. All rights reserved.