`ifndef ENV_SV // 如果未定义ENV_SV宏,执行以下代码
`define ENV_SV // 定义ENV_SV宏,以防止重复包含
import fifo_params::*; // 导入FIFO参数定义文件
class environment; // 定义了一个名为environment的类
virtual fifoPorts itf; // 虚拟FIFO接口端口
clockGenerator w_clkGen; // 写时钟生成器
clockGenerator r_clkGen; // 读时钟生成器
resetGenerator wrstGen; // 写复位生成器
resetGenerator rrstGen; // 读复位生成器
generator #(DSIZE) gen; // 数据生成器
driver #(DSIZE) drv; // 驱动器
scoreboard #(DSIZE) scb; // 计分板
monitor #(DSIZE) mon; // 监控器
mailbox wbox; // 写邮箱
mailbox rbox; // 读邮箱
mailbox sbox; // 计分板邮箱
function new(virtual fifoPorts itf); // 类的构造函数
this.itf=itf; // 初始化FIFO接口
w_clkGen=new(itf); // 初始化写时钟生成器
r_clkGen=new(itf); // 初始化读时钟生成器
rrstGen=new(itf); // 初始化读复位生成器
wrstGen=new(itf); // 初始化写复位生成器
wbox=new(); // 初始化写邮箱
rbox=new(); // 初始化读邮箱
sbox=new(); // 初始化计分板邮箱
gen=new(sbox); // 初始化数据生成器
drv=new(itf,sbox,wbox); // 初始化驱动器
mon=new(itf,rbox); // 初始化监控器
scb=new(wbox,rbox); // 初始化计分板
gen=new(sbox); // 再次初始化数据生成器(可能是重复代码)
drv=new(itf,sbox,wbox); // 再次初始化驱动器(可能是重复代码)
mon=new(itf,rbox); // 再次初始化监控器(可能是重复代码)
scb=new(wbox,rbox); // 再次初始化计分板(可能是重复代码)
endfunction
extern task wcgu(string msg="wclk",int clk_p=10); // 外部任务:写时钟生成器
extern task rcgu(string msg="rclk",int clk_p=10); // 外部任务:读时钟生成器
extern task wrgu(string msg="wrst",int rst_p=10); // 外部任务:写复位生成器
extern task rrgu(string msg="rrst",int rst_p=10); // 外部任务:读复位生成器
extern task compareResult; // 外部任务:比较结果
extern task fifoWrite(input int putInMbx=1,int writeNumber=16); // 外部任务:FIFO写操作
extern task fifoRead(input int putInMbx=1,int readNumber=16); // 外部任务:FIFO读操作
extern task dispMbx; // 外部任务:显示邮箱内容
extern task gendata(int sendNumber=16); // 外部任务:生成数据
endclass
task environment::wcgu(string msg="wclk",int clk_p=10); // 写时钟生成器任务定义
w_clkGen.clkGenerator (msg,clk_p); // 调用写时钟生成器的时钟生成方法
endtask
task environment::rcgu(string msg="rclk",int clk_p=10); // 读时钟生成器任务定义
r_clkGen.clkGenerator(msg,clk_p); // 调用读时钟生成器的时钟生成方法
endtask
task environment::wrgu(string msg="wrst",int rst_p=10); // 写复位生成器任务定义
wrstGen.rstGenerator(msg,rst_p); // 调用写复位生成器的复位生成方法
endtask
task environment::rrgu(string msg="rrst",int rst_p=10); // 读复位生成器任务定义
rrstGen.rstGenerator(msg,rst_p); // 调用读复位生成器的复位生成方法
endtask
task environment::gendata(int sendNumber=16); // 生成数据任务定义
gen.send(sendNumber); // 调用数据生成器的发送数据方法
endtask
task environment::fifoWrite(input int putInMbx=1,int writeNumber=16); // FIFO写任务定义
drv.Write(putInMbx,writeNumber); // 调用驱动器的写方法
endtask
task environment::fifoRead(input int putInMbx=1,int readNumber=16); // FIFO读任务定义
mon.Read(putInMbx,readNumber); // 调用监控器的读方法
endtask
task environment::compareResult; // 比较结果任务定义
scb.compareData(); // 调用计分板的数据比较方法
endtask
task environment::dispMbx; // 显示邮箱内容任务定义
scb.printMbxContent(wbox,"Golden Input is"); // 调用计分板的打印邮箱内容方法(显示Golden Input)
scb.printMbxContent(rbox,"Actual output is"); // 调用计分板的打印邮箱内容方法(显示Actual output)
endtask
`endif // 结束ifdef条件判断