本文是已经学完verilog语言后,拓展学习常用System Verilog 语法 。
参考:《systemVerilog测试平台编写指南》
1.logic类型
任何使用线网的地方均可以使用logic类型,但要求logic类型不能有多个结构性驱动,例如,在对双向总线建模的时候。此时,需要使用线网类型wire 。
2.双状态数据类型
bit b ; //双状态,单比特
bit [31:0] b32 ; //双状态,32比特无符号整数
int unsigned ui ; //双状态,32比特无符号整数
int i ; //双状态,32比特有符号整数
byte b8 ; //双状态,8比特有符号整数
shortint s ; //双状态,16比特有符号整数
longint l ; //双状态,64比特有符号整数
integer i4 ; //四状态,32比特有符号整数
time t ; //四状态,64比特无符号整数
real r ; //双状态,双精度浮点数
3.定宽数组
bit [15:0] mem [8] 或 bit [15:0] mem [0:7]
8 个 16比特数 的数组
int array2 [0:7] [0:3] ; //完整的声明
int array3 [8] [4] ; //紧凑的声明
array2[7][3] = 1 ; //设置最后一个元素
4.数组操作
bit [7:0] array1 [8] ;
integer i ;
for ( i = 0 ; i < 8 ; i++ ) array1[i] <= 0 ;
例子:
module byte_8_average(
input logic clk,
input logic rst_n,
input logic rx_flag,
input logic [7:0] rx_data,
output logic tx_flag,
output logic [7:0] tx_data
);
bit [7:0] array1 [8] ;
bit [2:0] rx_cnt ;
logic [10:0] sum ;
integer i ,j;
assign tx_data = sum[10:3] ;
assign tx_flag = rx_flag&& (rx_cnt == 7) ;
always_ff @(posedge clk or negedge rst_n)begin
if(~rst_n)begin
for ( i = 0 ; i < 8 ; i++ ) array1[i] <= 0 ;
rx_cnt <= 0 ;
end
else begin
if(rx_flag)begin
array1[rx_cnt] <= rx_data ;
if(rx_cnt == 7)begin
rx_cnt <= 0 ;
end
else begin
rx_cnt <= rx_cnt + 1 ;
end
end
end
end
always_comb begin
if(rx_cnt == 0)begin
sum = 0 ;
for ( j = 0 ; j < 8 ; j++ ) sum += array1[j] ;
end
else begin
sum = 0 ;
end
end
endmodule