[笔记][原创]Verilog HDL语法分析笔记
生活随笔
收集整理的這篇文章主要介紹了
[笔记][原创]Verilog HDL语法分析笔记
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
?????這篇帖子用于記錄學(xué)習(xí)Verilog過(guò)程中的一些syntax的問(wèn)題,會(huì)不斷更新,有不正確的地方請(qǐng)各位幫忙指正:D 一.Verilog 語(yǔ)法中的可綜合性 Verilog HDL 真的很強(qiáng)大,如果程序只用于仿真,那么幾乎所有的語(yǔ)法和編程語(yǔ)句都可以使用。但如果程序是用于硬件實(shí)現(xiàn),那么我們就必須保證程序的可綜合性,即所編寫的程序能被綜合器 轉(zhuǎn)化為相應(yīng)的電路結(jié)構(gòu)。不可綜合的HDL語(yǔ)句在用綜合工具綜合時(shí)將被忽略或者報(bào)錯(cuò)。作為設(shè)計(jì)者,應(yīng)該對(duì)可綜合模型的結(jié)構(gòu)有所了解。 雖然不同的綜合工具對(duì)Verilog HDL語(yǔ)法結(jié)構(gòu)的支持不盡相同,但Verilog HDL中某些典型的結(jié)構(gòu)是很明確地被所有綜合工具支持或不支持的。 (1)所有綜合工具都支持的結(jié)構(gòu): always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for, function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout, input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有綜合工具都不支持的結(jié)構(gòu):time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的結(jié)構(gòu):casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat, task,while。 看到一些資料上說(shuō)其實(shí)Verilog HDL的產(chǎn)生是為了寫testbench,而編程設(shè)計(jì)只用到了其中的很少的部分。Verilog有人說(shuō)很好學(xué),很容易入手,但是我覺(jué)得僅僅入手是沒(méi)有用的,充其量就雞肋一根,一定要仔細(xì)深入研究語(yǔ)法和結(jié)構(gòu),這樣才能寫出高效率的代碼,否則基本的代碼一塌糊涂的話后面的功能仿真,時(shí)序仿真都是浮云。 | | 二.避免鎖存器 在 always 塊的 if..else 語(yǔ)句中如果所列的條件不完整,綜合時(shí)則會(huì)產(chǎn)生鎖存器。 example: always @(action)? if(action)? out1 <= 1'b1;
沒(méi)有考慮到 !action 的情況,默認(rèn)out1保持不變,這就產(chǎn)生了鎖存器。 優(yōu)化方法:1.列出 !action 的情況,2.對(duì)out1賦初始值 1.always @(action)
? if(action)? out1 <= 1'b1; else??? out1 <= 1'b0; | 2.always @(action)? begin out <= 1'b0; if(action)? out1 <= 1'b1; end 但是,在描述時(shí)序邏輯的時(shí)候,也通常利用 if 語(yǔ)句的隱式條件對(duì)帶時(shí)鐘使能的 D 觸發(fā)器建模 example: always@(posedge clk, negedge rst_n)? begin if(!rst_n)? sum <= 0; else if(EN)? sum <= a+b; 表示在時(shí)鐘正沿來(lái)臨時(shí),如果 EN 為 1 ,則將 a+b 的值賦給 sum, 言下之意是如果 EN 為 0, 那么 sum 保持原值不變。這里綜合工具會(huì)把代碼綜合成一個(gè)帶時(shí)鐘使能的 D 觸發(fā)器。 三.產(chǎn)生占空比不等于50%的波形 (狀態(tài)機(jī)的巧用) 在面試的時(shí)候常常看到一些對(duì)verilog用得不熟的同學(xué),在被要求寫出可綜合的RTL代碼并產(chǎn)生占空比不同的輸出脈沖時(shí),選擇用很多計(jì)數(shù)器來(lái)對(duì)輸入的脈沖進(jìn)行計(jì)數(shù),而且還分別對(duì)輸入脈沖的上升沿和下降沿進(jìn)行計(jì)數(shù),非常的糟糕,因?yàn)檩斎氲拿}沖一般只能保證一個(gè)觸發(fā)沿是穩(wěn)定的 如果要產(chǎn)生占空比相同的波形,那么計(jì)數(shù)器可以很簡(jiǎn)單的搞定。 例如:將一個(gè)200kHz的時(shí)鐘做2分頻,4分頻,8分頻,這時(shí)候你也許會(huì)想到用PLL,但是這里的時(shí)鐘速率是kHz級(jí)別,很低,無(wú)法使用PLL。 可以這樣設(shè)計(jì):
reg [2:0] cnt;
always @(posedge clk_200k, negedge rst_n)
? if(!rst_n)
?? cnt <= 3'b000;
? else?
?? cnt <= cnt + 1'b1;
??
assign clk_100k = cnt[0];
assign clk_50k ?= cnt[1];
assign clk_25k? = cnt[2]; 如要要求產(chǎn)生一個(gè)占空比為1:4的波形,用計(jì)數(shù)器實(shí)現(xiàn)的話就很麻煩了,在這種時(shí)候就可以用一個(gè)簡(jiǎn)單的狀態(tài)機(jī)來(lái)實(shí)現(xiàn)。 000->001->110->100->010-> | | <----<----<----<----<----<- 利用狀態(tài)機(jī)就很簡(jiǎn)單的實(shí)現(xiàn)了占空比不同的波形的產(chǎn)生。 代碼如下: 1 reg [2:0] state;
2
3 always @(posedge clk, negedge rst_n)
4 if(!rst_n)
5 state <=3'b000;
6 else
7 case (state)
8 3'b000: state <= 3'b001;
9 3'b001: state <= 3'b110;
10 3'b110: state <= 3'b100;
11 3'b100: state <= 3'b010;
12 3'b010: state <= 3'b000;
13 default : state <=3'b000;
14 endcase
15
16 assign clk_out = state[0];
17
?? 仿真波形:
狀態(tài)機(jī)的設(shè)計(jì)水平直接反映了工程師的邏輯功底,要寫好狀態(tài)機(jī)就一定要多練習(xí)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/semiok/archive/2010/10/13/1849730.html
總結(jié)
以上是生活随笔為你收集整理的[笔记][原创]Verilog HDL语法分析笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何编写优雅的代码:07. 设计模式应用
- 下一篇: 大数据 -- kafka学习笔记:知识点