IC验证学霸笔记3——SV 过程块和方法
1.过程语句
1.1 initialinitial从其执行路径的属性来看,他不应该存在与硬件设计代码中,它本身不可综合,对于电路的描述没有任何帮助。
在Verilog中,所有测试语句都可以放在initial中,为了便于管理测试顺序,建议将有关测试语句都放置在同一个initial过程中。
initial 过程块可以在module,interface 和 program中使用。
1.2.always
always_comb:组合逻辑语句块
always_latch:锁存逻辑语句块
always_ff: 时序逻辑语句块
1.2.1 always_comb3.always_comb 禁止变量共享,即赋值左侧的变量无法被同一个过程块赋值;
4.系统会在仿真时时自动检查该语句块,如果其所表示的不是组合逻辑,系统会发出警告。
1.always_latch表示锁存逻辑,且自动插入敏感列表;
2.系统会在仿真时时自动检查该语句块,如果其所表示的不是锁存逻辑,系统会发出警告。
注意:在一般的同步设计中是不允许(或至少不推荐)使用latch式设计.2.敏感列表必须指明posedge 或negedge,才能使得EDA工具实现同步或者异步复位逻辑。
3. EDA工具会验证always_ff语句块是否实现了时序逻辑。
2.语句块
2.1 串行语句块
串行语句块采用的关键字”begin...end",其中的语句按串行方式顺序执行,可以用于可综合电路和仿真测试程序。1.串行语句块中的每条语句依据块中的排列次序逐条执行。块中每条语句给出的延迟时间都是相对于前一条语句执行结束的相对时间。
2.串行语句块的起始执行时间就是串行语句块中第一条语句开始执行的时间;串行语句块的结束时间就是块中最后一条语句执行结束的时间。
2.2 并行语句块
并行语句块采用的关键字”fork...join",其中的语句按并行方式执行,只能用于仿真测试程序,不可用于可综合电路设计。1.并行语句块中的每条语句同时执行。即程序流程控制已进入到该并行语句块,块内语句则同时开始执行。
2.块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间。
在SV中,经常用到 fork...join_none 和 fork...join_any
3.方法和函数
二者区别最重要的一点是,任务task可以消耗时间而函数function不能。也就是说在函数里边不能出现带有诸如#100的时延语句或诸如@(posedge colock),wait(ready)的阻塞语句,当然也不能调用任务。另外,Verilog中函数必须要有返回值,且返回值必须被使用。3.1 function
在SV 中,function可以在参数列表中指定参数传输方向(input输入参数,output输出参数,inout输入输出参数,ref引用参数),默认为input,可以返回数值(return)或者不返回数值(void)。1.默认的数据类型为logic;
2.数组可以作为形式参数传递;
3.只有数组变量可以在形式参数列表中声明为ref类型,线网类型不能声明为ref类型;
4.在使用ref时,有时候为了保护数据对象只被读取不被写入,可以通过const的方式限定ref声明的参数。
3.2 task
task无法通过return返回结果,只能通过output、inout或者ref的参数返回。
task内部可以置入耗时语句,如@event、wait event、# delay;
4 子程序参数
缺省的类型和方向是:logic inputV对参数的处理方式很简单:在子程序的开头把input和inout的值复制给本地变量,在子程序退出时则复制output和inout的值。
SV中,参数的传递方式可以指定为引用而不是复制,ref参数类型比input,output,inout更好用。