Altera_Forum
Honored Contributor
13 years agocoding style: about Inferred latch for xxx at x.v
I use a ping-pong buffer which has 32 bytes length to cache incoming command, and each command length is 16 bytes.
The frequency of command shift in is faster than core frequency, due to serial transfer requirement. The core takes WEIGHT_WEN with 1/8 frequency of each command byte ready. and the command is 16 bytes long, that makes at least two or more times of execution of the ready command at opposite side, and that's fine. It works very well on DE0 FPGA. But, I still need to figure out what cased this and how to clean this msg. I have tried my best to fill up all if else condition, but the msg still there. Latch is not my design, and it leads to lower coverage when we use scan chain at digital tape-out flow. any ideas? thanks for your help :) Currently, I have set dont use all latch cell in synopsys DC, but I don't know if this will cause function mismatch prob. Info (10041): Inferred latch for "WEIGHT_WEN[0]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[1]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[2]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[3]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[4]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[5]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[6]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[7]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[8]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[9]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[10]" at CHIP.v(528) Info (10041): Inferred latch for "WEIGHT_WEN[11]" at CHIP.v(528) --- Quote Start --- reg [7:0] RX_CMD [0:31]; // for two command reg [4:0] RX_CMD_COUNTER; // for two command always@(posedge FAST_CLK) if(RxD_data_ready) RX_READY_COUNTER<=RX_READY_COUNTER+1; always @ (*) begin if(CMD_TYPE==6'b0000_01 && CMD_W!=0) begin //weight PAT if(CMD_W==2'b01) begin //W2 if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b00) begin //bank 0 WEIGHT_WEN=12'b1110_1111_1111; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b01) begin //bank 1 WEIGHT_WEN=12'b1101_1111_1111; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b10) begin //bank 2 WEIGHT_WEN=12'b1011_1111_1111; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b11) begin //bank 3 WEIGHT_WEN=12'b0111_1111_1111; end end else if(CMD_W==2'b10) begin //W3 if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b00) begin //bank 0 WEIGHT_WEN=12'b1111_1110_1111; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b01) begin //bank 1 WEIGHT_WEN=12'b1111_1101_1111; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b10) begin //bank 2 WEIGHT_WEN=12'b1111_1011_1111; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b11) begin //bank 3 WEIGHT_WEN=12'b1111_0111_1111; end end else if(CMD_W==2'b11) begin //W4 if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b00) begin //bank 0 WEIGHT_WEN=12'b1111_1111_1110; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b01) begin //bank 1 WEIGHT_WEN=12'b1111_1111_1101; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b10) begin //bank 2 WEIGHT_WEN=12'b1111_1111_1011; end else if(RX_CMD[{~RX_CMD_COUNTER[4],4'b0001}][6:5]==2'b11) begin //bank 3 WEIGHT_WEN=12'b1111_1111_0111; end end else if(CMD_W==2'b00) begin //00 WEIGHT_WEN=12'b1111_1111_1111; end end else WEIGHT_WEN=12'b1111_1111_1111; end --- Quote End ---