数字IC验证:System Verilog学习 - 过程语句与控制流

文章目录

  • 1 引言Introduction
  • 2 选择语句Selection Statements
    • 2.1 if 语句
    • 2.2 case语句
    • 2.3 case inside语句
    • 2.4 例程unique_priority.sv
  • 3 循环语句Loop Statement
    • 3.1 例程:do_while_loop.sv
    • 3.2 例程:for_loop.sv
    • 3.3 例程:foreach_loop.sv
  • 4 跳转语句Jump Statement
    • 4.1 例程:break_loop.sv
    • 4.2 例程:continue_loop.sv
    • 4.3 例程:return_function.sv
    • 4.4 例程:return_value_function.sv
  • 5 final语句块
    • 5.1 例程:final_block.sv

写在前面:最近实习期间自学System Verilog,找到一个英文教程Asic-world/system verilog,写得挺好的,主要通过代码示例进行学习。因此翻译下来作为巩固与分享,其中也额外增加了补充内容。英文原文入口:Asic-World (Procedural Statements And Control Flow)。Copyright: Deepak Kumar Tala。文中的所有例程会上传到我的资源中。
若有任何翻译不当之处,请在评论区指正,感谢!

1. 文中“System Verilog”简写为“SV”
2. 正文中加粗的都为Verilog或System Verilog中定义的关键词keywords

1 引言Introduction

Verilog & System Verilog(以下简称“SV”)的过程控制通过以下语句实现:

  • inital:仿真开始时执行一次
  • final:(SV中新加的)仿真结束前执行一次
  • always:(SV中新加的)always_comb, always_latch, always_ff,在仿真中循环执行
  • task:每当task被调用时执行
  • function:每当function被调用时执行,且有返回值

在进程内部,SV有以下类型的控制流:

  • 选择selection, 循环loops, 跳转jumps:SV增加了类似C语言的do…whilebreakcontinue等语句
  • 任务task,函数function的调用:SV中为function增加了返回值
  • 顺序sequential和并行parellel块
  • 时序控制

补充:verilog与SV中,任务task和函数function的区别

  1. (verilog和SV中)任务task可以消耗时间而函数function不能。即function内部不能带如 #100 的延时,或如 @(posedge clock), wait(ready) 等阻塞语句
  2. (verilog中)函数function内部不能调用任务task(因为task消耗时间);(SV中)函数function可以调用任务task,但一定要在fork…join_none语句生成的线程中调用
  3. (verilog中)函数function必须有返回值return且返回值必须被使用(如用到赋值语句中);(SV中)函数function可以没有返回值,需要定义为void function且内部不消耗时间

2 选择语句Selection Statements

2.1 if 语句

Verilog中,if 表达式被看作是布尔值boolean,因此若if的条件是0或者X,则为false
SV中加入了关键词uniquepriority,可以写在if前面 => 在if没有条件匹配时会报运行错误runtime error,除非有一个显式的else语句则不报错。即在没有else时,用了uniquepriority,则一定要能够匹配if,否则报错:

  • unique if (…):会检查只能有一个if,否则报错。具体来说,对于多个if…else…if…,只能有其中一个条件为true,否则会报错。若所有条件都为false且最后一个if没有对应的else,也报错。
  • priority if (…):多个if有优先级。具体来说,对于多个if…else…if…,跳入判断有前后优先级。若所有条件都为false且最后一个if没有对应的else,也报错。

2.2 case语句

verilog中,case语句有三种:case, casez, casex

补充:case, casez, casex

  1. case:逐一比较,按位比较
  2. casez:按位比较时若有的位=z,则跳过该位的比较(当成相等)
  3. casex:忽略x与z
  4. 三者都可综合,综合结果一样
  5. casez/casex时,可以用**?**来表示无关的值
    参考资料:Verilog语言中case、casex、casez的用法和区别

SV中,每个case/casez/casex前都可以加关键词uniquepriority

  • unique case/casez/casexunique会检查所有case/casez/casex没有重复/重叠,否则报错。
  • priority case/casez/casex:只执行第一个匹配到的case/casez/casex

2.3 case inside语句

case(…) inside可以用于属于/不属于集合的判断,而不只是相等/不相等的判断。具体见2.4的例程。

2.4 例程unique_priority.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第1张图片
数字IC验证:System Verilog学习 - 过程语句与控制流_第2张图片
仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第3张图片
数字IC验证:System Verilog学习 - 过程语句与控制流_第4张图片

3 循环语句Loop Statement

Verilog 提供了for, while, repeat, forever循环。
SV加强了for循环,且加了do…whileforeach

  • do … while(…):类似C语言
  • SV增加了for循环嵌套
  • foreach用于遍历数组的每一个元素

3.1 例程:do_while_loop.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第5张图片
仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第6张图片

补充:SV中的占位符
%h或%H:hexidecimal, 以十六进制数的形式输出
%d或%D:decimal, 以十进制数的形式输出
%o或%O:octal, 以八进制数的形式输出
%b或%B:binary, 以二进制数的形式输出
%c或%C:char, 以ASCII码字符的形式输出
%v或%V:输出网络型数据信号强度
%m或%M:输出等级层次的名字
%s或%S:string, 以字符串的形式输出
%t或%T:time, 以当前的时间格式输出
%e或%E:exponential, 以指数的形式输出实型数
%f或%F:float, 以十进制数的形式输出实型数
%g或%G:general, 以指数或十进制数的形式输出实型数,无论何种格式都以较短的结果输出

3.2 例程:for_loop.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第7张图片
仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第8张图片

补充:SV中创建线程的语句fork…join/join_any/join_none

  1. fork…join:内部语句并发执行,但内部若有begin…end,则begin…end中的语句还是顺序执行
  2. fork…join_any:任何一个子线程被调用,父线程都会继续运行
  3. fork…join_none:父线程和子线程同时运行(父线程优先级更高)

3.3 例程:foreach_loop.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第9张图片
仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第10张图片

4 跳转语句Jump Statement

SV中添加了C语言的跳转语句:break, continue, return

4.1 例程:break_loop.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第11张图片
仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第12张图片

4.2 例程:continue_loop.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第13张图片

仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第14张图片

4.3 例程:return_function.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第15张图片
仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第16张图片

4.4 例程:return_value_function.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第17张图片

仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第18张图片

5 final语句块

finalinitial类似,是一个过程语句块。二者不同的是,final是在仿真结束前执行的,且final语句不会作为一个单独的进程执行,其本身没有延迟(执行时间为0),类似函数调用。final语句块常用于打印仿真相关的数据信息。
final语句块内部唯一可以使用的语句是那些允许在函数声明中使用的语句,即可以在一个仿真周期内执行完毕的语句。

5.1 例程:final_block.sv

数字IC验证:System Verilog学习 - 过程语句与控制流_第19张图片
仿真输出:
数字IC验证:System Verilog学习 - 过程语句与控制流_第20张图片

你可能感兴趣的:(数字IC验证,systemverilog)