目录
2、SystemVerilog——过程块和方法(initial、always、task、function、automatic和static)
2、SystemVerilog——过程块和方法(initial、always、task、function、automatic和static)
2.1initial和always
- always、module、interface:硬件世界
- program,class:软件世界
从硬件实现的角度来看,Verilog通过always,initial过程语句块、信号数据连接来实现进程间通信,我们将不同的module作为独立的程序块,他们之间的通信和同步通过信号的变化(event触发)或者通过等待特定事件(时钟周期)或者时间(固定延时)来完成。
2.1.1always
1)always是为了描述硬件的行为,而在使用时需要注意哪种使用方式是时序电路描述,哪种使用方式是组合电路描述。
2)always中的@(event..)敏感列表是为了模拟硬件信号的触发行为,同学们需要正确对标硬件行为和always过程块描述。
3)always过程块是用来描述硬件时序电路和组合电路,只可以在module或者interface中使用。
2.1.2initial
1)initial与always在执行路径上有明显区别,initial非常符合软件的执行方式,即只执行一次。
2)initial和always一样,无法被延迟执行,即在仿真一开始它们都会同时执行,而不同的initial和always之间在执行顺序上没有顺序可言,不能将它们在代码中的前后顺序与它们的执行顺序画上等号。
3)initial从其执行路径的属性来看,它不应该存在于硬件设计代码中,它本身不可综合,对于描述电路没有任何帮助。
4)initial是为了测试而生的,由于测试需要按照时间顺序的习惯,即软件方式。
5)在Verilog时代,所有的测试语句都可以被放置在initial中,为了便于统一管理测试顺序,建议将有关测试语句都放置在同一个initial过程块中。
6)initial过程块可以在module、interface和program中使用。对于过程块的书写方式,需要使用begin..end将其作用域包住,同样适用于控制语句、循环语句等等。
2.2task和function
2.2.1函数function
1)可以在参数列表中指定输入参数(input)、输出参数(output).输入输出参数(inout)或者引用参数(ref)。
2)返回数值或者不返回数值(void)。
3)默认的数据类型是为logic,例如input [7:0] addr。数组可以作为形式参数传递。
4)function可以返回或者不返回结果,如果返回即需要用关键词return ,如果不返回则应该在声明function时采用void function().
5)只有数据变量可以在形式参数列表中被声明为ref类型,而线网类型则不能被声明为ref类型。
6)在使用ref时,有时候为了保护数据对象只被读取不被写入,可以通过const的方式来限定ref声明的参数。
7)在声明参数时,可以给定默认数值,例如input[7:0] addr = 0,同时在调用时如果省略该参数的传递,那么默认值即会被传递给function。
2.2.2任务task
1)task无法通过return返回结果,因此只能通过output、 inout或者ref的参数来返回