15. 强制类型转换
Verilog不能将一个值强制转换成不同的数据类型。SystemVerilog通过使用<type>’操作符提供了数据类型的强制转换功能。这种强制转换可以转换成任意类型,包括用户定义的类型。例如:
int’ (2.0 * 3.0) // 将结果转换为int类型
mytype’ (foo) // 将foo转换为mytype类型
一个值还可以通过在强制转换操作符前指定一个10进制数来转换成不同的向量宽度,例如:
17’ (x - 2) // 将结果转换为17位宽度
也可以将结果转换成有符号值,例如:
signed’ (x) // 将x转换为有符号值
16. 操作符
Verilog没有C语言的递增(++)和递减(--)操作符。而SystemVerilog加入了几个新的操作符:
? ++和--:递增和递减操作符;
? +=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=、<<<=和>>>=赋值操作符;
17. 唯一性和优先级决定语句
在Verilog中,如果没有遵循严格的编码风格,它的if-else和case语句会在RTL仿真和RTL综合间具有不一致的结果。如果没有正确使用full_case和parallel_case综合指令还会引起一些其它的错误。
SystemVerilog能够显式地指明什么时候一条决定语句的分支是唯一的,或者什么时候需要计算优先级。我们可以在if或case关键字之前使用unique或requires关键字。这些关键字可以向仿真器、综合编译器、以及其它工具指示我们期望的硬件类型。工具使用这些信息来检查if或case语句是否正确建模了期望的逻辑。例如,如果使用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; // 值3、5、6、7会引起一个警告
priority if (a[2:1]==0) y = in1; // a是0或1
else if (a[2]==0) y = in2; // a是2或3
else y = in3; // 如果a为其他的值
unique case (a)
0, 1: y = in1;
2: y = in2;
4: y = in3;
endcase // 值3、5、6、7会引起一个警告
priority casez (a)
2’b00? : y = in1; // a是0或1
2’b0?? : y = in2; // a是2或3
default : y = in3; //如果a为其他的值
endcase
18. 底部检测的循环
Verilog包含for、while和repeat循环,这几个循环都是在循环的起始处检测循环条件。SystemVerilog加入了一个do-while循环,这种循环在执行语句的结尾处检测循环条件。
19. 跳转语句
在语句的执行过程中,C语言提供了几种方式来跳转到新的语句,包括:return、break、continue和goto。在Verilog中除了通过使用disable语句跳转到语句组的尾部外,没有提供任何其它跳转语句。使用disable语句执行中止和继续功能要求加入块的名字,并且会产生不直观的代码。SystemVerilog加入了C语言的break和continue关键字,这两个关键字不要求使用块名字。另外,SystemVerilog还加入了一个return关键字,它可以用来在任何执行点上退出一个任务或函数。
? break:退出一个循环,与C语言相同;
? continue:跳转到一个循环的尾部,与C语言相同;
? return 表达式:退出一个函数;
? return:退出一个任务或void类型的函数。
SystemVerilog没有包含C语言中的goto语句。
20. 块名字和语句标签
在Verilog中,我们可以通过在begin或fork关键字之后指定名字来为begin-end或fork-jion语句指定名字。这个指定的名字代表整个语句块。SystemVerilog还允许在end或jion关键字之后指定一个匹配的块名字。这种机制很容易将end或jion与对应的begin或fork联系起来,尤其是在一个长的块或嵌套的块中。块结尾处的名字是可选的,但如果使用的话,它必须与块起始处的名字相同。例如:
begin: foo // 在begin之后的块名字
…
fork: bar // 具有名字的嵌套的块
…
jion: bar // 必须具有相同的名字
…
end: foo // 必须具有相同的名字
SystemVerilog还允许像C语言一样为单个语句设置标签。语句标签放置在语句的前面,用来标识这条语句。例如:
initial begin
test1: read_enable = 0;
…
test2: for (i=0; i<=255; i++)
…
end
21. 对事件控制的增强
Verilog使用@标记来控制基于特定事件的执行流,SystemVerilog增强了@事件控制。
22. 新的过程
Verilog使用always过程来表示时序逻辑、组合逻辑和锁存逻辑的RTL模型。综合工具和其它软件工具必须根据过程起始处的事件控制列表以及过程内的语句来推断always过程的意图。这种推断会导致仿真结果和综合结果之间的不一致。SystemVerilog增加了三个新的过程来显式地指示逻辑的意图。
? always_ff:表示时序逻辑的过程;
? always_comb:表示组合逻辑的过程;
? always_latch:表示锁存逻辑的过程。
例如:
always_comb @(a or b or sel) begin
if (sel) y = a;
else y = b;
end
软件工具能够检查事件控制敏感列表和过程的内容来保证逻辑的功能匹配过程的类型。例如,工具能够检查一个always_comb过程能够敏感过程内读取的所有外部值,对逻辑的每一个分支的相同变量进行赋值,并且检查分支是否覆盖了所有可能的条件。如果任何一个条件没有满足,软件工具均会报告该过程没有正确建模组合逻辑。
23. 动态过程
Verilog通过使用fork-jion提供了一种静态的并发过程。每一个分支都是一个分离的、并行的过程。fork-jion中任何语句的执行必须在组内的每一个过程完成后才会执行。例如:
initial begin
fork
send_packet_task (1, 255, 0);
send_packet_task (7, 128, 5);
watch_result_task (1, 255, 0);
watch_result_task (7, 128, 5);
jion // 所有的任务必须完成后才会到达这里
end
SystemVerilog通过process关键字加入了一个新的、动态的过程。它为一个过程产生分支,然后继续执行而无需等待其他过程完成。过程不会阻塞过程或任务内的语句执行。这种方式能够建模多线程的过程。例如:
initial begin
process send_packet_task (1, 255, 0);
process send_packet_task (7, 128, 5);
process watch_result_task (1, 255, 0);
process watch_result_task (7, 128, 5);
end // 所有的过程并行运行
24. 任务和函数增强
SystemVerilog为Verilog的任务和函数作了几个增强。
25. 连续赋值的增强
在Verilog中,连续赋值语句的左侧只能是线网类型,例如wire。连续赋值语句被认为是线网的驱动源,而线网可以拥有任意数据的驱动源。SystemVerilog允许除reg类型以外的任何数据类型用于连续赋值语句的左侧。与线网不同,所有其它数据类型被限制为只能有一个连续赋值语句驱动。为相同的变量混合使用连续赋值语句和过程赋值语句是不被允许的。
26. $bit系统函数
在Verilog中没有类似于C语言中sizeof的函数。SystemVerilog加入一个新的$bit内建函数。这个函数返回保存一个值所需的硬件位的数目(一个四态值要求一个硬件位),这个函数还可以用来确定一个结构体所代表的硬件位的数目。
27. `define的增强
SystemVerilog增强了`define编译器指令的能力以便支持将字符串作为宏的参数。宏的文本字符串中可以包含一个隔离的引号,它的前面必须具有一个反勾号(`”),这就允许字符串中包含宏参数。宏文本可以在行的尾部包含一个反斜杠(’’)来表示在下一行继续。如果宏文本字符串中包含反斜杠,则反斜杠应该被放在两个反勾号之间,这样它就不会被认为是Verilog转义标识符的开始。宏文本字符串还可以包含双反勾号(``),它允许标识符能够从参数中构建。这些增强使得`define指令更加灵活。例如:`include指令后可以紧跟一个宏名字来替代一个字符串。
`define f1 “../project_top/opcode_defines”
`include `f1
28. 状态机建模
SystemVerilog允许在更高的抽象层次上对状态机建模。这些结构包括:
29. 断言
SystemVerilog中加入了断言的功能来改善系统的验证过程。
30. 结论
SystemVerilog为Verilog-2001标准提供了一系列的扩展。这些扩展使得大型设计的建模和验证更加容易。
文章评论(0条评论)
登录后参与讨论