I have a queue with some elements representing number of times a particular input is to be generated. So let’s say we have following queue elements:
my_q = {100,50,50,0};
Now, this queue represents the following:
Input at position-0 should come 2 times
Input at position-1 should come 1 times
Input at position-2 should come 1 times
Input at position-3 should come 0 times
So, the input order should be:
0 (Input-0) – 1 (Input-1) – 0 (Input-0) – 2 (Input-2)
So, I made the following code which works on taking the HCF of number and storing them in a queue:
initial begin
int rate[$], mod_rate[$], final_port_seq[$];
int hcf;
int num_slot;
rate = {100,50,50,0};
hcf = find_hcf(rate); // Finds HCF from elements of rate
foreach(rate[i]) begin
num_slot += rate[i]/hcf; // Total number of slots
mod_rate[i] = rate[i]/hcf; // Get number of occurrences of particular element
end
$display("HCF = %0d Number of slots = %0d",hcf, num_slot);
// Need to change the following logic:
for (int i =0; i< num_slot;) begin
foreach (mod_rate[j]) begin
if (mod_rate[j] != 0 ) begin // This keeps the sequence 0-1-2-0
mod_rate[j]--;
final_port_seq[i] = j;
i++;
end
end
end
$display("Final sequence : ");
foreach (final_port_seq[i]) begin
$write(" %0d", final_port_seq[i]);
end
end
end // initial
function int find_hcf(int q[$]);
int min[$];
int max[$];
int q_refined[$];
int flag;
q_refined = q.find(item) with (item !=0); // 0 is port OFF
min = q_refined.min();
max = q_refined.max();
$display("min = %0d max = %0d",min[0],max[0]);
for(int i =min[0];i>0;i--) begin
flag = 0;
foreach(q[j]) begin
if(q[j]%i == 0) flag++;
end
if(flag == q.size()) begin find_hcf = i; break; end
end
endfunction
The code works fine as far as slotting is concerned and I got the following output:
output:
min = 50 max = 100
HCF = 50 Number of slots = 4
Final sequence :
0 1 2 0
But I want to interleave the queue elements and get the output as follows:
Final sequence :
0 1 0 2
Can anyone tell me what kind of logic I need to implement to have interleaved queue elements? The input rate elements can be any other sequence also.