170 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			170 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | #!/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"); | ||
|  | print ("       cmp_and_mux  #(\n"); | ||
|  | 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"); | ||
|  | print ("       cmp_and_mux  #(\n"); | ||
|  | 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"); | ||
|  | print ("       cmp_and_mux  #(\n"); | ||
|  | 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"); | ||
|  | print ("       cmp_and_mux  #(\n"); | ||
|  | 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"); | ||
|  | print ("       cmp_and_mux  #(\n"); | ||
|  | 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"); | ||
|  | print ("       cmp_and_mux  #(\n"); | ||
|  | 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"); | ||
|  | 
 |