[問題] verilog array在always給值

看板Electronics作者 (溝u)時間7年前 (2018/11/02 10:27), 7年前編輯推噓12(12029)
留言41則, 9人參與, 7年前最新討論串1/1
各位先進好 我在寫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

11/02 10:49, 7年前 , 1F
把x[cnt]後面的for全刪掉就行了
11/02 10:49, 1F

11/02 12:05, 7年前 , 2F
請問這樣不會產生latch嗎
11/02 12:05, 2F

11/02 12:21, 7年前 , 3F
for的意義是複製電路,迴圈請改用fsm
11/02 12:21, 3F

11/02 12:22, 7年前 , 4F
別把verilog當c寫
11/02 12:22, 4F

11/02 12:59, 7年前 , 5F
印象中sequential這樣沒事 comb的才會出現latch
11/02 12:59, 5F

11/02 13:15, 7年前 , 6F
fsm還在熟悉中 比較習慣一個階段完成後再給另一個階段啟動
11/02 13:15, 6F

11/02 13:16, 7年前 , 7F
號 感謝兩位的回答~
11/02 13:16, 7F

11/02 13:50, 7年前 , 8F
一個階段完成之後做下一個,不就是fsm?
11/02 13:50, 8F

11/02 13:50, 7年前 , 9F
你的always 都是同時執行,這樣寫又何來另外啟動?
11/02 13:50, 9F

11/02 13:53, 7年前 , 10F
verilog不能用你”習慣”的c語言寫 這是硬體
11/02 13:53, 10F

11/02 18:36, 7年前 , 11F
!rst
11/02 18:36, 11F

11/03 11:14, 7年前 , 12F
你可以試試再for迴圈裡寫if else,就會變成數個多工器,
11/03 11:14, 12F

11/03 11:14, 7年前 , 13F
for迴圈只能用來複製電路所以執行次數不能是動態的
11/03 11:14, 13F

11/03 11:16, 7年前 , 14F
不過你這是循序,所以沒寫就會變成維持,組合電路就不
11/03 11:16, 14F

11/03 11:16, 7年前 , 15F
行了
11/03 11:16, 15F

11/03 12:23, 7年前 , 16F
針對你對合成latch的疑問,verilig always block 裡的訊
11/03 12:23, 16F

11/03 12:24, 7年前 , 17F
號不寫預設就是維持,所以如果寫齊只是為了寫出自已給自
11/03 12:24, 17F

11/03 12:24, 7年前 , 18F
己,那和預設是一樣的,不會影響到會不會合出latch.
11/03 12:24, 18F

11/03 14:19, 7年前 , 19F
負緣出發reset好像一定要if(!rst),原因我不太清楚
11/03 14:19, 19F

11/03 14:55, 7年前 , 20F
因為負緣觸發,當負緣發生後進這個always執行,此時rst一
11/03 14:55, 20F

11/03 14:55, 7年前 , 21F
定為0,你寫if(rst)永遠不會成立等於沒寫,所以一定會寫i
11/03 14:55, 21F

11/03 14:55, 7年前 , 22F
f(!rst)。話說原po這裡寫錯了,會沒有reset值。
11/03 14:55, 22F

11/03 17:41, 7年前 , 23F
啊真的 謝謝提醒
11/03 17:41, 23F
※ 編輯: gapuu (223.140.80.59), 11/03/2018 17:42:15

11/03 17:43, 7年前 , 24F
修正:rst -> !rst
11/03 17:43, 24F

11/03 22:51, 7年前 , 25F
for loop不能用來動態增加元件
11/03 22:51, 25F

11/03 22:51, 7年前 , 26F
最多只能用來叫出已有元件
11/03 22:51, 26F

11/03 22:53, 7年前 , 27F
你每一行code 如果是可以被synthesize 都是有對應元
11/03 22:53, 27F

11/03 22:54, 7年前 , 28F
件 所以一般我都建議沒事不要用for
11/03 22:54, 28F

11/03 23:02, 7年前 , 29F
incomplete assignment 在combinational才有latch
11/03 23:02, 29F

11/03 23:03, 7年前 , 30F
遇到可以用開頭default避掉(但也不建議)
11/03 23:03, 30F

11/03 23:03, 7年前 , 31F
一般都寧願多寫點廢code少出錯
11/03 23:03, 31F

11/03 23:04, 7年前 , 32F
在sequential裡 因為你本來就reg在維持了 所以可以
11/03 23:04, 32F

11/03 23:05, 7年前 , 33F
不用管 另一個小技是在sequential logic裡
11/03 23:05, 33F

11/03 23:05, 7年前 , 34F
一般 通常情況下 你只要寫你想變化的就好
11/03 23:05, 34F

11/03 23:07, 7年前 , 35F
雖然大家現在都用SV啦 但有些語法其實不太適合硬體
11/03 23:07, 35F

11/03 23:07, 7年前 , 36F
還是要有些區別 那些比較專屬verification用
11/03 23:07, 36F

11/03 23:26, 7年前 , 37F
學長說sv大部份都是驗證在用.. 所以其實變主流了嗎
11/03 23:26, 37F

11/03 23:34, 7年前 , 38F
是subset superset的問題了
11/03 23:34, 38F

11/04 00:11, 7年前 , 39F
套有一位版友說的,用for不是高手就是新手
11/04 00:11, 39F

11/04 08:14, 7年前 , 40F
也沒這麼難懂 概念是需要把多行並一行的在用for
11/04 08:14, 40F

11/19 02:04, 7年前 , 41F
你!reset 那裡少了一個end 那樣會有些合成問題
11/19 02:04, 41F
文章代碼(AID): #1RsxOOKr (Electronics)