[爆卦]Verilog 不可合成是什麼?優點缺點精華區懶人包

為什麼這篇Verilog 不可合成鄉民發文收入到精華區:因為在Verilog 不可合成這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者eecheng87 (EEcheng)看板Electronics標題[問題] verilog 合...


各位前輩好,雖然我已經寫了 verilog 幾個學期了,但是以前都是用 modelsim 跑測資
檔。殊不知,這學期開始要用 quartus ii 合成,才發現原來我一直都是帶著錯誤觀念寫
錯的程式。

目前我遇到的問題是,在 modelsim 能編譯過,而且測資檔也能過。拿到 quartus 合成
的時候,也成功,但是噴一堆警告。然後如果不理會警告,把生成的 .vo 和 .sdo 再那
去 modelsim 跑測資發現輸出都是 xxxxxx。所以我想應該是合成出錯的東西了。

希望各位前輩如果有空的話,稍微幫我看一下我的 verilog 哪裡有嚴重的疏失。以下是
8 bit 的無號除法器,用組合電路寫的。(附上排版比較好的連結
https://ideone.com/PITrCL)

程式碼:

`timescale 1ns / 10ps
module div(out, in1, in2, dbz); parameter width = 8;
input [width-1:0] in1; // Dividend
input [width-1:0] in2; // Divisor
output reg [width-1:0] out; // Quotient
output reg dbz;
reg [3:0] it;
reg [width * 2 - 1:0] dividen;
reg [width * 2 - 1:0] diviser[8:0];
reg [width - 1:0] q;
reg res1, res2, res3;
initial begin
res1 = 0;
res2 = 0;
res3 = 0;
it = 0;
end always@(in1 or in2)begin
if(!{in2,{width{1'b0}}})begin
dbz = 1;
end else if(!{{width{1'b0}},in1}) begin
dbz = 0;
end else begin
dbz = 0;
res1 = ~res1;
end
end
always@(res3 or res1)begin
if(it == 0)begin
diviser[0] = {in2,{width{1'b0}}};
dividen = {{width{1'b0}},in1};
end else begin
diviser[0] = diviser[0];
dividen = dividen;
end if(it < 9)begin
if(!dividen && !it)begin
out = 0;
end else if(dividen >= diviser[it])begin
dividen = dividen - diviser[it];
q[width - it] = 1;
diviser[it + 1] = diviser[it]>>1;
res2 = ~res2;
end else begin q[width - it] = 0;
diviser[it + 1] = diviser[it]>>1;
res2 = ~res2;
end end else begin out = q;
res2 = ~res2;
end
end
always@(res2)begin
#1 if(it==9)begin it = 0;
res3 = res3;
end else begin
it = it + 1'b1;
res3 = ~res3;
end end endmodule

演算法主要是除數和被除數相比,來決定商是0或1,每次商左移一格,除數右移一格。It
紀錄移動的次數,最多八次。

稍後我在留言附上我在 quartus 合成的警告,我有查過相似的狀況,但改了之後警告都
沒少。
我嘗試過的改動:
1. if else 沒寫滿,可能產生 latch
2. if 出現的變數在 else 也要出現


現在這裡謝謝各位的幫忙。

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.164.116.170 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1585848827.A.307.html
eecheng87: https://i.imgur.com/7C5EGK7.jpg04/03 01:35
eecheng87: https://i.imgur.com/jgyYqYB.jpg04/03 01:35
eecheng87: https://i.imgur.com/bPRPq9m.jpg04/03 01:36
※ 編輯: eecheng87 (218.164.116.170 臺灣), 04/03/2020 01:36:23
※ 編輯: eecheng87 (218.164.116.170 臺灣), 04/03/2020 01:37:06
zace15: 你寫的不是RTL,合成是合不出initial的 04/03 03:00
bakerly: 1.initial是不可合成的. 2.always寫combination logic時i 04/03 08:04
bakerly: nput沒寫在sensitive list裡就會合出latch。 3.這個電路 04/03 08:04
bakerly: 沒看到clk,看來是純組合邏輯組成的,又有timing loop, 04/03 08:04
bakerly: 就算真合的出來了應該也會跑錯吧。 04/03 08:04
eecheng87: rtl code 如果沒有送 reset 訊號進來,那有辦法初始化 04/03 09:12
eecheng87: 嗎? 04/03 09:12
eecheng87: 另外一個問題是,組合電路沒辦法寫成 timing loop 嗎? 04/03 09:14
eecheng87: 只能老實的把所有狀況寫出來? 04/03 09:14
r901042004: 1. 組合電路不需要reset 2. 不能有timing loop 04/03 09:30
r901042004: 像是你res1 = ~res1就是loop了 04/03 09:31
r901042004: sensitive list想偷懶的話寫*比較不會出錯 04/03 09:31
r901042004: 在組合電路的if和case務必要寫滿 04/03 09:34
tkhan: 這種問題google就有了,先學會google吧.. 04/03 10:45
tkhan: 智商不夠的,建立先看別人怎麼寫code,不然容易走歪.. 04/03 10:47
eecheng87: 有建議的地方可以看別人的code嗎? 04/03 11:02
tkhan: google verilog 除法器............................ 04/03 11:06
bakerly: 組合邏輯沒有reset,你能想像的出來inverter的reset是什 04/03 22:07
bakerly: 麼嗎?而timing loop正常情況下是不應該存在的東西,比如 04/03 22:07
bakerly: 你把一個inverter的輸出接到它自己的輸入,這就是一條tim 04/03 22:07
bakerly: ing loop,這時你畫的出這個inverter的波形嗎? 04/03 22:07
arron860306: 寫的時候可以想像對應的電路大概長怎樣 04/07 00:20
cyl61123: 我看不出來這有寫幾個學期的水平... 老師是不是教得怪怪 04/09 16:12
cyl61123: ? 大一邏輯設計就會說initial不能用在RTL裡了,只是不 04/09 16:12
cyl61123: 會解釋原因 04/09 16:12
cyl61123: 手邊有verilog manual的話先k一下再開打吧 ,不然synthe 04/09 16:12
cyl61123: sis會warning吃到飽 04/09 16:12
johnpisces2: 看到initial就看不下去了 04/11 01:20
exezx: 先把數學式寫出來 再用verilog實作數學式 04/11 10:31

你可能也想看看

搜尋相關網站