verilog基礎語法

2020-08-10 12:19:55

順序塊:塊中的語句按從前到後一條接一條執行

    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;