06/25/14 03:47:06 ./toolflow/build/pardec_src_domain_check.v
   1 
module Decrementer_Check(in,i,j,out,error);
   2 
    input  [63:0] in;
   3 
    input  [31:0] i;
   4 
    input  [31:0] j;
   5 
    input  [63:0] out;
   6 
    output error;
   7 
   
   8 
    wire [30:0] in1;
   9 
    wire [30:0] in2;
  10 
    wire [30:0] out1;
  11 
    wire [30:0] out2;
  12 
    wire sign_in1;
  13 
    wire sign_in2;
  14 
    wire sign_out1;
  15 
    wire sign_out2;
  16 
 
  17 
    assign in1  = in[30:0];
  18 
    assign in2  = in[62:32];
  19 
    assign out1 = out[30:0];
  20 
    assign out2 = out[62:32];
  21 
 
  22 
    assign sign_in1  = in[31];
  23 
    assign sign_in2  = in[63];
  24 
    assign sign_out1 = out[31];
  25 
    assign sign_out2 = out[63];
  26 
 
  27 
    wire   in1_or_reduced;
  28 
    wire   in1_eq_zero;
  29 
    wire   in1_lt_zero;
  30 
    wire   in1_gt_zero;
  31 
    wire   in1_eq_min;
  32 
    assign in1_or_reduced = |in1;
  33 
    assign in1_eq_zero    = ~sign_in1 & ~in1_or_reduced;
  34 
    assign in1_lt_zero    =  sign_in1;
  35 
    assign in1_gt_zero    = ~sign_in1 &  in1_or_reduced;
  36 
    assign in1_eq_min     =  sign_in1 & ~in1_or_reduced;
  37 
 
  38 
    wire   in2_or_reduced;
  39 
    wire   in2_eq_zero;
  40 
    wire   in2_lt_zero;
  41 
    wire   in2_gt_zero;
  42 
    wire   in2_eq_min;
  43 
    assign in2_or_reduced = |in2;
  44 
    assign in2_eq_zero    = ~sign_in2 & ~in2_or_reduced;
  45 
    assign in2_lt_zero    =  sign_in2;
  46 
    assign in2_gt_zero    = ~sign_in2 &  in2_or_reduced;
  47 
    assign in2_eq_min     =  sign_in2 & ~in2_or_reduced;
  48 
 
  49 
    wire   out1_or_reduced;
  50 
    wire   out1_and_reduced;
  51 
    wire   out1_eq_zero;
  52 
    wire   out1_lt_zero;
  53 
    wire   out1_gt_zero;
  54 
    wire   out1_eq_min;
  55 
    assign out1_or_reduced  = |out1;
  56 
    assign out1_and_reduced = &out1;
  57 
    assign out1_eq_zero     = ~sign_out1 & ~out1_or_reduced;
  58 
    assign out1_lt_zero     =  sign_out1;
  59 
    assign out1_gt_zero     = ~sign_out1 &  out1_or_reduced;
  60 
    assign out1_eq_min      =  sign_out1 & ~out1_or_reduced;
  61 
 
  62 
    wire   out2_or_reduced;
  63 
    wire   out2_and_reduced;
  64 
    wire   out2_eq_zero;
  65 
    wire   out2_lt_zero;
  66 
    wire   out2_gt_zero;
  67 
    wire   out2_eq_min;
  68 
    assign out2_or_reduced  = |out2;
  69 
    assign out2_and_reduced = &out2;
  70 
    assign out2_eq_zero     = ~sign_out2 & ~out2_or_reduced;
  71 
    assign out2_lt_zero     =  sign_out2;
  72 
    assign out2_gt_zero     = ~sign_out2 &  out2_or_reduced;
  73 
    assign out2_eq_min      =  sign_out2 & ~out2_or_reduced;
  74 
 
  75 
    // has to be of the form (0)*(1)+
  76 
    wire   [30:0] in1_xor_out1;
  77 
    wire   [30:0] in2_xor_out2;
  78 
    assign in1_xor_out1 = (in1 ^ out1);
  79 
    assign in2_xor_out2 = (in2 ^ out2);
  80 
 
  81 
    wire   dec1_mincase_correct;
  82 
    wire   dec1_signflip_correct;
  83 
    wire   dec1_deccase_correct;
  84 
    wire   dec1_correct;
  85 
    wire   dec2_mincase_correct;
  86 
    wire   dec2_signflip_correct;
  87 
    wire   dec2_deccase_correct;
  88 
    wire   dec2_correct;
  89 
 
  90 
    assign dec1_mincase_correct  = ~in1_eq_min | out1_eq_min;
  91 
    assign dec1_signflip_correct = ~(sign_in1 ^ sign_out1) | (in1_eq_zero & out1_and_reduced);
  92 
    assign dec2_mincase_correct  = ~in2_eq_min | out2_eq_min;
  93 
    assign dec2_signflip_correct = ~(sign_in2 ^ sign_out2) | (in2_eq_zero & out2_and_reduced);
  94 
 
  95 
    // only allow '01' transitions, not '10', LSB must be set
  96 
    assign dec1_deccase_correct  = ((sign_in1 ^ sign_out1) | in1_eq_min) | ( in1_xor_out1[0]
  97 
        & ( ~(in1_xor_out1[1]  ^ in1_xor_out1[0])  | in1_xor_out1[0]  )
  98 
        & ( ~(in1_xor_out1[2]  ^ in1_xor_out1[1])  | in1_xor_out1[1]  )
  99 
        & ( ~(in1_xor_out1[3]  ^ in1_xor_out1[2])  | in1_xor_out1[2]  )
 100 
        & ( ~(in1_xor_out1[4]  ^ in1_xor_out1[3])  | in1_xor_out1[3]  )
 101 
        & ( ~(in1_xor_out1[5]  ^ in1_xor_out1[4])  | in1_xor_out1[4]  )
 102 
        & ( ~(in1_xor_out1[6]  ^ in1_xor_out1[5])  | in1_xor_out1[5]  )
 103 
        & ( ~(in1_xor_out1[7]  ^ in1_xor_out1[6])  | in1_xor_out1[6]  )
 104 
        & ( ~(in1_xor_out1[8]  ^ in1_xor_out1[7])  | in1_xor_out1[7]  )
 105 
        & ( ~(in1_xor_out1[9]  ^ in1_xor_out1[8])  | in1_xor_out1[8]  )
 106 
        & ( ~(in1_xor_out1[10] ^ in1_xor_out1[9])  | in1_xor_out1[9]  )
 107 
        & ( ~(in1_xor_out1[11] ^ in1_xor_out1[10]) | in1_xor_out1[10] )
 108 
        & ( ~(in1_xor_out1[12] ^ in1_xor_out1[11]) | in1_xor_out1[11] )
 109 
        & ( ~(in1_xor_out1[13] ^ in1_xor_out1[12]) | in1_xor_out1[12] )
 110 
        & ( ~(in1_xor_out1[14] ^ in1_xor_out1[13]) | in1_xor_out1[13] )
 111 
        & ( ~(in1_xor_out1[15] ^ in1_xor_out1[14]) | in1_xor_out1[14] )
 112 
        & ( ~(in1_xor_out1[16] ^ in1_xor_out1[15]) | in1_xor_out1[15] )
 113 
        & ( ~(in1_xor_out1[17] ^ in1_xor_out1[16]) | in1_xor_out1[16] )
 114 
        & ( ~(in1_xor_out1[18] ^ in1_xor_out1[17]) | in1_xor_out1[17] )
 115 
        & ( ~(in1_xor_out1[19] ^ in1_xor_out1[18]) | in1_xor_out1[18] )
 116 
        & ( ~(in1_xor_out1[20] ^ in1_xor_out1[19]) | in1_xor_out1[19] )
 117 
        & ( ~(in1_xor_out1[21] ^ in1_xor_out1[20]) | in1_xor_out1[20] )
 118 
        & ( ~(in1_xor_out1[22] ^ in1_xor_out1[21]) | in1_xor_out1[21] )
 119 
        & ( ~(in1_xor_out1[23] ^ in1_xor_out1[22]) | in1_xor_out1[22] )
 120 
        & ( ~(in1_xor_out1[24] ^ in1_xor_out1[23]) | in1_xor_out1[23] )
 121 
        & ( ~(in1_xor_out1[25] ^ in1_xor_out1[24]) | in1_xor_out1[24] )
 122 
        & ( ~(in1_xor_out1[26] ^ in1_xor_out1[25]) | in1_xor_out1[25] )
 123 
        & ( ~(in1_xor_out1[27] ^ in1_xor_out1[26]) | in1_xor_out1[26] )
 124 
        & ( ~(in1_xor_out1[28] ^ in1_xor_out1[27]) | in1_xor_out1[27] )
 125 
        & ( ~(in1_xor_out1[29] ^ in1_xor_out1[28]) | in1_xor_out1[28] )
 126 
        & ( ~(in1_xor_out1[30] ^ in1_xor_out1[29]) | in1_xor_out1[29] ) );
 127 
 
 128 
    // only allow '01' transitions, not '10', LSB must be set
 129 
    assign dec2_deccase_correct  = ((sign_in2 ^ sign_out2) | in2_eq_min) | ( in2_xor_out2[0]
 130 
        & ( ~(in2_xor_out2[1]  ^ in2_xor_out2[0])  | in2_xor_out2[0]  )
 131 
        & ( ~(in2_xor_out2[2]  ^ in2_xor_out2[1])  | in2_xor_out2[1]  )
 132 
        & ( ~(in2_xor_out2[3]  ^ in2_xor_out2[2])  | in2_xor_out2[2]  )
 133 
        & ( ~(in2_xor_out2[4]  ^ in2_xor_out2[3])  | in2_xor_out2[3]  )
 134 
        & ( ~(in2_xor_out2[5]  ^ in2_xor_out2[4])  | in2_xor_out2[4]  )
 135 
        & ( ~(in2_xor_out2[6]  ^ in2_xor_out2[5])  | in2_xor_out2[5]  )
 136 
        & ( ~(in2_xor_out2[7]  ^ in2_xor_out2[6])  | in2_xor_out2[6]  )
 137 
        & ( ~(in2_xor_out2[8]  ^ in2_xor_out2[7])  | in2_xor_out2[7]  )
 138 
        & ( ~(in2_xor_out2[9]  ^ in2_xor_out2[8])  | in2_xor_out2[8]  )
 139 
        & ( ~(in2_xor_out2[10] ^ in2_xor_out2[9])  | in2_xor_out2[9]  )
 140 
        & ( ~(in2_xor_out2[11] ^ in2_xor_out2[10]) | in2_xor_out2[10] )
 141 
        & ( ~(in2_xor_out2[12] ^ in2_xor_out2[11]) | in2_xor_out2[11] )
 142 
        & ( ~(in2_xor_out2[13] ^ in2_xor_out2[12]) | in2_xor_out2[12] )
 143 
        & ( ~(in2_xor_out2[14] ^ in2_xor_out2[13]) | in2_xor_out2[13] )
 144 
        & ( ~(in2_xor_out2[15] ^ in2_xor_out2[14]) | in2_xor_out2[14] )
 145 
        & ( ~(in2_xor_out2[16] ^ in2_xor_out2[15]) | in2_xor_out2[15] )
 146 
        & ( ~(in2_xor_out2[17] ^ in2_xor_out2[16]) | in2_xor_out2[16] )
 147 
        & ( ~(in2_xor_out2[18] ^ in2_xor_out2[17]) | in2_xor_out2[17] )
 148 
        & ( ~(in2_xor_out2[19] ^ in2_xor_out2[18]) | in2_xor_out2[18] )
 149 
        & ( ~(in2_xor_out2[20] ^ in2_xor_out2[19]) | in2_xor_out2[19] )
 150 
        & ( ~(in2_xor_out2[21] ^ in2_xor_out2[20]) | in2_xor_out2[20] )
 151 
        & ( ~(in2_xor_out2[22] ^ in2_xor_out2[21]) | in2_xor_out2[21] )
 152 
        & ( ~(in2_xor_out2[23] ^ in2_xor_out2[22]) | in2_xor_out2[22] )
 153 
        & ( ~(in2_xor_out2[24] ^ in2_xor_out2[23]) | in2_xor_out2[23] )
 154 
        & ( ~(in2_xor_out2[25] ^ in2_xor_out2[24]) | in2_xor_out2[24] )
 155 
        & ( ~(in2_xor_out2[26] ^ in2_xor_out2[25]) | in2_xor_out2[25] )
 156 
        & ( ~(in2_xor_out2[27] ^ in2_xor_out2[26]) | in2_xor_out2[26] )
 157 
        & ( ~(in2_xor_out2[28] ^ in2_xor_out2[27]) | in2_xor_out2[27] )
 158 
        & ( ~(in2_xor_out2[29] ^ in2_xor_out2[28]) | in2_xor_out2[28] )
 159 
        & ( ~(in2_xor_out2[30] ^ in2_xor_out2[29]) | in2_xor_out2[29] ) );
 160 
 
 161 
    assign dec1_correct = dec1_mincase_correct & dec1_signflip_correct & dec1_deccase_correct;
 162 
    assign dec2_correct = dec2_mincase_correct & dec2_signflip_correct & dec2_deccase_correct;
 163 
 
 164 
    wire   all_implications_hold;
 165 
    assign all_implications_hold =
 166 
           dec1_correct &
 167 
           dec2_correct;
 168 
 
 169 
    assign error = ~all_implications_hold;
 170 
 
 171 
endmodule
 172