[問題] verilog這種寫法會造成latch嗎?

看板Electronics作者 (好gy銀行)時間12年前 (2013/08/09 21:11), 編輯推噓0(006)
留言6則, 4人參與, 最新討論串1/1
不知道是不是下面這段code問題 if(mapsize==0)begin // 8*8->4*4 location<=location+18; mapsize<=1; end else if(mapsize==1)begin //4*4->2*2 location<=location+9; mapsize<=2; end else mapsize<=2; //2*2 在合成電路時他說我的mapsize被合成latch.. 在來是以下這段 (看state來決定接下來做甚麼動作) else if(c_state==STAND_BY)begin cen <= 1; OUT_VALID <= 0; flag_rotate<=0; end else if(c_state==Input)begin wen <= 0; if(IN_VALID==1)begin cen<= 0; IN_A<=IN; addrA<=count_in; R[count_in]<=IN; //rotate use end else if(count_in==64)begin cen<= 1; OUT_VALID<=1; OUT<= 0; wen<=1; end else; end //end input else if(c_state==Output)begin cen<=0;wen<=1;counter<=counter+1; if(mapsize==0)begin if (flag_rotate==1)begin cen<=0; wen<=0; IN_A<=R[count_out]; addrA<=count_out; OUT_VALID<=1; OUT<=R[count_out]; end else addrA<=count_out; end //8*8output end else if(mapsize==1) addrA<=location+count_out; else if(mapsize==2) addrA<=location+count_out; else; if(flag_rotate==0)begin if(counter>=2)begin //為了SRAM的delay 多等2clk OUT_VALID <= 1; OUT <= outA; end else; end else; end //end output else; 在合成電路時他說c_state變latch... 想請問是甚麼原因 有google查了一下 if else if else條件都有寫滿... 然後還有變數都有設定了 想求救一下版上verilog神手... 如果有需要完整版的code 小弟會馬上附上 謝謝.. 小弟快被latch搞瘋了... 才第三次寫verilog... 快崩潰了T_T... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.235.83

08/10 00:02, , 1F
我覺得是在else中location必須保持原本值 所以有latch
08/10 00:02, 1F

08/10 23:13, , 2F
拿去Quartus合完,看RTL view就知道啦
08/10 23:13, 2F

08/10 23:41, , 3F
小弟在試試看~
08/10 23:41, 3F
小弟已經把latch給用好了~ 是在另一段code有問題 簡單舉例 if(a==1)begin b<=0; c<=0; end else begin b<=1; c<=0; end 就是任何變數在每個if else if else都要寫滿 至於w大說的 location<=location為何沒寫不會形成latch 就不知道了 有查了一下版上說寫了反而有latch? combo loop 的 這部分還請教其他的大大~ 謝謝~~ ※ 編輯: Goodgybank 來自: 210.64.163.158 (08/11 09:05)

08/11 16:00, , 4F
location那可能是因為edge trigger吧 所以出來是原來的DFF
08/11 16:00, 4F

08/11 16:01, , 5F
有時沒寫清楚時 HDL comipler會用他的演算法去判斷
08/11 16:01, 5F

08/11 16:02, , 6F
程式跑出來的結果是不是你原本的意思就又是另一回事了
08/11 16:02, 6F
文章代碼(AID): #1I1Eg0VE (Electronics)