functional coverage
作者:互联网
cp_x: coverpoint x{
bins mod3[] = {[0:255]} with (item % 3 == 0);
}
cp_b: coverpoint b{
bins func[] = cp_b with (myfunc(item));
}
///
class sram_monitor;
virtual sram_interface sram_vif;
covergroup cg_read with function sample(int addr, );
cp_addr: coverpoint addr {
bins valid[] = {[0:63]};
}
cp_addr_region: coverpoint addr{
bins min = {0};
bins max = {63};
bins boundary[] = {1,2,61,62};//4 bins: boundary_1,boundary_2,...
bins others[] = default;//values not lie within any of the above
}
endgroup
bins fixed[4] = { [1:10], 1, 4, 7 };
covergroup cg_sram_rw with function sample(mem_rw req);
cp_rw: coverpoint req.rw;
cp_addr: coverpoint req.addr {bins valid[] = {[0:63]};}
cp_wdata: coverpoint req.wdata iff(req.rw==WRITE);
cp_rdata: coverpoint req.wdata iff(req.rw==READ);
cp_rw_X_cp_addr: cross cp_rw, cp_addr;
endgroup
coverpoint a
{
bins valid[] = {[4:6]};
ignore_bins ignore_vals = {7,8};
illegal_bins bad_vals = {1,2,3};
}
endgroup
function new();
cg_read = new();
endfunction
task monitor_read();
while (1) begin
@(posedge sram_vif.clk);
if (sram_vif.cs & (~sram_vif.we)) begin
$display("@%0t:sample coverage for addr=%0d!", $time(), sram_vif.read_addr);
cg_read.sample(sram_vif.read_addr);
end
end
endtask
endclass
// Code example of functional coverage model
covergroup tx_word_format_cg
WORD_LENGTH: coverpoint lcr[1:0] {
bins bits_5 = {0};
bins bits_6 = {1};
bins bits_7 = {2};
illegal_bins bits_8 = {3};
}
STOP_BITS: coverpoint lcr[2] {
bins stop_1 = {0};
bins stop_2 = {1};
}
PARITY: coverpoint lcr[5:3] {
bins no_parity = {3’b000, 3’b010, 3’b100, 3’b110};
bins even_parity = {3’b011};
bins odd_parity = {3’b001};
bins stick1_parity = {3’b101};
bins stick0_parity = {3’b111};
}
WORD_FORMAT: cross WORD_LENGTH, STOP_BITS, PARITY;
endgroup: tx_word_format_cg
标签:rw,addr,sram,coverpoint,functional,coverage,cp,bins 来源: https://www.cnblogs.com/igabriel/p/15249699.html