System Verilog學習筆記(一)


1.var/reg與bit/logic

異:
reg——>在verilog hdl中用來聲明寄存器;
var——>在SV中所有暫存的資源視為變量,即variable;
同:
reg和var都會消耗FPGA資源。
注:
a.SV中保留了reg關鍵字,reg與var有等價左右。
b.SV在聲明RAM的時候,也會使用var關鍵字。
例子:
reg [3:0] rLED; //verilog
var [3:0] rLED; //sysverilog

2、物理特性寄存器一般有4態,即0,1,x,z
verilog hdl——>reg關鍵字默認下都視為4態
SV——>資源暫存為2態,關鍵字是bit,即0和1;
資源暫存為4態,關鍵字是logic,即0,1,x,z
(z——>用來驅動IO口,主要是阻隔輸出;x——>用來建立選擇器)
例子:
var bit [3:0] rLED; //sysverilog,2態的暫存資源
var logic [3:0] rLED; //sysverilog,4態的暫存資源

注:如果驅動對象是IO就選擇logic,如果是暫存數據就選bit

3、always_ff與always_comb
在verilog中,有時間點事件和即時事件,分別對應時序邏輯和組合邏輯,聲明分別為always@(沿敏感列表) 和 always@(*)
system verilog中,則分別用always_ff(沿敏感列表) 和 always_comb表示時序邏輯和組合邏輯;

例子:
always@(posedge CLK) //verilog
always_ff@(posedge CLK) //system verilog

例子:
always@(*) //verilog
always_comb //system verilog

//-------------------------------------------------------------
var logic [3:0] rLED;

always_comb //組合邏輯行為聲明,輸出選擇器是組合邏輯
if(isStart[0]) rLED = LED_U1;
else if(isStart[1]) rLED = LED_U2;
else rLED = 4'dx;

assign LED = rLED;

//-------------------------------------------------------------


4、2003 system verilog wire和var一樣有bit(2態)和logic(4態),在2005年system verilog將其廢除,默認下wire是logic(4態):
wire DoneSig_U1 //system verilog or verilog等價關系
wire logic DoneSig_U1 //system verilog 等價關系
wire bit DoneSig_U1 //錯誤wire聲明

5、struct與typedef

注意:與C語言結構體的用法不同
typedef struct {bit L0,L1,L2,L3;} LED_Struct;//自定義結構,LED_Struct

var LED_Struct rLED;
always_ff@(posedge CLK or negedge RSTn)
if(!RSTn)
begin
rLED.L0 = 1'b0;
rLED.L1 = 1'b0;
rLED.L2 = 1'b0;
rLED.L3 = 1'b0;

...
end
......
assign

6、struct與packed
5中定義的結構體需要為每個成員單獨賦值,當聲明自定義結構之際加上packed關鍵字,該自定義為就按着位操作連接起來,
LED_Struct的第[0]位是L0,第[1]位是L1:

tepedef struct packed{bit L3,L2,L1,L0;} LED_Struct;//packed以后的自定義結構

var LED_Struct rLED; //聲明為暫存類型的自定義結構rLED
var bit [3:0] rLED; //等價關系

rLED <= 4'd0;

有packed的自定義結構聲明暫存類型時,LED_Struct聲明一個名為rLED的暫存類型,而該rLED與"var bit [3:0] rLED"聲明方法有等價的關系,rLED可以直接為所有成員賦值。

7、RAM與packed

reg [7:0] ram [3:0]; //verilog聲明4個8位寬的RAM

var bit [width][words] name; //聲明數組-System Verilog
var bit name [width][words];//聲明內存(ram)-System Verilog

例子:
var bit [3:0][3:0] Array; //建立名為Array的二維數組,位寬為4,字為4
var bit ram [3:0][3:0]; //建立位寬為4,字為4的ram

var bit [][]Array={4'b1000,4'b0100,4'b0010,4'b0001};//建立數組的時候直接為數組賦值,默認情況下數組初值為0

always_ff@(...negedge RSTn)
if(!RSTn)
begin
Array <= '{default:0};//整體數組賦值0
...
end

always_ff@(posedge CLK or negedge RSTn)
if(!RSTn)
begin
Array[0]= 4'b0001; //成員逐個賦值
Array[1]= 4'b0010;
Array[2]= 4'b0100;
Array[3]= 4'b1000;
...
end

var bit [3:0][3:0] Array
var bit [15:0] rData //兩者為等價關系,二維Array可以用一維rData看待

System Verilog的數組聲明是消耗寄存器資源而不是內存資源。對於FPGA來說,寄存器資源非常寶貴,不適合用來大量存儲數據,因此使用時要注意。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM