在进行比特流传输时,我遇到了大约 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
感谢 Sharvian,这里的问题是您无法为其自身分配网络。例如,如果您尝试分配 a = (input_valid) 之类的操作?乙:甲;, 它将导致错误“组合循环警报:1 个 LUT 单元形成组合循环”。