看板 Electronics 關於我們 聯絡資訊
各位先進好 我在寫verilog想在always裡給值遇到了問題 例如 reg [3:0] x [3:0]; reg [1:0] cnt; integer i; always@(posedge clk, negedge rst) begin if (!rst) cnt <= 0; else cnt <= cnt+1; end always@(posedge clk, negedge rst) begin if (rst) begin for (i=0;i<4;i=i+1) x[i] <= 0; end else begin x[cnt] <= 1; for (i=0;i<cnt;i=i+1) x[i] <= x[i]; for (i=cnt+1;i<4;i=i+1) x[i] <= x[i]; end end 但是雖然rtl可過 dc出現error:for迴圈變數初始值不能為變數 請問這種根據cnt而選擇哪個x 但是又必須給予其他x不變的資訊 要如何做到呢 謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.77.123 ※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1541125656.A.535.html
hank821017: 把x[cnt]後面的for全刪掉就行了 11/02 10:49
gapuu: 請問這樣不會產生latch嗎 11/02 12:05
hsucheng: for的意義是複製電路,迴圈請改用fsm 11/02 12:21
hsucheng: 別把verilog當c寫 11/02 12:22
hank821017: 印象中sequential這樣沒事 comb的才會出現latch 11/02 12:59
gapuu: fsm還在熟悉中 比較習慣一個階段完成後再給另一個階段啟動 11/02 13:15
gapuu: 號 感謝兩位的回答~ 11/02 13:16
hsucheng: 一個階段完成之後做下一個,不就是fsm? 11/02 13:50
hsucheng: 你的always 都是同時執行,這樣寫又何來另外啟動? 11/02 13:50
hsucheng: verilog不能用你”習慣”的c語言寫 這是硬體 11/02 13:53
st955272: !rst 11/02 18:36
htps0763: 你可以試試再for迴圈裡寫if else,就會變成數個多工器, 11/03 11:14
htps0763: for迴圈只能用來複製電路所以執行次數不能是動態的 11/03 11:14
htps0763: 不過你這是循序,所以沒寫就會變成維持,組合電路就不 11/03 11:16
htps0763: 行了 11/03 11:16
bakerly: 針對你對合成latch的疑問,verilig always block 裡的訊 11/03 12:23
bakerly: 號不寫預設就是維持,所以如果寫齊只是為了寫出自已給自 11/03 12:24
bakerly: 己,那和預設是一樣的,不會影響到會不會合出latch. 11/03 12:24
rbufghj9713: 負緣出發reset好像一定要if(!rst),原因我不太清楚 11/03 14:19
bakerly: 因為負緣觸發,當負緣發生後進這個always執行,此時rst一 11/03 14:55
bakerly: 定為0,你寫if(rst)永遠不會成立等於沒寫,所以一定會寫i 11/03 14:55
bakerly: f(!rst)。話說原po這裡寫錯了,會沒有reset值。 11/03 14:55
gapuu: 啊真的 謝謝提醒 11/03 17:41
※ 編輯: gapuu (223.140.80.59), 11/03/2018 17:42:15
gapuu: 修正:rst -> !rst 11/03 17:43
mmonkeyboyy: for loop不能用來動態增加元件 11/03 22:51
mmonkeyboyy: 最多只能用來叫出已有元件 11/03 22:51
mmonkeyboyy: 你每一行code 如果是可以被synthesize 都是有對應元 11/03 22:53
mmonkeyboyy: 件 所以一般我都建議沒事不要用for 11/03 22:54
mmonkeyboyy: incomplete assignment 在combinational才有latch 11/03 23:02
mmonkeyboyy: 遇到可以用開頭default避掉(但也不建議) 11/03 23:03
mmonkeyboyy: 一般都寧願多寫點廢code少出錯 11/03 23:03
mmonkeyboyy: 在sequential裡 因為你本來就reg在維持了 所以可以 11/03 23:04
mmonkeyboyy: 不用管 另一個小技是在sequential logic裡 11/03 23:05
mmonkeyboyy: 一般 通常情況下 你只要寫你想變化的就好 11/03 23:05
mmonkeyboyy: 雖然大家現在都用SV啦 但有些語法其實不太適合硬體 11/03 23:07
mmonkeyboyy: 還是要有些區別 那些比較專屬verification用 11/03 23:07
gapuu: 學長說sv大部份都是驗證在用.. 所以其實變主流了嗎 11/03 23:26
mmonkeyboyy: 是subset superset的問題了 11/03 23:34
hsucheng: 套有一位版友說的,用for不是高手就是新手 11/04 00:11
mmonkeyboyy: 也沒這麼難懂 概念是需要把多行並一行的在用for 11/04 08:14
star99: 你!reset 那裡少了一個end 那樣會有些合成問題 11/19 02:04