“本文主要分享了在Verilog設(shè)計(jì)過(guò)程中一些經(jīng)驗(yàn)與知識(shí)點(diǎn),主要包塊語(yǔ)句、阻塞賦值和非阻塞賦值以及結(jié)構(gòu)說(shuō)明語(yǔ)句(initial, always, task, function)?!?/span>
01
—
塊語(yǔ)句
順序塊 begin…end
塊內(nèi)的語(yǔ)句是按照順序執(zhí)行的;
塊內(nèi)的每條語(yǔ)句延時(shí)控制都是相對(duì)于上條語(yǔ)句結(jié)束的時(shí)刻;
仿真時(shí),執(zhí)行到最后一條語(yǔ)句該語(yǔ)句塊執(zhí)行結(jié)束。
并行塊fork…end
塊內(nèi)的語(yǔ)句是按照獨(dú)立的同時(shí)開(kāi)始執(zhí)行的;
塊內(nèi)的每條語(yǔ)句延時(shí)控制都是相對(duì)于程序進(jìn)入該語(yǔ)句塊的時(shí)刻而言;
仿真時(shí),所需最長(zhǎng)時(shí)間的語(yǔ)句執(zhí)行結(jié)束后,該語(yǔ)句塊執(zhí)行結(jié)束。
例:
仿真結(jié)果如下:reg [7:0] l1,l2;reg[7:0]k1,k2;initialbeginl1=0;l2=0;#15l1=2;#10l2=8;endinitialforkk1=0;k2=0;#15k1=2;#10k2=8;join

02
—
阻塞賦值和非阻塞賦值
-
阻塞賦值(Blocking)
-
非阻塞賦值(Non_Blocking)
例1:組合邏輯中的阻塞與非阻塞
阻塞代碼如下:仿真結(jié)果如下:always@(a,b,c,d)begini1 = a & b;i2 = c & d;i3 = i1 & i2;end

always@(a,b,c,d)begini1 <= a & b;i2 <= c & d;i3 <= i1 & i2;end
仿真結(jié)果如下:

可以看出i1和i2在阻塞和非阻塞中結(jié)果相同,但是i3的結(jié)果卻不同。這是因?yàn)樵谧枞x值中,i3的賦值使用的是i1和i2更新后的值,而非阻塞賦值中i3的賦值則使用的是i1和i2更新前的值。要想解決這一問(wèn)題,則需要將“always@(a,b,c,d)”改成“always@(a,b,c,d,i1,i2)”代碼如下:
仿真結(jié)果如下:always@(a,b,c,d,i1,i2)begin=a&b;i2 <= c & d;i3 <= i1 & i2;end

例2:時(shí)序邏輯中的阻塞和非阻塞。
以反饋振蕩器的代碼為例。非阻塞賦值代碼:
always@(posedge clk,posedge rst)beginif(rst) a1 <=0;else a1 <=a2;endalways@(posedge clk,posedge rst)beginif(rst) a2 <=1;else a2 <=a1;end
阻塞賦值代碼:
always@(posedge clk,posedge rst)beginif(rst) b1 = 0;else b1 = b2;endalways@(posedgeclk,posedgerst)beginif(rst) b2 = 1;else b2 = b1;end
仿真結(jié)果如下:

可以看出阻塞賦值語(yǔ)句并不能達(dá)到我們想要的效果;而且綜合后阻塞賦值語(yǔ)句中,無(wú)法確定哪個(gè)always塊中的時(shí)鐘沿先到達(dá),哪個(gè)always塊中的時(shí)鐘后到達(dá),所以存在一個(gè)冒險(xiǎn)競(jìng)爭(zhēng)的問(wèn)題。綜上,時(shí)序邏輯中更適合用非阻塞賦值語(yǔ)句。
03
—
結(jié)構(gòu)說(shuō)明語(yǔ)句(initial, always, task, function)
-
語(yǔ)句initial
一般initial語(yǔ)句用于測(cè)試文件的編寫(xiě);但是隨著編譯器的進(jìn)步,現(xiàn)在也可以綜合,常用于一些變量的初始化。無(wú)論是用在什么場(chǎng)景,initial語(yǔ)句只執(zhí)行一次。initial begin// Add code hereend
-
語(yǔ)句always
例1:生成仿真時(shí)的信號(hào)波形
always可以用于仿真時(shí)的波形生成:always #5 clk = ~clk;這個(gè)例子就形成了一個(gè)周期為10ns(時(shí)間單位ns根據(jù)`timescale確定)的方波,常用來(lái)描述時(shí)鐘信號(hào)(如果將#5去掉,那么會(huì)生成一個(gè)延遲為0的無(wú)限循環(huán)跳變過(guò)程,會(huì)發(fā)生仿真鎖死,這是不推薦的)。仿真結(jié)果如下:

