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来说,寄存器资源非常宝贵,不适合用来大量存储数据,因此使用时要注意。