[爆卦]verilog教學是什麼?優點缺點精華區懶人包

為什麼這篇verilog教學鄉民發文收入到精華區:因為在verilog教學這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者Zephyr750 (紅蓮西風750)看板Electronics標題[心得] verilog c...



先說我不是高手!但是在verilog中略有心得
PTT的C_CPP版得知Programing版
在Programing版討論HDL串中發現此版
小小的瀏覽一下發現對於verilog有很多討論

就想在此與版友分享

----------------癈話完畢--------------------

Verilog Code是硬體,寫出來的就是元件(不只是語法)
所以,新手要練到
1.在寫的同時,可以知道自己寫的是什麼元件
2.在合成的同時,可以知道合成出來的檔是什麼
是一件很重要的事


先來說第一件事
「在寫的同時,可以知道自己寫的是什麼元件」

要對於語法與元件的意義了解到某種程度,才可以掌握得很好

那語法要怎麼了解呢?(此篇先討論這件事吧?!)


HDL大致上分成兩種電路
1.有clk
2.無clk

學術上(或業界)使用的詞很多!像Gate level、RTL...來分類電路
在此盡可能不要提這些專有名詞(因為我也搞不太懂)

「有clk」的電路屬於「受時間控制」的電路
也就是 觸發時 輸入是什麼,輸出才是什麼,花的時間以clk數(全波)計算

例如:
在Verilog中
always@(posedge clk) 表示 在clk正緣觸發時,以下電路動一次

always以下描述的電路隨clk的正緣變化才存在(動作)!
輸入是什麼東西,變化了幾次,都不存在(動作或影響)...
這也是最常見的寫法

還有「<=」的語法
「<=」代表不等待上一行回應,完成馬上執行
(這觀念是老師教的,我自己還沒有很懂!但老師的確是這樣講的沒錯)
我自己的理解是「觸發同時執行」(相同時間,也就是隨時間控制)

所以「<=」會放在「always@(正緣或負緣 clk)」的裡面。

還有「reg」的語法
在特定時間時,才更新內容的電路元件
不然儲存的內容不變(儲存功能就這樣出現了)

所以「reg」會放在「<=」的左邊,因為要更新資訊。



「無clk」的電路屬於「不受時間控制」的電路
: -也就是輸入是什麼,輸出馬上就是什麼,花的時間以gate count計算
+也就是輸入是什麼,輸出馬上就是什麼,花的時間以gate delay計算 //bakerly更正

例如:
在Verilog中
assign ...

assign後面描述的電路為永久存在!
只要輸入變化,輸出也就會馬上變化
(因為沒有時間條限制電路的存在性)

同義寫法為(個人不常這麼寫,不過很多assign可以用這個取代)
always@* 或 always@(a, b, c, ...)(沒有正負緣)

還有「=」的語法
「=」代表等待上一行回應後,再執行
(這觀念是老師教的,我自己還沒有很懂!但老師的確是這樣講的沒錯)
就是不隨時間影響,永久存在的電路(接線之類的)
所以「=」會放在always@(正緣或負緣 clk)外面

還有「wire」的語法
字面上是線,但是它代表永久存在的資料空間,只要輸入改變輸出就改變
(所以,不拿來用在儲存資料)常用在元件之間的立即傳遞資料

這種電路速度極快!不用等clk完成全波,馬上就可以做很多動作(只要輸入一直變)
但是容易失控


----------------------------------------------------------------
接下來講常見句子

先說無clk的

assign a = (c > 10) ? b : b+1;

(c > 10)?
也就是
if(c > 10)(這種寫法在有clk的比較常見,只差在一個DFF)

代表一個方塊,裡面很多邏輯閘,在條件成立時輸出為hi(1bit的訊號輸出)
這個方塊已經在synthesis時最佳化(用數位邏輯教的方法)

輸出的線接給一個2to1的選擇器

輸入都算好了 b, b+1,輸出就等選擇的線決定誰要輸出

assign a = b + c;
assign a = b;
assign a = ....

剩下的我想不用我多說了!多練習就可以看懂複雜的Gate level電路了!



再說有clk的電路

always@(posedge clk)
代表以下電路都有接clk這條線,並且是正緣觸發(沒有小圓圈)

+---- +----
clk | clk |
----|> ----o|>
| |
+---- +----
正緣 負緣


always@(poedge clk, negedge rst)
begin
if(!rst) → 在此一定要使用!,而且上面的negedge rst一定要寫
...
end

有寫 negedge rst 電路不會把

if(!rst) //若rst負緣觸發
當作是
if(rst == 0) //若rst低準位

if(~rst) //若rst低準位

在有clk影響的電路將clk和rst設定好之後,就看見以下的語法(常用語法)
(因大多數電路都是用DFF組成,
所以rst通常都會設定,不過也有不用的時候!)

always@(posedge clk, negedge rst) //正負緣看需求訂定
begin
if(!rst)
begin
....(初始化設定)
end
else
begin
....(電路function)
end
end


以上,應該可以應付很多新手觀念上模糊的問題了!
之後只要依一開始講的方向去做,合成完看RTL、synthesis report的時間估計
以及檔案之間的變化,慢慢的就可以成為高手了!
而合成的過程也可以在coding時掌握住!也就有寫元件的感覺了....
在那時,如果有人問你,你可以說「我不是高手!不過略懂..」
跟別人分享心得,互相成長!



--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.80.140.211
pachingoo:推 04/17 18:48
xwxw:推 04/17 20:02
robertshih:"="與"<="的涵意很深 如果做到synthesis就看得出差異了 04/17 20:25
pupucar:不使用專有名詞而喜歡用自己的語言 等你出來工作就知道死 04/17 20:45
pupucar:除非你天縱英才 可以一人搞定專案 都不用cowork的 04/17 20:47
Zephyr750:樓上!只是本篇不用!不代表一輩子不用....XD 04/17 20:53
echw:推!! 不過很多東西還是自己摸過才知道 04/17 21:25
echw:像前面有人說的 "=" 和 "<=" 不完全是原PO所解釋得如此 04/17 21:26
echw:比較簡單的用法裡面 "="可以用在你像是寫"c語言"那樣用 04/17 21:28
echw:初學者通常會在"="和"<="有疑問 是因為寫道"always" 04/17 21:30
echw:always裡面的描述 可以類似電路化的思考 用"<=" 04/17 21:32
echw:或者"c語言"的方法 用"=" 這是比較基礎的概念 04/17 21:32
Zephyr750:我個人不推薦把c語言和HDL語言拿來比較或介紹觀念... 04/17 21:41
Zephyr750:我改一下好了! 04/17 21:42
※ 編輯: Zephyr750 來自: 114.33.224.25 (04/17 21:45)
※ 編輯: Zephyr750 來自: 114.33.224.25 (04/17 21:46)
Zephyr750:好像愈改愈看不懂!^^" 04/17 21:47
echw:已經寫得很好了XDD 04/17 21:55
maxwellee:推推推 04/18 02:24
luckyBF:推一下 04/18 07:39
masage0514:大大 我想請問 !rst跟~rst難道不一樣嗎?差在哪?謝謝 04/20 12:48
uxijgil:reg不一定是受時間控制的 ex: reg a; always @(*) a = b; 04/20 21:35
uxijgil:!(2'b10) = 1'b0 ; ~(2'b10) = 2'b01 ; 對單訊號則沒差 04/20 21:37
Zephyr750:~所有bit反向, ! 1'b1(最小的bit)反向 04/20 23:20
Zephyr750:!(2'b10) = ~(1'b0) = 1'b1 好像是這樣才對 04/20 23:23
※ 編輯: Zephyr750 來自: 114.33.224.25 (04/21 00:02)
Pash77:錯 !2'b10 = ~(2'b10==0) = ~0 = 1 不然你用 !2'b01 就知 04/21 06:42
Pash77:我也寫錯! 是 !=0 才對 04/21 06:43
Pash77:!rst = !(rst!=0) 所以 rst=0 時 !(0!=0)=!0=1 04/21 06:46
Pash77:這個全華中譯本應該有吧? 04/21 06:48
pikachu2005:推~+1 04/21 13:55
potatojerry: ~: bitwise, ! : logical 04/22 23:09
bakerly:gate count是面積單位,不是時間單位, wire真的就是線 04/23 22:08
※ 編輯: Zephyr750 來自: 59.120.98.226 (11/14 11:23)
tj0706: 推推 04/07 11:34
sneak: !(2'b10) = https://muxiv.com 08/13 19:11
sneak: 不使用專有名詞而喜歡用 https://daxiv.com 09/17 23:05

你可能也想看看

搜尋相關網站