本節內容是sv里的剩余語法,task,function,automatic
一:procedural statement
1:新操作符
1) i++,++i,i--,--i 同c語言,但易出現race現象。
2) ==?,!=? 如:a==?b ,x與z只能出現在右側,即b的值有x或者z
3) inside 用於值的范圍
2:強制轉換
1)數據類型強制轉換
通過賦值的方式,例如
longint a,y;
real r;
y=a+longint(r);
2)位寬強制轉換
在要處理的數據前面加上要擴展位寬值,如16‘
3)符號位強制轉換
將無符號數轉化為有符號數,將有符號數轉化為無符號數
signed'(expression) unsigned'(expression)
3: 循環
1)for
verilog中,循環體內的變量需要在循環體外聲明,sv里,可在循環體內聲明變量,這種變量是local的,在循環體外看不見。若在循環體內外同時聲明同一變量,則互不干擾。
2)do while sv里增加的循環,verilog里沒有。
3)case
增加unique,priority(優先級)選項;
二:function
1:主要概念
不消耗時間;不帶時序,function里不能包含延時信息,@,wait等時間信息關鍵字;
由於task可以帶時序,所以規定function不能調用task;
2:格式
function [range] function_name; //[range] 指返回值function_name的類型
parameters
input declaration
reg declaration
--code body --
endfunction
3: void function
不返回值;在verilog里,function一定返回值,且返回的值是function的名字。
三:task
1:基本概念
消耗時間,含有輸入輸出雙向端口;可含delay,timing,event;
2:格式
task task_name
parameter
input dedclarations
output declarations
reg declaration
--code body--
endtask
3: task與function內部變量是靜態變量,在不同地方對同一個變量賦值會產生race,需要注意
四:sv里task與function增加點
1:不需要加begin...end
2:添加return,直接退出函數
3: function增加了void function
function void fill_packet(input logic[63:0] data_in,output packet_t data_out);
data_out.data = data_in
endfunction
沒有輸出,通過輸出變量data_out輸出
4:在verilog里function只有input,沒有output,返回值就是函數值;但在sv里,function增加了output,inout變量
5:參數方向類型缺省時,類型默認為logic,方向默認為input
6:引用ref
所謂引用傳遞,就如c++里面的指針,也就是變量的入口地址;只有automatic型task,function可以使用ref;
傳值方式來傳遞參數,那么參數會被整體復制到其他地址,這樣消耗一定的內存和操作時間;而用ref傳值方式來傳遞參數,只是獲得參數的入口地址,操作速度快,減少內存使用
可在ref數組前加const,使數組不變。
五:automatic
一般硬件里的所有對象都是靜態的;在verilog-1995,如果在多個地方調用同一個任務,本地變量是共同而且靜態分配的,為此,不同的進程相互訪問同一個值。在verilog-2001中,可以通過使用automatic關鍵字,將任務,函數和模塊聲明為自動存儲模式,這樣,仿真器就能夠對所有形式的參數和內部變量使用堆棧的形式來存儲。