例2:
實(shí)現(xiàn)鎖存器和觸發(fā)器
多個(gè)敏感事件可以用“or”或者“,”區(qū)分(rst為復(fù)位信號(hào),可以是posedge也可以是negedge)。always@(posedge clk or posedge rst)beginif(rst) cnt <= 0;else cnt <= cnt + 1;end或always@(posedge clk , posedge rst)begin//add codesend

例3:實(shí)現(xiàn)組合邏輯
利用always實(shí)現(xiàn)組合邏輯時(shí),要將所有的信號(hào)放進(jìn)敏感列表,而時(shí)序邏輯中則不需要。上面的代碼表示,a、b、c中任意電平發(fā)生變化,begin…end語(yǔ)句就會(huì)被觸發(fā)。仿真結(jié)果如下所示:always@(aorborc)beginx=x+1;end

如上所示,因?yàn)槊舾辛斜肀容^長(zhǎng),容易寫(xiě)錯(cuò),所以Verilog又提供了兩個(gè)特殊的符號(hào):@*和@(*)。簡(jiǎn)化代碼如下:always@(a or b or c or d or e)beginout = a + b + c + d + e;end
仿真結(jié)果如下圖所示:always@(*)begin=a+b+c+d+ e;end

-
語(yǔ)句task
task <任務(wù)名>;
<端口及數(shù)據(jù)類型聲明語(yǔ)句>;
<語(yǔ)句1>;
…
<語(yǔ)句n>;
endtask
示例代碼如下:
仿真結(jié)果如下圖所示:reg [7:0] j,k,i,x;clk or posedge rst)beginif(rst)begini <= 0;j <= 0;k <= 0;x <= 0;task1(i,j,k);endelsebegini <= i + 1;x <= i + 10;task1(i,j,k);endendtask task1;input [7:0] i;output [7:0] j1;output [7:0] k1;beginj1 = i + 10;k1 = i + 11;endendtask

-
語(yǔ)句function
語(yǔ)句function的定義:
function<返回值的類型或范圍>(函數(shù)名)
<端口說(shuō)明語(yǔ)句>
<變量類型說(shuō)明語(yǔ)句>
begin
…
end
endfunction
示意代碼如下:
reg [7:0] i,j;reg [8:0] sum_data;clk or posedge rst)beginif(rst)begini <= 100;j <= 31;sum_data <= sum(i,j);endelsebegini <= i + 1;j <= j + 2;sum_data <= sum(i,j);endendfunction [8:0] sum;input [7:0] i1;input [7:0] j1;beginsum = i1 + j1;endendfunction
仿真結(jié)果如下圖所示:

注意:initial、always、task和function都是可以綜合的。
審核編輯:郭婷
-
Verilog
+關(guān)注
關(guān)注
30文章
1369瀏覽量
113948
原文標(biāo)題:Verilog基礎(chǔ)知識(shí)學(xué)習(xí)筆記(二)
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Verilog語(yǔ)言中阻塞和非阻塞賦值的不同
考慮x和z在verilog條件語(yǔ)句中的使用情況
煉獄傳奇-賦值語(yǔ)句之戰(zhàn)
Verilog過(guò)程賦值語(yǔ)句提問(wèn)
verilog中g(shù)enerate語(yǔ)句的用法分享
在verilog語(yǔ)句中,非阻塞賦值和小于等于均使用符號(hào)“<=”,如何區(qū)分<=所表示的含義?
FPGA視頻教程之Verilog中兩種不同的賦值語(yǔ)句的資料說(shuō)明
verilog中阻塞賦值和非阻塞賦值到底有什么區(qū)別
Verilog中的賦值語(yǔ)句的區(qū)別
Verilog HDL語(yǔ)言中連續(xù)賦值的特征
Verilog設(shè)計(jì)過(guò)程中的一些經(jīng)驗(yàn)與知識(shí)點(diǎn)
verilog中阻塞賦值和非阻塞賦值的區(qū)別
Verilog中的If語(yǔ)句和case語(yǔ)句介紹

Verilog賦值和結(jié)構(gòu)說(shuō)明語(yǔ)句
評(píng)論