SystemVerilog语言简介(三)

15. 强制类型转换

 

Verilog不能将一个值强制转换成不同的数据类型。SystemVerilog通过使用'操作符提供了数据类型的强制转换功能。这种强制转换可以转换成任意类型,包括用户定义的类型。例如:

 

 

int' (2.0 * 3.0) // 将结果转换为int类型

 

mytype' (foo) // foo转换为mytype类型

 

 

 

一个值还可以通过在强制转换操作符前指定一个10进制数来转换成不同的向量宽度,例如:

 

17' (x - 2) // 将结果转换为17位宽度

 

 

也可以将结果转换成有符号值,例如:

 

 

signed' (x) // x转换为有符号值

 

16. 操作符

 

Verilog没有C语言的递增(++)和递减(--)操作符。而SystemVerilog加入了几个新的操作符:

 

l         ++和--:递增和递减操作符;

 

l         +=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=、<<<=和>>>=赋值操作符;

 

17. 唯一性和优先级决定语句

 

在Verilog中,如果没有遵循严格的编码风格,它的if-elsecase语句会在RTL仿真和RTL综合间具有不一致的结果。如果没有正确使用full_caseparallel_case综合指令还会引起一些其它的错误。

 

SystemVerilog能够显式地指明什么时候一条决定语句的分支是唯一的,或者什么时候需要计算优先级。我们可以在if或case关键字之前使用uniquerequires关键字。这些关键字可以向仿真器、综合编译器、以及其它工具指示我们期望的硬件类型。工具使用这些信息来检查ifcase语句是否正确建模了期望的逻辑。例如,如果使用unique限定了一个决定语句,那么在不希望的case值出现的时候仿真器就能够发布一个警告信息。

 

bit [2:0] a;

 

unique if ((a==0) || (a==1)) y = in1;

 

else if (a==2) y = in2;

 

else if (a==4) y = in3; // 3567会引起一个警告

 

 

 

priority if (a[2:1]==0) y = in1; // a01

 

else if (a[2]==0) y = in2; // a23

 

else y = in3; // 如果a为其他的值

 

 

 

unique case (a)

 

  0, 1: y = in1;

 

  2: y = in2;

 

  4: y = in3;

 

endcase // 3567会引起一个警告

 

 

 

priority casez (a)

 

  2'b00? : y = in1; // a01

 

  2'b0?? : y = in2; // a23

 

  default : y = in3; //如果a为其他的值

 

endcase

 

 

18. 底部检测的循环

 

Verilog包含forwhilerepeat循环,这几个循环都是在循环的起始处检测循环条件。SystemVerilog加入了一个do-while循环,这种循环在执行语句的结尾处检测循环条件。

 

19. 跳转语句

 

在语句的执行过程中,C语言提供了几种方式来跳转到新的语句,包括:returnbreakcontinuegoto。在Verilog中除了通过使用disable语句跳转到语句组的尾部外,没有提供任何其它跳转语句。使用disable语句执行中止和继续功能要求加入块的名字,并且会产生不直观的代码。SystemVerilog加入了C语言的breakcontinue关键字,这两个关键字不要求使用块名字。另外,SystemVerilog还加入了一个return关键字,它可以用来在任何执行点上退出一个任务或函数。

 

l         break:退出一个循环,与C语言相同;

 

l         continue:跳转到一个循环的尾部,与C语言相同;

 

l         return 表达式:退出一个函数;

 

l         return:退出一个任务或void类型的函数。

 

SystemVerilog没有包含C语言中的goto语句。

 

20. 块名字和语句标签

 

在Verilog中,我们可以通过在beginfork

你可能感兴趣的:(SystemVerilog语言简介(三))