PROBLEM STATEMENT:
- Suppose you have a memory of depth = 100, you are tasked to generate 4 memory banks of size =10.
- Condition, memory banks must be non-overlapping.
ANALYSIS:
- The trick here is not get carried by the simplicity of the question and start coding away.
- The question though sounds easy at first, will get complicated when you start coding the constraints.
- We should first start with marking boundary for the banks
- In this case we started with first bank and made sure that the start address is always between 0-60
- why 60 ? The answer is simple, memory depth is 100, number of banks are 4, and size of each bank is 10. Therefore if the start address of first bank is <= 60, we can have rest of the banks in the other remaining locations. There won't be an overflow.
- Once the start address of first bank is generated, it is easy to mark the end address, start_address+bank_size-1
- The start address for the second bank must be greater than the end address of first bank and the range must be between 0:70. Reason? Similar to point (5).
- The other 2 banks follow the suite.
- Now comes the question of limiting the position of each bank, first bank always occupy the lower locations and last one will occupy higher locations.
- This can be solved by simply shuffling the queue/array in which we store the start_address during post_randomization().
- There can be many other ways to write the constraint, but I found this quite simple and will not stress of the constraint solver.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | class mem_banks; parameter MEMORY = 100; parameter BANK_SIZE = 10; parameter NO_OF_BANKS = 4; rand bit [31:0] addr_min[NO_OF_BANKS]; rand bit [31:0] addr_max[NO_OF_BANKS]; int total_mem = BANK_SIZE * NO_OF_BANKS; constraint a_addr { foreach (addr_min[i]) { if(i==0) addr_min[i] inside {[0:(MEMORY-total_mem)]}; else { addr_min[i] inside {[0:(MEMORY-total_mem)+(BANK_SIZE*i)]}; addr_min[i] > addr_max[i-1]; } addr_max[i] == addr_min[i]+BANK_SIZE-1; } } function void post_randomize(); addr_min.shuffle(); foreach(addr_min[i]) $display("ADDR_MIN:%d ADDR_MAX:%d",addr_min[i],addr_min[i]+BANK_SIZE-1); endfunction: post_randomize endclass: mem_banks module top; mem_banks m; initial begin m = new; repeat(2) begin void'(m.randomize()); $display("======================================"); end end endmodule: top |
RESULTS:
Chronologic VCS simulator copyright 1991-2021
Contains Synopsys proprietary information.
Compiler version S-2021.09; Runtime version S-2021.09; Jan 26 09:47 2023
ADDR_MIN: 5 ADDR_MAX: 14
ADDR_MIN: 69 ADDR_MAX: 78
ADDR_MIN: 39 ADDR_MAX: 48
ADDR_MIN: 15 ADDR_MAX: 24
======================================
ADDR_MIN: 90 ADDR_MAX: 99
ADDR_MIN: 40 ADDR_MAX: 49
ADDR_MIN: 63 ADDR_MAX: 72
ADDR_MIN: 13 ADDR_MAX: 22
======================================
V C S S i m u l a t i o n R e p o r t
Time: 0 ns
CPU Time: 0.480 seconds; Data structure size: 0.0Mb
Thu Jan 26 09:47:17 2023