Ignore:
Timestamp:
Dec 10, 2008, 7:31:39 PM (15 years ago)
Author:
rosiere
Message:

Almost complete design
with Test and test platform

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Operation/src/Operation.cpp

    r81 r88  
    88
    99#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Operation/include/Operation.h"
    10 
    11 #define neg(data)                  (~(data)+1)
    12 #define sign(data)                 ((data)>>(param->_size_data-1))
    13 #define unsigned(data)             (data)
    14 #define signed(data)               ((sign(data)==0)?(data):neg(data))
    15 #define ovf(op1, op2, res)         ((sign(op1) == sign(op2))?(sign(op1) xor sign(res)):0)
    16 #define carry(op1, op2, res)       (((res)<(op1)) or ((res)<(op2)))
    17 #define set_flag(data,flag,is_set) (((is_set)==1)?((data)|(flag)):((data)&~(flag)))
    18 #define get_flag(data,flag)        (((data)&(flag))!=0)
    19 #define concatenation_bool(a,b)    (((a)<<1) | (b))
     10#include "Behavioural/include/Operation.h"
    2011
    2112namespace morpheo                    {
     
    4334    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_add");
    4435
    45     Tgeneral_data_t gpr1      = unsigned(op->_data_ra);
    46     Tgeneral_data_t gpr2      = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     36    Tgeneral_data_t gpr1      = unsigned(param->_size_data,op->_data_ra);
     37    Tgeneral_data_t gpr2      = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    4738   
    4839    Tgeneral_data_t gpr3      = param->_mask_data & (gpr1 + gpr2);
    4940
    50     bool            overflow  = ovf  (gpr1,gpr2,gpr3);
    51     bool            carry_out = carry(gpr1,gpr2,gpr3);
     41    bool            overflow  = ovf  (param->_size_data,gpr1,gpr2,gpr3);
     42    bool            carry_out = carry(param->_size_data,gpr1,gpr2,gpr3);
    5243
    5344    // Result
     
    7061    Tgeneral_data_t carry_in   = get_flag(op->_data_rc,FLAG_CY);
    7162
    72     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    73     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     63    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     64    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    7465    Tgeneral_data_t gpr3       = param->_mask_data & (gpr1 + gpr2 + carry_in);
    7566
    76     bool            overflow   = ovf  (gpr1,gpr2,gpr3);
    77     bool            carry_out  = carry(gpr1,gpr2,gpr3);
     67    bool            overflow   = ovf  (param->_size_data,gpr1,gpr2,gpr3);
     68    bool            carry_out  = carry(param->_size_data,gpr1,gpr2,gpr3);
    7869
    7970    // Result
     
    9485    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sub");
    9586
    96     Tgeneral_data_t gpr1      =     unsigned(op->_data_ra);
    97     Tgeneral_data_t gpr2      = neg(unsigned(op->_data_rb));
     87    Tgeneral_data_t gpr1      =                       unsigned(param->_size_data,op->_data_ra);
     88    Tgeneral_data_t gpr2      = neg(param->_size_data,unsigned(param->_size_data,op->_data_rb));
    9889    Tgeneral_data_t gpr3      = param->_mask_data & (gpr1 + gpr2);
    9990
    100     bool            overflow  = ovf  (gpr1,gpr2,gpr3);
    101     bool            carry_out = carry(gpr1,gpr2,gpr3);
     91    bool            overflow  = ovf  (param->_size_data,gpr1,gpr2,gpr3);
     92    bool            carry_out = carry(param->_size_data,gpr1,gpr2,gpr3);
    10293
    10394    // Result
     
    118109    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_and");
    119110
    120     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    121     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     111    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     112    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    122113    Tgeneral_data_t gpr3       = (gpr1 & gpr2);
    123114
     
    137128    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_or");
    138129
    139     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    140     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     130    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     131    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    141132    Tgeneral_data_t gpr3       = (gpr1 | gpr2);
    142133
     
    156147    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_xor");
    157148
    158     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    159     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     149    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     150    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    160151    Tgeneral_data_t gpr3       = (gpr1 ^ gpr2);
    161152
     
    175166    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_movhi");
    176167
    177     Tgeneral_data_t gpr1       = unsigned(op->_immediat);
     168    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_immediat);
    178169    Tgeneral_data_t gpr2       = param->_mask_data & (gpr1<<16);
    179170
     
    195186    Tgeneral_data_t f_in       = get_flag(op->_data_rc,FLAG_F);
    196187
    197     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    198     Tgeneral_data_t gpr2       = unsigned(op->_data_rb);
     188    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     189    Tgeneral_data_t gpr2       = unsigned(param->_size_data,op->_data_rb);
    199190    Tgeneral_data_t gpr3       = ((f_in==0)?gpr2:gpr1);
    200191
     
    215206
    216207    Tgeneral_data_t f_in       = get_flag(op->_data_rc,FLAG_F);
    217     Tgeneral_data_t imm        = unsigned(op->_immediat);
     208    Tgeneral_data_t imm        = unsigned(param->_size_data,op->_immediat);
    218209
    219210    // Result
     
    233224
    234225    Tgeneral_data_t f_in       = get_flag(op->_data_rc,FLAG_F);
    235     Tgeneral_data_t imm        = unsigned(op->_immediat);
     226    Tgeneral_data_t imm        = unsigned(param->_size_data,op->_immediat);
    236227
    237228    // Result
     
    254245
    255246
    256     Tgeneral_data_t gpr        = unsigned(op->_data_rb);
    257     Tgeneral_data_t imm        = unsigned(op->_immediat);
     247    Tgeneral_data_t gpr        = unsigned(param->_size_data,op->_data_rb);
     248    Tgeneral_data_t imm        = unsigned(param->_size_data,op->_immediat);
    258249
    259250    // Result
     
    272263    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_extend_s");
    273264
    274     Tgeneral_data_t imm        = unsigned(op->_immediat);
    275     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
     265    Tgeneral_data_t imm        = unsigned(param->_size_data,op->_immediat);
     266    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
    276267    Tgeneral_data_t gpr2       = extend<Tgeneral_data_t>(param->_size_data, gpr1, true , imm);
    277268
     
    291282    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_extend_z");
    292283
    293     Tgeneral_data_t imm        = unsigned(op->_immediat);
    294     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
     284    Tgeneral_data_t imm        = unsigned(param->_size_data,op->_immediat);
     285    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
    295286    Tgeneral_data_t gpr2       = extend<Tgeneral_data_t>(param->_size_data, gpr1, false , imm);
    296287
     
    310301    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sll");
    311302
    312     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    313     Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     303    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     304    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    314305    Tgeneral_data_t gpr3       = shift_logic_left<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
    315306
     
    329320    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_srl");
    330321
    331     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    332     Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     322    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     323    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    333324    Tgeneral_data_t gpr3       = shift_logic_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
    334325
     
    348339    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sra");
    349340
    350     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    351     Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     341    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     342    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    352343    Tgeneral_data_t gpr3       = shift_arithmetic_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
    353344
     
    367358    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_ror");
    368359
    369     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    370     Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     360    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     361    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    371362    Tgeneral_data_t gpr3       = rotate_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
    372363
     
    386377    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_ff1");
    387378
    388     Tgeneral_data_t gpr        = unsigned(op->_data_ra);
     379    Tgeneral_data_t gpr        = unsigned(param->_size_data,op->_data_ra);
    389380    Tgeneral_data_t index;
    390381
     
    406397    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_fl1");
    407398
    408     Tgeneral_data_t gpr        = unsigned(op->_data_ra);
     399    Tgeneral_data_t gpr        = unsigned(param->_size_data,op->_data_ra);
    409400    Tgeneral_data_t index;
    410401
     
    426417    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfeq");
    427418
    428     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    429     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     419    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     420    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    430421
    431422    bool            f_out      = (gpr1 == gpr2);
     
    446437    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfne");
    447438
    448     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    449     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     439    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     440    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    450441
    451442    bool            f_out      = (gpr1 != gpr2);
     
    466457    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfgeu");
    467458
    468     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    469     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     459    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     460    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    470461
    471462    bool            f_out      = (gpr1 >= gpr2);
     
    486477    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfgtu");
    487478
    488     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    489     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     479    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     480    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    490481
    491482    bool            f_out      = (gpr1 >  gpr2);
     
    506497    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfleu");
    507498
    508     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    509     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     499    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     500    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    510501
    511502    bool            f_out      = (gpr1 <= gpr2);
     
    526517    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfltu");
    527518
    528     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    529     Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     519    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     520    Tgeneral_data_t gpr2       = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    530521
    531522    bool            f_out      = (gpr1 <  gpr2);
     
    549540    Tgeneral_data_t gpr2       =   (op->_has_immediat==1)?op->_immediat:op->_data_rb;
    550541   
    551     log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ra  : %.8x",unsigned(op->_data_ra));
    552     log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ras : %.8x",  signed(op->_data_ra));
    553     log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rb  : %.8x",unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb));
    554     log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rbs : %.8x",  signed((op->_has_immediat==1)?op->_immediat:op->_data_rb));
     542    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ra  : %.8x",unsigned(param->_size_data,op->_data_ra));
     543    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ras : %.8x",  signed(param->_size_data,op->_data_ra));
     544    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rb  : %.8x",unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb));
     545    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rbs : %.8x",  signed(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb));
    555546   
    556547    bool            f_out;
    557548
    558     switch (concatenation_bool(sign(gpr1),sign(gpr2)))
     549    switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2)))
    559550      {
    560551      case 1 /*b01*/ : f_out = 1                               ; break;
    561552      case 2 /*b10*/ : f_out = 0                               ; break;
    562       default        : f_out = signed(gpr1) >= signed(gpr2); break;
     553      default        : f_out = signed(param->_size_data,gpr1) >= signed(param->_size_data,gpr2); break;
    563554      }
    564555
     
    585576    bool            f_out;
    586577
    587     switch (concatenation_bool(sign(gpr1),sign(gpr2)))
     578    switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2)))
    588579      {
    589580      case 1 /*b01*/ : f_out = 1; break;
    590581      case 2 /*b10*/ : f_out = 0; break;
    591       default        : f_out = signed(gpr1) >  signed(gpr2); break;
     582      default        : f_out = signed(param->_size_data,gpr1) >  signed(param->_size_data,gpr2); break;
    592583      }
    593584
     
    612603    bool            f_out;
    613604
    614     switch (concatenation_bool(sign(gpr1),sign(gpr2)))
     605    switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2)))
    615606      {
    616607      case 1 /*b01*/ : f_out = 0; break;
    617608      case 2 /*b10*/ : f_out = 1; break;
    618       default        : f_out = signed(gpr1) <= signed(gpr2); break;
     609      default        : f_out = signed(param->_size_data,gpr1) <= signed(param->_size_data,gpr2); break;
    619610      }
    620611   
     
    639630    bool            f_out;
    640631
    641     switch (concatenation_bool(sign(gpr1),sign(gpr2)))
     632    switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2)))
    642633      {
    643634      case 1 /*b01*/ : f_out = 0; break;
    644635      case 2 /*b10*/ : f_out = 1; break;
    645       default        : f_out = signed(gpr1) <  signed(gpr2); break;
     636      default        : f_out = signed(param->_size_data,gpr1) <  signed(param->_size_data,gpr2); break;
    646637      }
    647638
     
    661652    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mtspr");
    662653
    663     Tgeneral_data_t imm        = unsigned(op->_immediat);
    664     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
    665     Tgeneral_data_t gpr2       = unsigned(op->_data_rb);
     654    Tgeneral_data_t imm        = unsigned(param->_size_data,op->_immediat);
     655    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
     656    Tgeneral_data_t gpr2       = unsigned(param->_size_data,op->_data_rb);
    666657    Tgeneral_data_t addr       = range<Tgeneral_data_t>(gpr1|imm,16);
    667658
     
    694685    else
    695686      {
    696         exception = EXCEPTION_ALU_SPR_ACCESS_NOT_COMPLETE;
     687        exception = EXCEPTION_ALU_SPR_ACCESS_MUST_WRITE;
    697688      }
    698689   
     
    712703    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mfspr");
    713704
    714     Tgeneral_data_t imm        = unsigned(op->_immediat);
    715     Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
     705    Tgeneral_data_t imm        = unsigned(param->_size_data,op->_immediat);
     706    Tgeneral_data_t gpr1       = unsigned(param->_size_data,op->_data_ra);
    716707    Tgeneral_data_t gpr2       = 0;
    717708    Tgeneral_data_t addr       = range<Tgeneral_data_t>(gpr1|imm,16);
     
    745736    else
    746737      {
    747         exception = EXCEPTION_ALU_SPR_ACCESS_NOT_COMPLETE;
     738        exception = EXCEPTION_ALU_SPR_ACCESS_MUST_READ;
    748739      }
    749740
     
    784775    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mac");
    785776
    786     Tgeneral_data_t gpr1 = unsigned(op->_data_ra);
    787     Tgeneral_data_t gpr2 = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     777    Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra);
     778    Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    788779    uint64_t        temp = range<uint64_t>(gpr1 * gpr2, 32);
    789780
     
    808799    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_msb");
    809800
    810     Tgeneral_data_t gpr1 = unsigned(op->_data_ra);
    811     Tgeneral_data_t gpr2 = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
     801    Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra);
     802    Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb);
    812803    uint64_t        temp = range<uint64_t>(gpr1 * gpr2, 32);
    813804
Note: See TracChangeset for help on using the changeset viewer.