順序塊:塊中的語句按從前到後一條接一條執行
begin
.
.
.
end
並行塊:塊中的語句同時開始執行
fork
.
.
.
join
repeat回圈:一個記憶體的初始化也可以用repeat
reg [7:0] mem [3:0];
initial begin
i=0;
repeat(4)
begin
mem[i]=0;
i=i+1;
end
end
forever回圈 :表示 永遠回圈,直到模擬結束, 與always的區別是,forever 必須在initial或always結構中使用。
initial begin
clk=0;
forever #10 clk=~clk;
end
非阻塞性賦值:
特點是:1.同一時間點,前面語句的賦值不能立刻被後面的語句使用。 2.所以的賦值是在一個時間點結束的時候統一完成的。
如下面 下麪的程式碼,模擬器的執行結果是:
在模擬0時刻,將賦值語句右側的值0賦給某個臨時暫存器中,a並未被賦值。 在模擬0時刻,將賦值語句右側的值1賦給某個臨時暫存器中,b並未被賦值。 在模擬0時刻,將賦值語句右側的值{a,b}賦給某個臨時暫存器中,但是a,b並未真正賦值,所以c得到的是a,b的舊值。 在模擬結束時,將臨時暫存器的值賦值給左側。
initial begin
a<=0;
b<=1;
c<={a,b};
end
task任務
task 任務名稱;
input [寬度宣告] 輸入信號名;
output [寬度宣告] 輸出信號名;
inout [寬度宣告] 雙向信號名;
reg 任務所用變數宣告;
begin
任務包含的語句
end
endtask
舉例說明,4位元全加器的任務
task add4;
input [3:0] x,y;
input cin;
output [3:0] s;
output cout;
begin
{cout,s}=x+y+cin;
end
endtask
對任務進行呼叫,abcde按順序給x y cin s cout進行賦值
add4(a,b,c,d,e);
函數:函數不可以呼叫任務,組合邏輯僅可以寫成函數,函數至少需要一個輸入信號,沒有輸出信號。
//函數的宣告格式
function 返回值的型別和範圍 函數名;
input [埠範圍] 埠宣告;
reg、 interge等變數宣告;
begin
阻塞賦值語句塊
end
endfunction
舉例說明,計算階乘的函數
function integer factorial;//定義爲整型
input [3:0] a;//定義輸入信號
integer i;//定義函數內部變數
begin
factorial=1;
for(i=2;i<=a;i=i+1)
factorial=i*factorial;
end
endfunction
函數的呼叫
out=function(a);
隨機函數
語法形式,seed是一個32位元有符號的整型數值
$random(seed);
舉例說明,給1024個記憶體給隨機值
integer i;
reg [7:0] men [0:1023];
initial begin
i=0;
repeat(1024)
begin
men[i]=$random;
i=i+1;
end
end
假如想生成某個範圍的數值,得到一個-63——+63的亂數。
rand=$random%64;
可以用以下方法,得到0-63的數值
reg [7:0] rand;
rand={$random}%64;