作者gapuu (溝u)
看板Electronics
標題[問題] verilog array在always給值
時間Fri Nov 2 10:27:30 2018
各位先進好
我在寫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://webptt.com/m.aspx?n=bbs/Electronics/M.1541125656.A.535.html
1F:推 hank821017: 把x[cnt]後面的for全刪掉就行了 11/02 10:49
2F:→ gapuu: 請問這樣不會產生latch嗎 11/02 12:05
3F:推 hsucheng: for的意義是複製電路,迴圈請改用fsm 11/02 12:21
4F:→ hsucheng: 別把verilog當c寫 11/02 12:22
5F:→ hank821017: 印象中sequential這樣沒事 comb的才會出現latch 11/02 12:59
6F:→ gapuu: fsm還在熟悉中 比較習慣一個階段完成後再給另一個階段啟動 11/02 13:15
7F:→ gapuu: 號 感謝兩位的回答~ 11/02 13:16
8F:→ hsucheng: 一個階段完成之後做下一個,不就是fsm? 11/02 13:50
9F:→ hsucheng: 你的always 都是同時執行,這樣寫又何來另外啟動? 11/02 13:50
10F:→ hsucheng: verilog不能用你”習慣”的c語言寫 這是硬體 11/02 13:53
11F:推 st955272: !rst 11/02 18:36
12F:推 htps0763: 你可以試試再for迴圈裡寫if else,就會變成數個多工器, 11/03 11:14
13F:→ htps0763: for迴圈只能用來複製電路所以執行次數不能是動態的 11/03 11:14
14F:→ htps0763: 不過你這是循序,所以沒寫就會變成維持,組合電路就不 11/03 11:16
15F:→ htps0763: 行了 11/03 11:16
16F:推 bakerly: 針對你對合成latch的疑問,verilig always block 裡的訊 11/03 12:23
17F:→ bakerly: 號不寫預設就是維持,所以如果寫齊只是為了寫出自已給自 11/03 12:24
18F:→ bakerly: 己,那和預設是一樣的,不會影響到會不會合出latch. 11/03 12:24
19F:推 rbufghj9713: 負緣出發reset好像一定要if(!rst),原因我不太清楚 11/03 14:19
20F:推 bakerly: 因為負緣觸發,當負緣發生後進這個always執行,此時rst一 11/03 14:55
21F:→ bakerly: 定為0,你寫if(rst)永遠不會成立等於沒寫,所以一定會寫i 11/03 14:55
22F:→ bakerly: f(!rst)。話說原po這裡寫錯了,會沒有reset值。 11/03 14:55
23F:→ gapuu: 啊真的 謝謝提醒 11/03 17:41
※ 編輯: gapuu (223.140.80.59), 11/03/2018 17:42:15
24F:→ gapuu: 修正:rst -> !rst 11/03 17:43
25F:推 mmonkeyboyy: for loop不能用來動態增加元件 11/03 22:51
26F:→ mmonkeyboyy: 最多只能用來叫出已有元件 11/03 22:51
27F:→ mmonkeyboyy: 你每一行code 如果是可以被synthesize 都是有對應元 11/03 22:53
28F:→ mmonkeyboyy: 件 所以一般我都建議沒事不要用for 11/03 22:54
29F:推 mmonkeyboyy: incomplete assignment 在combinational才有latch 11/03 23:02
30F:→ mmonkeyboyy: 遇到可以用開頭default避掉(但也不建議) 11/03 23:03
31F:→ mmonkeyboyy: 一般都寧願多寫點廢code少出錯 11/03 23:03
32F:→ mmonkeyboyy: 在sequential裡 因為你本來就reg在維持了 所以可以 11/03 23:04
33F:→ mmonkeyboyy: 不用管 另一個小技是在sequential logic裡 11/03 23:05
34F:→ mmonkeyboyy: 一般 通常情況下 你只要寫你想變化的就好 11/03 23:05
35F:→ mmonkeyboyy: 雖然大家現在都用SV啦 但有些語法其實不太適合硬體 11/03 23:07
36F:→ mmonkeyboyy: 還是要有些區別 那些比較專屬verification用 11/03 23:07
37F:→ gapuu: 學長說sv大部份都是驗證在用.. 所以其實變主流了嗎 11/03 23:26
38F:推 mmonkeyboyy: 是subset superset的問題了 11/03 23:34
39F:→ hsucheng: 套有一位版友說的,用for不是高手就是新手 11/04 00:11
40F:推 mmonkeyboyy: 也沒這麼難懂 概念是需要把多行並一行的在用for 11/04 08:14
41F:推 star99: 你!reset 那裡少了一個end 那樣會有些合成問題 11/19 02:04