aboutsummaryrefslogblamecommitdiff
path: root/rtl/modexpng_microcode.vh
blob: 9d7099e391e2fcb1918872d34b240b16d64ef396 (plain) (tree)
1
2
3
4
5
6
7
8
9
                            


                            
                            

                                          
                                               
 

                                                                 
 
                                                                                           
                                                                                               
                                                                                                          
 
  
         

                                                       

                            
 

                                                                  


                                                

                        
 
                                                                     



                                               
   
 


                                                                    




                                         
 
                                                                   




                                                                            
                                                                   





                                         

                                                                      





                       
 
                                                                    




                                             

   


                                                           
 


                                                                   
 


                                                                     
 

                                                              



                       
   
 
  
      
  



                                               
  
      
  



                                               
  
      
  



                                               
  
         
  




                                                      
localparam UOP_OPCODE_W = 5;
localparam UOP_CRT_W    = 1;
localparam UOP_NPQ_W    = 1;
localparam UOP_AUX_W    = 1;
localparam UOP_LADDER_W = 2;
localparam UOP_SEL_W    = 4 * BANK_ADDR_W;

localparam UOP_ADDR_W = 7;  // 128 instructions

localparam [UOP_ADDR_W -1:0] UOP_ADDR_OFFSET_USING_CRT   = 7'd0;
localparam [UOP_ADDR_W -1:0] UOP_ADDR_OFFSET_WITHOUT_CRT = 7'd64;

//                 5              1           1           1           2              4*3=12
localparam UOP_W = UOP_OPCODE_W + UOP_CRT_W + UOP_NPQ_W + UOP_AUX_W + UOP_LADDER_W + UOP_SEL_W;
//                 [21:17]        [16]        [15]        [14]        [13:12]        [11:9][8:6][5:3][2:0]

//
// OPCODE
//
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_STOP = 5'd00;
/* all fields are don't care
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_INPUT_TO_WIDE   = 5'd01;
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_INPUT_TO_NARROW = 5'd02;
/* CRT tells into which of the dual MMM to write
 * NPQ specifies the width of the operand
 * AUX specifies from which INPUT to read
 * LADDER is don't care 
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_OUTPUT_FROM_NARROW = 5'd03;
/* CRT tells from which of the dual MMM to read
 * NPQ specifies the width of the operand
 * AUX is don't care
 * LADDER is don't care
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_COPY_CRT_Y2X      = 5'd04;
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_COPY_LADDERS_X2Y  = 5'd05;
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_CROSS_LADDERS_X2Y = 5'd06;
/* CRT is don't care
 * NPQ specifies the width of the operand
 * AUX is don't care
 * LADDER is don't care
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_MODULAR_MULTIPLY = 5'd07;
/* CRT is don't care
 * NPQ specifies the width of the operand
 * AUX = AUX_2 forces B input to 1 (AUX_1 reads from source NARROW as usual)
 * LADDER specifies Montgomery ladder mode 
 */
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_MODULAR_SUBTRACT = 5'd08;
/* CRT is don't care
 * NPQ specifies the width of the operand
 * AUX is don't care
 * LADDER is don't care
 */
 
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_MODULAR_REDUCE_INIT = 5'd09;
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_MODULAR_REDUCE_PROC = 5'd10;
/* CRT
 * NPQ
 * AUX
 * LADDER is don't care
 */


localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_PROPAGATE_CARRIES = 5'd11;
/* CRT is don't care
 * NPQ specifies the width of the operand
 * AUX is don't care
 * LADDER is don't care
 * source and destination WIDE are don't care
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_MERGE_LH = 5'd12;
/*
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_REGULAR_MULTIPLY = 5'd13;
/*
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_REGULAR_ADD_UNEVEN = 5'd14;
/*
 */

localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_LADDER_INIT = 5'd15;
localparam [UOP_OPCODE_W -1:0] UOP_OPCODE_LADDER_STEP = 5'd16;
/* CRT is don't care
 * NPQ is don't care
 * AUX is don't care
 * LADDER is don't care
 */

//
// CRT
//
localparam [UOP_CRT_W -1:0] UOP_CRT_X   = 1'b0;
localparam [UOP_CRT_W -1:0] UOP_CRT_Y   = 1'b1;
localparam [UOP_CRT_W -1:0] UOP_CRT_DNC = 1'bX;

//
// NPQ
//
localparam [UOP_NPQ_W -1:0] UOP_NPQ_N   = 1'b0;
localparam [UOP_NPQ_W -1:0] UOP_NPQ_PQ  = 1'b1;
localparam [UOP_NPQ_W -1:0] UOP_NPQ_DNC = 1'bX;

//
// AUX
//
localparam [UOP_AUX_W -1:0] UOP_AUX_1   = 1'b0;
localparam [UOP_AUX_W -1:0] UOP_AUX_2   = 1'b1;
localparam [UOP_AUX_W -1:0] UOP_AUX_DNC = 1'bX;

//
// LADDER
//
localparam [UOP_LADDER_W -1:0] UOP_LADDER_00  = 2'b00;
localparam [UOP_LADDER_W -1:0] UOP_LADDER_11  = 2'b11;
localparam [UOP_LADDER_W -1:0] UOP_LADDER_D   = 2'b01;
localparam [UOP_LADDER_W -1:0] UOP_LADDER_PQ  = 2'b10;
localparam [UOP_LADDER_W -1:0] UOP_LADDER_DNC = 2'bXX;