1. SystemVerilog在Verilog的基础上增加了递增操作符++和递减操作符–。使用方法与C语言中一样。递增和递减是阻塞赋值,所以一般都只用在组合逻辑中
// 这两条语句是相同的
i++;
i = i + 1;
// 下面这样就是错误的,不能写在时序逻辑中,所以要写成count <= count + 1;
always_ff @ (posedge clock)
	if(!resetN)
		count <= 0;
	else
		count ++;

always_ff @ (posedge clock)
	case(state)
		HOLD: if(count == MAX)
		...
  1. SystemVerilog新增了一些新的赋值语句,这些新的操作符将一些操作符和赋值组合到一起,类似于C语言那样。这些操作符是阻塞赋值,只用在组合逻辑中。新增的操作符如下表。
// 下面这两个语句是一样的
out += in;
out = cout + in;

systemverilog 循环 systemverilog while_SystemVerilog

  1. SystemVerilog和Verilog中的= =和= = =的使用是相同的。逻辑相等操作符 = =对两个操作数中每个有不确定值X或Z的位都进行比较,然后返回一位逻辑X值。条件相等操作符= = =对两操作数进行按位比较,对两个操作数中的1,0,X,Z进行精准匹配。SystemVerilog增加了新的操作符= = ?和! = ?,在使用= = ?时,右边操作数中的一位逻辑X或逻辑Z值都都被看做是一个通配符,而这个通配符可以和另一个操作数中相应位的任何数值相匹配。为了对通配符相等操作符进行综合,屏蔽位必须是常数表达式,即右边表达式不能为变量。
// 右边表达式必须是常量
logic [7:0] opcode;
if(opcode ==? 8'b11011???)	// 屏蔽低位
...
logic [3:0] a,b;
logic	y1,y2;
assign y1 = (a ==? 4'b1??1);	// 可综合
assign y2 = (a ==? b);	// 不可综合
  1. inside用来检查一个值是否在集合中。
logic [2:0] a;
if(a inside {3'b001,3'b010,3'b100})
	...
// 数值集合也可以是数组,下面判断13是否在数组中
int d_array [0:1023];
if(13 inside d_array)
	......
  1. SystemVerilog使用type`(表达式)来进行强制类型转换。
  2. SystemVerilog使用size`(表达式)来进行尺寸强制转换。如果位数不同则进行截去或者补充,这种规则与将一个表达式赋值给位数不同的变量或线网时的操作是一样的。
  3. SystemVerilog还可以显示强制转换值的符号。不管是操作数还是操作的结果都可以强制转换符号。
signed`(表达式);
unsigned`(表达式);
  1. Verilog中for循环的循环控制变量必须提前声明。而SystemVerilog可以在for循环内部声明循环变量,for循环变量的值不能在循环外部使用,因为这个变量在循环外部是不存在的。
// Verilog的使用
reg	[7:0] i;
for(i=0; i<=15; i=i+1) begin
	...
end

// SystemVerilog的使用
for(bit [4:0] i=0; i<=15; i++) begin
	...
end
  1. Verilog的while循环有可能根本没有执行过。SystemVerilog增加了do…while,循环中的语句至少能执行一次。
  2. SystemVerilog增加了C语言的跳转语句break,continue和return。
  3. Verilog可以为一个语句块命名,方法是在关键字begin后加上:<名称>。SystemVerilog允许在关键字end后面标上匹配的块名。
begin: <块名>
end: <块名>
  1. SystemVerilog给出了unique case语句,用来匹配case语句块中必须有一个且只有一个条件选项与条件表达式匹配。编译时会检查每个选项都是互斥的,如果在运行时有多个条件选项与条件表达式相匹配,则工具会报告发生了运行错误。下面的代码是合法的,但是编译器通常会警告条件选项中存在潜在重叠。如果所有的条件选项都不能和条件表达式匹配,也没有缺省条件时,软件工具会报告运行时警告。
logic	[2:0] request;
always_comb
	unique casez(select)
		3'b1??	: slave1_gant = 1;
		3'b?1?	: slave1_gant = 1;
		3'b??1	: slave1_gant = 1;
	endcase
  1. SystemVerilog给出了priority case语句,用来匹配case语句块中至少有一个条件选项的值与条件表达式的值匹配,如果有多个匹配项必须执行第一个匹配分支。修饰符priority表示设计者认为两个或多个条件选择表达式可以同时为真,并且条件选项的顺序非常重要。