Verilog 語法知識2

Verilog 語法知識2

5.順序塊(關鍵字begin and)
順序塊有以下特點:

  1. 塊內的語句是按順序執行的。
  2. 每條語句的延遲時間是相對於前一條語句的仿真時間而言的。
  3. 直到最後一條語句執行完,程序流程控制才跳出該語句塊。

如:

begin
	a = b;
	c = a; //c的值爲b的值。
end

即第一條賦值語句先執行,a的值更新爲b的值,然後程序流程控制轉到第二條賦值語句,c的值更新爲a的值。因爲這兩條賦值語句之間沒有任何延遲時間,c的值實爲b的值。當然可以在順序塊裏延遲控制時間來分開兩個賦值語句的執行時間。

6.並行塊(關鍵字fork join)

  1. 塊內語句是同時執行的,即程序流程控制一進入到該並行塊,塊內語句則開始同時並行地執行。
  2. 塊內每條語句的延遲時間是相對於程序流程控制進入到塊內時的仿真時間的。
  3. 延遲時間是用來給賦值語句提供執行時序的。
  4. 當按時間時序排序在最後的語句執行完後或一個disable語句執行時,程序流程控制跳出該程序塊。

如:

fork
	#50 r = 'h35;
	#100 r = 'hE2;
	#150 r = 'h00;
	#200 r = 'hF7;
	#250 -> end_wave; //觸發事件end_wave.
join                //其執行的語句順序可以隨意改變

注意:#是指延時,上例的延時不同,就可以用順序塊來代替。在VerilgHDL語言中,可以給每個塊取一個名字,只需將名字加在關鍵詞begin或fork後面即可。這樣可以在塊內定義局部變量,即只在塊內使用的變量,可以允許塊被其它語句調用,如被disable語句。在Verilog語言裏,所有的變量都是靜態的,即所有的變量都只有一個唯一的存儲地址,因此進入或跳出塊並不影響存儲在變量內的值。基於以上原因,塊名就提供了一個在任何仿真時刻確認變量值的方法。

7.條件語句,(if_else)這個語句無論Verilog還是C語言都用的很多,但還是有需要注意的地方。

如:

if(a>b) 
	out1<=int1;
else if(a==b) 
	out1<=int2;
else 
	out1<=int3;

像這種裏面只有一條語句,就不用加begin and,就和C語言一樣不用加“{}”

if(a>b)
	begin
		out1<=int1;
		out2<=int2;
	end
else
	begin
		out1<=int2;
		out2<=int1;
	end

像這種,有多個語句的就需要加begin and。值得注意的是,if與else的配對關係,不要把自己嵌套糊塗了,這裏有C語言基礎的應該都懂,細節問題,不要邏輯混亂就行。

8.case語句,case語句是一種多分支選擇語句,if語句只有兩個分支可供選擇,而實際問題中常常需要用到多分支選擇,Verilog語言提供的case語句直接處理多分支選擇。case語句通常用於微處理器的指令譯碼,和C語言不一樣的是它後面還要搭配(endcase)而C語言是(break),這裏就不細說了。

9.循環語句,在Verilog HDL中存在着四種類型的循環語句,用來控制執行語句的執行次數。 forever 連續的執行語句。 repeat 連續執行一條語句 n 次。 while 執行一條語句直到某個條件不滿足。如果一開始條件即不滿足(爲假),則語句一次也不能被執行。for通過以下三個步驟來決定語句的循環執行。a先給控制循環次數的變量賦初值。b判定控制循環的表達式的值,如爲假則跳出循環語句,如爲真則執行指定的語句後,轉到第三步。c 執行一條賦值語句來修正控制循環變量次數的變量的值,然後返回第二步。

  • forever語句,格式:forever 語句; forever begin 多條語句 end
  • repeat語句,格式:repeat(表達式) 語句;repeat(表達式) begin 多條語句 end
parameter size=8,longsize=16;
reg [size:1] opa, opb;
reg [longsize:1] result;
begin: mult//塊名
reg [longsize:1] shift_opa, shift_opb;
shift_opa = opa;
shift_opb = opb;
result = 0;
repeat(size)//這裏就是指重複次數size
	begin
		if(shift_opb[1])
			result = result + shift_opa;
			shift_opa = shift_opa <<1;
			shift_opb = shift_opb >>1;
	end
end//這個程序寫的是一個乘法器,運用加法和移位來操作的。
  • while語句:格式:while(表達式) 語句;while(表達式) begin 多條語句 end。
begin: count1s
reg[7:0] tempreg;
count=0;
tempreg = rega;
while(tempreg)
	begin
		if(tempreg[0]) count = count + 1;
			tempreg = tempreg>>1;
	end
end//用while循環語句對rega這個八位二進制數中值爲1的位進行計數。
  • for語句,格式:for(表達式1;表達式2;表達式3) 語句它的執行過程如下:
    1. 先求解表達式1;
    2. 求解表達式2,若其值爲真(非0),則執行for語句中指定的內嵌語句,然後執行下面的
      第3步。若爲假(0),則結束循環,轉到第5步。
    3. 若表達式爲真,在執行指定的語句後,求解表達式3。
    4. 轉回上面的第2步驟繼續執行。
    5. 執行for語句下面的語句。

和C語言沒多大區別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章