Ignore:
Timestamp:
Apr 30, 2009, 3:51:41 PM (15 years ago)
Author:
moulu
Message:

1) added a generic multiplier (systemC isn't working with 8bits)
2) added a partial functionnal unit vhdl.

Location:
trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier.cpp

    r112 r116  
    7777# endif   
    7878
    79 //      log_printf(INFO,Multiplier,FUNCTION,_("<%s> : Method - genMoore"),_name.c_str());
     79        log_printf(INFO,Multiplier,FUNCTION,_("<%s> : Method - genMealy"),_name.c_str());
    8080
    81 //      SC_METHOD (genMoore);
    82 //      dont_initialize ();
    83 //      sensitive << (*(in_CLOCK)).neg(); // need internal register
     81        SC_METHOD (genMealy);
     82        dont_initialize ();
     83        sensitive << (*(in_CLOCK)).neg(); // need internal register
     84
     85        if (_param->_latency == 0)
     86          sensitive << (*(in_MULTIPLIER_DATA_IN_0))
     87                    << (*(in_MULTIPLIER_DATA_IN_1));
    8488       
    85 // # ifdef SYSTEMCASS_SPECIFIC
    86 //      // List dependency information
    87 // # endif   
     89# ifdef SYSTEMCASS_SPECIFIC
     90        // List dependency information
     91# endif   
    8892       
    8993#endif
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_allocation.cpp

    r112 r116  
    5353      in_NRESET       = interface->set_signal_in  <Tcontrol_t> ("nreset",1, RESET_VHDL_YES);
    5454    }
     55
     56    // ~~~~~[ Interface "multiplier" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     57    {
     58      ALLOC0_INTERFACE_BEGIN("multiplier", IN, WEST, _("Multiplier's interface."));
     59     
     60      ALLOC0_SIGNAL_IN ( in_MULTIPLIER_DATA_IN_0,"data_in_0",Tdata_t   ,_param->_size_data);
     61      ALLOC0_SIGNAL_IN ( in_MULTIPLIER_DATA_IN_1,"data_in_1",Tdata_t   ,_param->_size_data);
     62      ALLOC0_SIGNAL_IN ( in_MULTIPLIER_NSTALL   ,"nstall"   ,Tcontrol_t,1);
     63      ALLOC0_SIGNAL_OUT(out_MULTIPLIER_DATA_LSB_OUT ,"data_lsb_out" ,Tdata_t   ,_param->_size_data);
     64      ALLOC0_SIGNAL_OUT(out_MULTIPLIER_DATA_MSB_OUT ,"data_msb_out" ,Tdata_t   ,_param->_size_data);
     65
     66      ALLOC0_INTERFACE_END();
     67    }
     68
     69     // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
     70#ifdef SYSTEMC
     71    if (usage_is_set(_usage,USE_SYSTEMC_BODY))
     72      {
     73        _pipeline = new std::vector<result_t>(_param->_latency+1);
     74      }
     75#endif
     76
    5577    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
    5678
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_deallocation.cpp

    r112 r116  
    2525        delete    in_CLOCK ;
    2626        delete    in_NRESET;
     27
     28        DELETE0_SIGNAL(in_MULTIPLIER_DATA_IN_0,_param->_size_data);
     29        DELETE0_SIGNAL(in_MULTIPLIER_DATA_IN_1,_param->_size_data);
     30        DELETE0_SIGNAL(in_MULTIPLIER_NSTALL   ,1);
     31                                             
     32        DELETE0_SIGNAL(out_MULTIPLIER_DATA_LSB_OUT,_param->_size_data);
     33        DELETE0_SIGNAL(out_MULTIPLIER_DATA_MSB_OUT,_param->_size_data);
     34
    2735      }
    2836    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
     37#ifdef SYSTEMC
     38    if (usage_is_set(_usage,USE_SYSTEMC_BODY))
     39      {
     40        delete _pipeline;
     41      }
     42#endif
    2943
    3044    delete _component;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_transition.cpp

    r112 r116  
    2020  {
    2121    log_begin(Multiplier,FUNCTION);
    22 
     22   
     23    // Test if stall
     24    if (PORT_READ(in_MULTIPLIER_NSTALL))
     25      {
     26        // Pop a slot of array
     27        for (uint32_t i=1;i<_pipeline->size();i++)
     28          _pipeline->at(i-1)=_pipeline->at(i);
     29
     30        result_t data;
     31       
     32        switch (_param->_size_data)
     33          {
     34          case 8 :
     35            {
     36              if (_param->_sign) // 0 = signed, 1 = unsigned
     37                {
     38                  sc_uint<8> data_0 = static_cast<sc_uint<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
     39                  sc_uint<8> data_1 = static_cast<sc_uint<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
     40                  sc_uint<16> tmp    = (static_cast<sc_uint<16> >(data_0) *
     41                                        static_cast<sc_uint<16> >(data_1));
     42                 
     43                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
     44                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>8));
     45                 
     46//                   std::cout << "uint8 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
     47//                   std::cout << "uint8 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
     48//                   std::cout << "uint8 : tmp    : " << std::hex << tmp << std::dec << std::endl;
     49//                   std::cout << "uint8 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
     50//                   std::cout << "uint8 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
     51                 
     52//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
     53//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
     54//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
     55//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
     56//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
     57//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
     58                }
     59              else
     60                {
     61                  sc_int<8> data_0 = static_cast<sc_int<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
     62                  sc_int<8> data_1 = static_cast<sc_int<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
     63                  sc_int<16> tmp    = (static_cast<sc_int<16> >(data_0) *
     64                                       static_cast<sc_int<16> >(data_1));
     65                 
     66                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
     67                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>8));
     68                 
     69//                   std::cout << "int8 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
     70//                   std::cout << "int8 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
     71//                   std::cout << "int8 : tmp    : " << std::hex << tmp << std::dec << std::endl;
     72//                   std::cout << "int8 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
     73//                   std::cout << "int8 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
     74                 
     75//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
     76//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
     77//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
     78//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
     79//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
     80//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
     81                }
     82              break;
     83            }
     84          case 16 :
     85            {
     86              if (_param->_sign) // 0 = signed, 1 = unsigned
     87                {
     88                  sc_uint<16> data_0 = static_cast<sc_uint<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
     89                  sc_uint<16> data_1 = static_cast<sc_uint<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
     90                  sc_uint<32> tmp    = (static_cast<sc_uint<32> >(data_0) *
     91                                        static_cast<sc_uint<32> >(data_1));
     92                 
     93                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
     94                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>16));
     95                 
     96//                   std::cout << "uint16 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
     97//                   std::cout << "uint16 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
     98//                   std::cout << "uint16 : tmp    : " << std::hex << tmp << std::dec << std::endl;
     99//                   std::cout << "uint16 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
     100//                   std::cout << "uint16 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
     101                 
     102//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
     103//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
     104//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
     105//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
     106//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
     107//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
     108                }
     109              else
     110                {
     111                  sc_int<16> data_0 = static_cast<sc_int<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
     112                  sc_int<16> data_1 = static_cast<sc_int<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
     113                  sc_int<32> tmp    = (static_cast<sc_int<32> >(data_0) *
     114                                       static_cast<sc_int<32> >(data_1));
     115                 
     116                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
     117                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>16));
     118                 
     119                  std::cout << "int16 : data_0 : " << std::hex << data_0   << std::dec << " - dec : " << data_0 << std::endl;
     120                  std::cout << "int16 : data_1 : " << std::hex << data_1   << std::dec << " - dec : " << data_1 << std::endl;
     121                  std::cout << "int16 : tmp    : " << std::hex << tmp      << std::dec << " - dec : " << tmp    << std::endl;
     122                  std::cout << "int16 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
     123                  std::cout << "int16 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
     124                 
     125//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
     126//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
     127//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
     128//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
     129//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
     130//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
     131                }
     132              break;
     133            }
     134          case 32 :
     135            {
     136              if (_param->_sign) // 0 = signed, 1 = unsigned
     137                {
     138                  sc_uint<32> data_0 = static_cast<sc_uint<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
     139                  sc_uint<32> data_1 = static_cast<sc_uint<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
     140                  sc_uint<64> tmp    = (static_cast<sc_uint<64> >(data_0) *
     141                                        static_cast<sc_uint<64> >(data_1));
     142                 
     143                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
     144                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>32));
     145                 
     146//                   std::cout << "uint32 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
     147//                   std::cout << "uint32 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
     148//                   std::cout << "uint32 : tmp    : " << std::hex << tmp << std::dec << std::endl;
     149//                   std::cout << "uint32 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
     150//                   std::cout << "uint32 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
     151                 
     152//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
     153//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
     154//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
     155//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
     156//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
     157//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
     158                }
     159              else
     160                {
     161                  sc_int<32> data_0 = static_cast<sc_int<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
     162                  sc_int<32> data_1 = static_cast<sc_int<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
     163                  sc_int<64> tmp    = (static_cast<sc_int<64> >(data_0) *
     164                                       static_cast<sc_int<64> >(data_1));
     165                 
     166                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
     167                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>32));
     168                 
     169//                   std::cout << "int32 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
     170//                   std::cout << "int32 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
     171//                   std::cout << "int32 : tmp    : " << std::hex << tmp << std::dec << std::endl;
     172//                   std::cout << "int32 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
     173//                   std::cout << "int32 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
     174                 
     175//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
     176//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
     177//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
     178//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
     179//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
     180//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
     181                }
     182              break;
     183            }
     184          default :
     185            {
     186              break;
     187            }
     188          }
     189       
     190        _pipeline->at(_param->_latency-1) = data;
     191       
     192      }
     193   
    23194#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
    24195    end_cycle ();
    25196#endif
    26 
     197   
    27198    log_end(Multiplier,FUNCTION);
    28199  };
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl.cpp

    r112 r116  
    2727    _component->vhdl_instance(vhdl);
    2828
     29    // default architecture
    2930    vhdl_declaration (vhdl);
    3031    vhdl_body        (vhdl);
     32
     33    // Xilinx architecture
     34    vhdl->set_architecture("xilinx");
     35    vhdl_xilinx_declaration (vhdl);
     36    vhdl_xilinx_body        (vhdl);
    3137
    3238    vhdl->generate_file();
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters.cpp

    r112 r116  
    77
    88#include "Behavioural/Generic/Multiplier/include/Parameters.h"
     9#include "Common/include/BitManipulation.h"
    910
    1011namespace morpheo {
     
    1617#undef  FUNCTION
    1718#define FUNCTION "Multiplier::Parameters"
    18   Parameters::Parameters (bool is_toplevel)
     19  Parameters::Parameters (uint32_t             size_data,
     20                          bool                 sign     ,
     21                          uint32_t             latency  ,
     22                          uint32_t             delay    ,
     23                          bool is_toplevel)
    1924  {
     25
    2026    log_begin(Multiplier,FUNCTION);
     27
     28    _size_data  = size_data;
     29    _sign       = sign     ;
     30    _latency    = latency  ;
     31    _delay      = delay    ;
     32    _mask       = gen_mask<Tdata_t>(_size_data);
     33//     _shift_sign = size_data-1;
    2134
    2235    test();
     
    3548//   {
    3649//     log_begin(Multiplier,FUNCTION);
    37 //     test();
     50//     test();x
    3851//     log_end(Multiplier,FUNCTION);
    3952//   };
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters_msg_error.cpp

    r112 r116  
    2424    Parameters_test test ("Multiplier");
    2525
     26    if ((_size_data < 2) or (_size_data > 64))
     27      test.error(toString(_("size_data (%d) 's valid range is 2 to 64.\n"),_size_data));
     28
     29    if (_delay > 1)
     30      test.error(toString(_("delay must be set at 1\n")));
     31
     32    if (_latency > 32)
     33      test.error(toString(_("latency's valid range is 0 to 32\n")));
     34
    2635    log_end(Multiplier,FUNCTION);
    2736
Note: See TracChangeset for help on using the changeset viewer.