covergroup cg_apb_write_read_order_group @(posedge clk iff (rstn && penable));
write_read_order: coverpoint pwrite{
bins write_write = (1 => 1);
bins write_read = (1 => 0);
bins read_write = (0 => 1);
bins read_read = (0 => 0);
}
endgroup
这段代码定义了一个名为 cg_apb_write_read_order_group 的 covergroup,用于收集 APB 总线写操作和读操作顺序的覆盖率信息。让我们逐行分析:
covergroup cg_apb_write_read_order_group @(posedge clk iff (rstn && penable));: 这行代码定义了 covergroup。
cg_apb_write_read_order_group: covergroup 的名称。
@(posedge clk): 指定在时钟 clk 的上升沿采样数据。
iff (rstn && penable): 指定只有在复位信号 rstn 为高电平且使能信号 penable 为高电平的情况下才进行采样。 这确保了只有在系统正常工作时才收集覆盖率数据。
write_read_order: coverpoint pwrite { … };: 这行代码定义了一个名为 write_read_order 的 coverpoint。
write_read_order: coverpoint 的名称。
coverpoint pwrite: 指定要监控的信号是 pwrite。 pwrite 信号应该是一个布尔类型的信号,表示 APB 总线当前是否进行写操作 (1 表示写操作,0 表示读操作)。
bins write_write = (1 => 1);: 定义了一个名为 write_write 的 bin。
(1 => 1): 表示当 pwrite 的值为 1(写操作)且前一个周期 pwrite 也为 1(写操作)时,该 bin 的计数器加 1。 这代表连续两次写操作。
bins write_read = (1 => 0);: 定义了一个名为 write_read 的 bin。
(1 => 0): 表示当 pwrite 的值为 1(写操作)且前一个周期 pwrite 为 0(读操作)时,该 bin 的计数器加 1。 这代表写操作后紧接着读操作。
bins read_write = (0 => 1);: 定义了一个名为 read_write 的 bin。
(0 => 1): 表示当 pwrite 的值为 0(读操作)且前一个周期 pwrite 为 1(写操作)时,该 bin 的计数器加 1。 这代表读操作后紧接着写操作。
bins read_read = (0 => 0);: 定义了一个名为 read_read 的 bin。
(0 => 0): 表示当 pwrite 的值为 0(读操作)且前一个周期 pwrite 也为 0(读操作)时,该 bin 的计数器加 1。 这代表连续两次读操作。
总结:
这个 covergroup 用于分析 APB 总线上的写操作和读操作的顺序。它通过四个 bin 来统计连续两次写操作、写后读、读后写、连续两次读操作的次数。 iff 条件确保只在系统正常运行时收集覆盖率数据。 为了让这个 covergroup 正确工作,需要在 covergroup 外部维护 pwrite 信号的前一个周期的值,以便进行连续操作的判断。 通常,会在测试平台中实例化这个 covergroup 并定期调用 sample() 方法来收集覆盖率数据。 最后,使用 report() 方法查看覆盖率结果。