1.module(模块)的结构组成:
例如,上升沿D触发器:
module dff(din,clk,q);
input din,clk;
output q;
reg q;
always@(posedge clk)
q<=din;
endmodule
2.class(类)的结构组成:
class封装了数据和操作这些数据的子程序(包括task和function)。
例如:
class Transaction;
logic[31:0] addr,crc,data[8];
function new;
addr=3;
foreach (data[i])
data[i]=5;
endfunction
endclass
3.task的结构组成:
在第一行的任务名后面不能出现输入、输出端口列表;task可以没有返回值;task可以调用其他的task和function;task对于返回值没有限制。
task的调用格式:
<任务名>(端口1,端口2,……,端口n)
task<任务名>;
端口和类型声明
局部变量声明
begin
语句1;
语句2;
……
end
endtask
4.function的结构组成:
function内不含有时延、时序、事件控制结构;只有一个返回值。在第一行function语句块中不能出现端口名列表。
function<返回值类型或位宽><函数名>
<输入参量与类型声明>
<局部变量声明>
begin
语句1;
语句2;
……
语句n;
end
endfunction
function的调用:
<函数名>(<输入表达式1>,<输入表达式2>……<输入表达式n>);
5.package的结构组成:
package可以解决类的归属问题;可以在多个module、interface、program中共享parameter、data、type、task、function、class等方法。
例如:
package regs_pkg;
'include "stimulator.sv"
'include "monitor.sv"
'include "chker.sv"
endpackage
package将命名空间分隔开,这样使用不同package中的同名类时只要注明使用哪一个package中的即可。(域名检索操作符::)
module mcdf_tb;
regs_pkg::monitor mon1=new();
arb_pkg::monitor mon2=new();
endmodule
6.program的结构组成:
为避免仿真和设计竞争问题(race condition),systemverilog中引入了program的概念。
PS:program的注意事项:
1.program中不能例化其他program和module;不能出现always;program内部可以发起多个initial块。
2.program中的initial块和module中的initial块执行位置不同,前者在reactive,后者在active块中执行。
3.program中存在的多个initial块中,如果有一个initial采用了退出系统函数$exit(),则会结束该program,而不仅仅是该initial块。