2020-01-23 06:22:50 +08:00
|
|
|
#!/usr/bin/perl
|
|
|
|
#use strict;
|
|
|
|
#use warnings;
|
|
|
|
|
|
|
|
my $RV_ROOT = $ENV{RV_ROOT};
|
|
|
|
|
|
|
|
my $TOTAL_INT=$ARGV[0];
|
|
|
|
print "// argv=".$ARGV[0]."\n";
|
|
|
|
my $NUM_LEVELS;
|
|
|
|
if($TOTAL_INT==2){$NUM_LEVELS=1;}
|
|
|
|
elsif ($TOTAL_INT==4){$NUM_LEVELS=2;}
|
|
|
|
elsif ($TOTAL_INT==8){$NUM_LEVELS=3;}
|
|
|
|
elsif ($TOTAL_INT==16){$NUM_LEVELS=4;}
|
|
|
|
elsif ($TOTAL_INT==32){$NUM_LEVELS=5;}
|
|
|
|
elsif ($TOTAL_INT==64){$NUM_LEVELS=6;}
|
|
|
|
elsif ($TOTAL_INT==128){$NUM_LEVELS=7;}
|
|
|
|
elsif ($TOTAL_INT==256){$NUM_LEVELS=8;}
|
|
|
|
elsif ($TOTAL_INT==512){$NUM_LEVELS=9;}
|
|
|
|
elsif ($TOTAL_INT==1024){$NUM_LEVELS=10;}
|
|
|
|
else {$NUM_LEVELS=int(log($TOTAL_INT)/log(2))+1;}
|
|
|
|
print ("// TOTAL_INT=".$TOTAL_INT." NUM_LEVELS=".$NUM_LEVELS."\n");
|
|
|
|
$next_level = 1;
|
|
|
|
print ("`ifdef RV_PIC_2CYCLE\n");
|
|
|
|
if($TOTAL_INT > 2){
|
|
|
|
print ("// LEVEL0\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [INTPRIORITY_BITS-1:0] level_intpend_w_prior_en_".$next_level.";\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [ID_BITS-1:0] level_intpend_id_".$next_level.";\n");
|
|
|
|
print (" for (m=0; m<=(TOTAL_INT)/(2**(".$next_level.")) ; m++) begin : COMPARE0\n");
|
|
|
|
print (" if ( m == (TOTAL_INT)/(2**(".$next_level."))) begin \n");
|
|
|
|
print (" assign level_intpend_w_prior_en_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" assign level_intpend_id_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" end\n");
|
2020-11-18 02:25:18 +08:00
|
|
|
print (" cmp_and_mux #(\n");
|
2020-01-23 06:22:50 +08:00
|
|
|
print (" .ID_BITS(ID_BITS),\n");
|
|
|
|
print (" .INTPRIORITY_BITS(INTPRIORITY_BITS)) cmp_l".$next_level." (\n");
|
|
|
|
print (" .a_id(level_intpend_id[0][2*m]),\n");
|
|
|
|
print (" .a_priority(level_intpend_w_prior_en[0][2*m]),\n");
|
|
|
|
print (" .b_id(level_intpend_id[0][2*m+1]),\n");
|
|
|
|
print (" .b_priority(level_intpend_w_prior_en[0][2*m+1]),\n");
|
|
|
|
print (" .out_id(level_intpend_id_".$next_level."[m]),\n");
|
|
|
|
print (" .out_priority(level_intpend_w_prior_en_".$next_level."[m])) ;\n");
|
|
|
|
print (" \n");
|
|
|
|
print (" end\n\n");
|
|
|
|
for (my $l=1; $l<int($NUM_LEVELS/2) ; $l++) {
|
|
|
|
$next_level = $l+1;
|
|
|
|
print ("// LEVEL".$l."\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [INTPRIORITY_BITS-1:0] level_intpend_w_prior_en_".$next_level.";\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [ID_BITS-1:0] level_intpend_id_".$next_level.";\n");
|
|
|
|
print (" for (m=0; m<=(TOTAL_INT)/(2**(".$next_level.")) ; m++) begin : COMPARE$l\n");
|
|
|
|
print (" if ( m == (TOTAL_INT)/(2**(".$next_level."))) begin \n");
|
|
|
|
print (" assign level_intpend_w_prior_en_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" assign level_intpend_id_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" end\n");
|
2020-11-18 02:25:18 +08:00
|
|
|
print (" cmp_and_mux #(\n");
|
2020-01-23 06:22:50 +08:00
|
|
|
print (" .ID_BITS(ID_BITS),\n");
|
|
|
|
print (" .INTPRIORITY_BITS(INTPRIORITY_BITS)) cmp_l".$next_level." (\n");
|
|
|
|
print (" .a_id(level_intpend_id_".$l."[2*m]),\n");
|
|
|
|
print (" .a_priority(level_intpend_w_prior_en_".$l."[2*m]),\n");
|
|
|
|
print (" .b_id(level_intpend_id_".$l."[2*m+1]),\n");
|
|
|
|
print (" .b_priority(level_intpend_w_prior_en_".$l."[2*m+1]),\n");
|
|
|
|
print (" .out_id(level_intpend_id_".$next_level."[m]),\n");
|
|
|
|
print (" .out_priority(level_intpend_w_prior_en_".$next_level."[m])) ;\n");
|
|
|
|
print (" \n");
|
|
|
|
print (" end\n\n");
|
|
|
|
}
|
|
|
|
### ADD FLOP STAGE
|
|
|
|
print ("for (i=0; i<=TOTAL_INT/2**(NUM_LEVELS/2) ; i++) begin : MIDDLE_FLOPS\n");
|
|
|
|
print (" rvdff #(INTPRIORITY_BITS) level2_intpend_prior_reg (.*, .din (level_intpend_w_prior_en_".$next_level."[i]), .dout(l2_intpend_w_prior_en_ff[i]), .clk(active_clk));\n");
|
|
|
|
print (" rvdff #(ID_BITS) level2_intpend_id_reg (.*, .din (level_intpend_id_".$next_level."[i]), .dout(l2_intpend_id_ff[i]), .clk(active_clk));\n");
|
|
|
|
print ("end\n");
|
|
|
|
}else{
|
|
|
|
print ("for (i=0; i<=TOTAL_INT/2**(NUM_LEVELS/2) ; i++) begin : MIDDLE_FLOPS\n");
|
|
|
|
print (" rvdff #(INTPRIORITY_BITS) level2_intpend_prior_reg (.*, .din (level_intpend_w_prior_en[0][i]), .dout(l2_intpend_w_prior_en_ff[i]), .clk(active_clk));\n");
|
|
|
|
print (" rvdff #(ID_BITS) level2_intpend_id_reg (.*, .din (level_intpend_id[0][i]), .dout(l2_intpend_id_ff[i]), .clk(active_clk));\n");
|
|
|
|
print ("end\n");
|
|
|
|
}
|
|
|
|
### END FLOP STAGE
|
|
|
|
$next_level = int($NUM_LEVELS/2) + 1;
|
|
|
|
my $tmp = int($NUM_LEVELS/2);
|
|
|
|
print ("// LEVEL".$tmp."\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [INTPRIORITY_BITS-1:0] levelx_intpend_w_prior_en_".$next_level.";\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [ID_BITS-1:0] levelx_intpend_id_".$next_level.";\n");
|
|
|
|
print (" for (m=0; m<=(TOTAL_INT)/(2**(".$next_level.")) ; m++) begin : COMPARE$tmp\n");
|
|
|
|
print (" if ( m == (TOTAL_INT)/(2**(".$next_level."))) begin \n");
|
|
|
|
print (" assign levelx_intpend_w_prior_en_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" assign levelx_intpend_id_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" end\n");
|
2020-11-18 02:25:18 +08:00
|
|
|
print (" cmp_and_mux #(\n");
|
2020-01-23 06:22:50 +08:00
|
|
|
print (" .ID_BITS(ID_BITS),\n");
|
|
|
|
print (" .INTPRIORITY_BITS(INTPRIORITY_BITS)) cmp_l".$next_level." (\n");
|
|
|
|
print (" .a_id(levelx_intpend_id[$tmp][2*m]),\n");
|
|
|
|
print (" .a_priority(levelx_intpend_w_prior_en[$tmp][2*m]),\n");
|
|
|
|
print (" .b_id(levelx_intpend_id[$tmp][2*m+1]),\n");
|
|
|
|
print (" .b_priority(levelx_intpend_w_prior_en[$tmp][2*m+1]),\n");
|
|
|
|
print (" .out_id(levelx_intpend_id_".$next_level."[m]),\n");
|
|
|
|
print (" .out_priority(levelx_intpend_w_prior_en_".$next_level."[m])) ;\n");
|
|
|
|
print (" \n");
|
|
|
|
print (" end\n\n");
|
|
|
|
for (my $l=int($NUM_LEVELS/2)+1; $l<$NUM_LEVELS ; $l++) {
|
|
|
|
$next_level = $l+1;
|
|
|
|
print ("// LEVEL".$l."\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [INTPRIORITY_BITS-1:0] levelx_intpend_w_prior_en_".$next_level.";\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [ID_BITS-1:0] levelx_intpend_id_".$next_level.";\n");
|
|
|
|
print (" for (m=0; m<=(TOTAL_INT)/(2**(".$next_level.")) ; m++) begin : COMPARE$l\n");
|
|
|
|
print (" if ( m == (TOTAL_INT)/(2**(".$next_level."))) begin \n");
|
|
|
|
print (" assign levelx_intpend_w_prior_en_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" assign levelx_intpend_id_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" end\n");
|
2020-11-18 02:25:18 +08:00
|
|
|
print (" cmp_and_mux #(\n");
|
2020-01-23 06:22:50 +08:00
|
|
|
print (" .ID_BITS(ID_BITS),\n");
|
|
|
|
print (" .INTPRIORITY_BITS(INTPRIORITY_BITS)) cmp_l".$next_level." (\n");
|
|
|
|
print (" .a_id(levelx_intpend_id_".$l."[2*m]),\n");
|
|
|
|
print (" .a_priority(levelx_intpend_w_prior_en_".$l."[2*m]),\n");
|
|
|
|
print (" .b_id(levelx_intpend_id_".$l."[2*m+1]),\n");
|
|
|
|
print (" .b_priority(levelx_intpend_w_prior_en_".$l."[2*m+1]),\n");
|
|
|
|
print (" .out_id(levelx_intpend_id_".$next_level."[m]),\n");
|
|
|
|
print (" .out_priority(levelx_intpend_w_prior_en_".$next_level."[m])) ;\n");
|
|
|
|
print (" \n");
|
|
|
|
print (" end\n\n");
|
|
|
|
}
|
|
|
|
print ("assign claimid_in[ID_BITS-1:0] = levelx_intpend_id_".$next_level."[0] ; // This is the last level output\n");
|
|
|
|
print ("assign selected_int_priority[INTPRIORITY_BITS-1:0] = levelx_intpend_w_prior_en_".$next_level."[0] ;\n");
|
|
|
|
print ("`else\n");
|
|
|
|
$next_level = 1;
|
|
|
|
print ("// LEVEL0\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [INTPRIORITY_BITS-1:0] level_intpend_w_prior_en_".$next_level.";\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [ID_BITS-1:0] level_intpend_id_".$next_level.";\n");
|
|
|
|
print (" for (m=0; m<=(TOTAL_INT)/(2**(".$next_level.")) ; m++) begin : COMPARE0\n");
|
|
|
|
print (" if ( m == (TOTAL_INT)/(2**(".$next_level."))) begin \n");
|
|
|
|
print (" assign level_intpend_w_prior_en_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" assign level_intpend_id_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" end\n");
|
2020-11-18 02:25:18 +08:00
|
|
|
print (" cmp_and_mux #(\n");
|
2020-01-23 06:22:50 +08:00
|
|
|
print (" .ID_BITS(ID_BITS),\n");
|
|
|
|
print (" .INTPRIORITY_BITS(INTPRIORITY_BITS)) cmp_l".$next_level." (\n");
|
|
|
|
print (" .a_id(level_intpend_id[0][2*m]),\n");
|
|
|
|
print (" .a_priority(level_intpend_w_prior_en[0][2*m]),\n");
|
|
|
|
print (" .b_id(level_intpend_id[0][2*m+1]),\n");
|
|
|
|
print (" .b_priority(level_intpend_w_prior_en[0][2*m+1]),\n");
|
|
|
|
print (" .out_id(level_intpend_id_".$next_level."[m]),\n");
|
|
|
|
print (" .out_priority(level_intpend_w_prior_en_".$next_level."[m])) ;\n");
|
|
|
|
print (" \n");
|
|
|
|
print (" end\n\n");
|
|
|
|
for (my $l=1; $l<$NUM_LEVELS ; $l++) {
|
|
|
|
$next_level = $l+1;
|
|
|
|
print ("// LEVEL".$l."\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [INTPRIORITY_BITS-1:0] level_intpend_w_prior_en_".$next_level.";\n");
|
|
|
|
print ("logic [TOTAL_INT+2:0] [ID_BITS-1:0] level_intpend_id_".$next_level.";\n");
|
|
|
|
print (" for (m=0; m<=(TOTAL_INT)/(2**(".$next_level.")) ; m++) begin : COMPARE$l\n");
|
|
|
|
print (" if ( m == (TOTAL_INT)/(2**(".$next_level."))) begin \n");
|
|
|
|
print (" assign level_intpend_w_prior_en_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" assign level_intpend_id_".$next_level."[m+1] = '0 ;\n");
|
|
|
|
print (" end\n");
|
2020-11-18 02:25:18 +08:00
|
|
|
print (" cmp_and_mux #(\n");
|
2020-01-23 06:22:50 +08:00
|
|
|
print (" .ID_BITS(ID_BITS),\n");
|
|
|
|
print (" .INTPRIORITY_BITS(INTPRIORITY_BITS)) cmp_l".$next_level." (\n");
|
|
|
|
print (" .a_id(level_intpend_id_".$l."[2*m]),\n");
|
|
|
|
print (" .a_priority(level_intpend_w_prior_en_".$l."[2*m]),\n");
|
|
|
|
print (" .b_id(level_intpend_id_".$l."[2*m+1]),\n");
|
|
|
|
print (" .b_priority(level_intpend_w_prior_en_".$l."[2*m+1]),\n");
|
|
|
|
print (" .out_id(level_intpend_id_".$next_level."[m]),\n");
|
|
|
|
print (" .out_priority(level_intpend_w_prior_en_".$next_level."[m])) ;\n");
|
|
|
|
print (" \n");
|
|
|
|
print (" end\n\n");
|
|
|
|
}
|
|
|
|
print ("assign claimid_in[ID_BITS-1:0] = level_intpend_id_".$next_level."[0] ; // This is the last level output\n");
|
|
|
|
print ("assign selected_int_priority[INTPRIORITY_BITS-1:0] = level_intpend_w_prior_en_".$next_level."[0] ;\n");
|
|
|
|
print ("`endif\n");
|
|
|
|
|