To cover different memory address ranges, we have three bins per range, start address, end address and mid address range. To identify the range address easily, is there any way to declare bins name with address details?
I tried to use a macro as below.
// Macro
`define MEM_CP(addr,first_addr,last_addr)\
coverpoint ``addr`` {\
bins start_addr_0x``first_addr`` = {``first_addr``};\
bins end_addr_0x``last_addr`` = {``last_addr``};\
bins mid_addr_range = {[(``first_addr``+1):(``last_addr``-1)]};\
}
// Cover group having different memory ranges
covergroup mem_cg ();
`MEM_CP(mem_addr, range1_start_addr, range1_end_addr)
`MEM_CP(mem_addr, range2_start_addr, range2_end_addr)
...
`MEM_CP(mem_addr, rangeN_start_addr, rangeN_end_addr)
endgroup // mem_cg
But this way declares bins name with variable name instead of address value stored in it.
In another words,
// Let's say
range1_start_addr = 0x1111
range1_end_addr = 0xFFFF
// Expected bins name:
bins start_addr_0x1111 ...
bins end_addr_0xFFFF ...
// Unlike the above macro output:
bins start_addr_0xrange1_start_addr ...
bins end_addr_0xrange1_end_addr ...
PS: I can't give bins name with address directly because of multiple ranges and addresses per range may change as per the memory allocation.