Пример #1
0
int _main(int argc, char *argv[])
{
    using namespace sc_core;
    using namespace soclib::caba;
    using namespace soclib::common;

    typedef VciParams<cell_size,
                      plen_size,
                      addr_size,
                      rerror_size,
                      clen_size,
                      rflag_size,
                      srcid_size,
                      pktid_size,
                      trdid_size,
                      wrplen_size> vci_param;

    ///////////////////////////////////////////////////////////////
    // command line arguments
    ///////////////////////////////////////////////////////////////
    int     ncycles             = 1000000000;       // simulated cycles
    char    sys_path[256]       = "soft_multi/sys.bin";   // pathname for system code
    char    app_path[256]       = "soft_multi/app.bin";   // pathname for application code
    char    ioc_filename[256]   = "to_be_defined";  // pathname for the ioc file
    size_t  fbf_size            = 128;              // number of lines = number of pixels
    bool    debug               = false;            // debug activated
    int     from_cycle          = 0;                // debug start cycle
    int     nprocs              = NPROCS;                // number of processors

    std::cout << std::endl << "********************************************************" << std::endl;
    std::cout << std::endl << "******        tp4_soclib_multi                    ******" << std::endl;
    std::cout << std::endl << "********************************************************" << std::endl;

    if (argc > 1)
    {
        for( int n=1 ; n<argc ; n=n+2 )
        {
            if( (strcmp(argv[n],"-NCYCLES") == 0) && (n+1<argc) )
            {
                ncycles = atoi(argv[n+1]);
            }
            else if( (strcmp(argv[n],"-NPROCS") == 0) && (n+1<argc) )
            {
                nprocs = atoi(argv[n+1]);
                assert( (nprocs <= 4 && nprocs > 0) && "NPROCS cannot be greater than 4");
            }
            else if( (strcmp(argv[n],"-DEBUG") == 0) && (n+1<argc) )
            {
                debug = true;
                from_cycle = atoi(argv[n+1]);
            }
            else if( (strcmp(argv[n],"-SYS") == 0) && (n+1<argc) )
            {
                strcpy(sys_path, argv[n+1]) ;
            }
            else if( (strcmp(argv[n],"-APP") == 0) && (n+1<argc) )
            {
                strcpy(app_path, argv[n+1]) ;
            }
            else if( (strcmp(argv[n],"-IOCFILE") == 0) && (n+1<argc) )
            {
                strcpy(ioc_filename, argv[n+1]) ;
            }
            else if( (strcmp(argv[n],"-FBFSIZE") == 0) && (n+1<argc) )
            {
                fbf_size = atoi(argv[n+1]) ;
            }
            else
            {
                std::cout << "   Arguments on the command line are (key,value) couples." << std::endl;
                std::cout << "   The order is not important." << std::endl;
                std::cout << "   Accepted arguments are :" << std::endl << std::endl;
                std::cout << "   -NCYCLES number_of_simulated_cycles" << std::endl;
                std::cout << "   -NPROCS number_of_processors" << std::endl;
                std::cout << "   -IOCFILE file_name" << std::endl;
                std::cout << "   -FBFSIZE number_of_pixels" << std::endl;
                std::cout << "   -SYS sys_elf_pathname" << std::endl;
                std::cout << "   -APP app_elf_pathname" << std::endl;
                std::cout << "   -DEBUG debug_start_cycle" << std::endl;
                exit(0);
            }
        }
    }
    std::cout << std::endl;
    std::cout << "    NPROCS       = " << nprocs << std::endl;
    std::cout << "    ncycles      = " << ncycles << std::endl;
    std::cout << "    sys_pathname = " << sys_path << std::endl;
    std::cout << "    app_pathname = " << app_path << std::endl;
    std::cout << "    ioc_filename = " << ioc_filename << std::endl;
    std::cout << "    icache_sets  = " << icache_sets << std::endl;
    std::cout << "    icache_words = " << icache_words << std::endl;
    std::cout << "    icache_ways  = " << icache_ways << std::endl;
    std::cout << "    dcache_sets  = " << dcache_sets << std::endl;
    std::cout << "    dcache_words = " << dcache_words << std::endl;
    std::cout << "    dcache_ways  = " << dcache_ways << std::endl;

    //////////////////////////////////////////////////////////////////////////
    // Mapping Table
    //////////////////////////////////////////////////////////////////////////
    MappingTable maptab(32, IntTab(8), IntTab(2), 0xFF000000);

    maptab.add(Segment("seg_reset" , SEG_RESET_BASE , SEG_RESET_SIZE , IntTab(TGTID_ROM), true));

    maptab.add(Segment("seg_kernel", SEG_KERNEL_BASE, SEG_KERNEL_SIZE, IntTab(TGTID_RAM), true));
    maptab.add(Segment("seg_kdata" , SEG_KDATA_BASE , SEG_KDATA_SIZE , IntTab(TGTID_RAM), true));
    maptab.add(Segment("seg_kunc"  , SEG_KUNC_BASE  , SEG_KUNC_SIZE  , IntTab(TGTID_RAM), false));
    maptab.add(Segment("seg_code"  , SEG_CODE_BASE  , SEG_CODE_SIZE  , IntTab(TGTID_RAM), true));
    maptab.add(Segment("seg_data"  , SEG_DATA_BASE  , SEG_DATA_SIZE  , IntTab(TGTID_RAM), true));
    maptab.add(Segment("seg_stack" , SEG_STACK_BASE , SEG_STACK_SIZE , IntTab(TGTID_RAM), true));

    maptab.add(Segment("seg_tty"   ,  SEG_TTY_BASE ,  SEG_TTY_SIZE ,  IntTab(TGTID_TTY), false));
    maptab.add(Segment("seg_timer" ,  SEG_TIM_BASE ,  SEG_TIM_SIZE ,  IntTab(TGTID_TIM), false));
    maptab.add(Segment("seg_icu"   ,  SEG_ICU_BASE ,  SEG_ICU_SIZE ,  IntTab(TGTID_ICU), false));
    maptab.add(Segment("seg_dma"   ,  SEG_DMA_BASE ,  SEG_DMA_SIZE ,  IntTab(TGTID_DMA), false));
    maptab.add(Segment("seg_fbf"   ,  SEG_FBF_BASE ,  SEG_FBF_SIZE ,  IntTab(TGTID_FBF), false));
    maptab.add(Segment("seg_ioc"   ,  SEG_IOC_BASE ,  SEG_IOC_SIZE ,  IntTab(TGTID_IOC), false));
    maptab.add(Segment("seg_gcd"   ,  SEG_GCD_BASE ,  SEG_GCD_SIZE ,  IntTab(TGTID_GCD), false));

    std::cout << std::endl << maptab << std::endl;

    //////////////////////////////////////////////////////////////////////////
    // Signals
    //////////////////////////////////////////////////////////////////////////
    sc_clock        signal_clk("signal_clk", sc_time( 1, SC_NS ), 0.5 );
    sc_signal<bool> signal_resetn("signal_resetn");

    VciSignals<vci_param> * signal_vci_init_proc = alloc_elems<VciSignals<vci_param> >("signal_vci_init_proc", nprocs);

    VciSignals<vci_param>   signal_vci_init_dma("signal_vci_init_dma");
    VciSignals<vci_param>   signal_vci_init_ioc("signal_vci_init_ioc");

    VciSignals<vci_param>   signal_vci_tgt_rom("signal_vci_tgt_rom");
    VciSignals<vci_param>   signal_vci_tgt_ram("signal_vci_tgt_ram");
    VciSignals<vci_param>   signal_vci_tgt_tty("signal_vci_tgt_tty");
    VciSignals<vci_param>   signal_vci_tgt_gcd("signal_vci_tgt_gcd");
    VciSignals<vci_param>   signal_vci_tgt_tim("signal_vci_tgt_tim");
    VciSignals<vci_param>   signal_vci_tgt_icu("signal_vci_tgt_icu");
    VciSignals<vci_param>   signal_vci_tgt_fbf("signal_vci_tgt_fbf");
    VciSignals<vci_param>   signal_vci_tgt_ioc("signal_vci_tgt_ioc");
    VciSignals<vci_param>   signal_vci_tgt_dma("signal_vci_tgt_dma");

    sc_signal<bool> signal_false("signal_false");
    sc_signal<bool> * signal_irq_ttys = alloc_elems<sc_signal<bool> >("signal_irq_ttys", nprocs);
    sc_signal<bool> * signal_irq_tims = alloc_elems<sc_signal<bool> >("signal_irq_tims", nprocs);
    sc_signal<bool> * signal_irq_dmas = alloc_elems<sc_signal<bool> >("signal_irq_dmas", nprocs);
    sc_signal<bool> * signal_irq_procs = alloc_elems<sc_signal<bool> >("signal_irq_procs", nprocs);
    sc_signal<bool> signal_irq_ioc("signal_irq_ioc");

    ///////////////////////////////////////////////////////////////
    // VCI Components : 3 initiators / 9 targets
    // The IOC & DMA components are both initiator & target.
    ///////////////////////////////////////////////////////////////
    // The ICU controls 4 input IRQs :
    // - IRQ[0] : timer
    // - IRQ[1] : tty
    // - IRQ[2] : ioc
    // - IRQ[3] : dma
    //////////////////////////////////////////////////////////////

    Loader loader(sys_path, app_path);

    VciXcacheWrapper<vci_param, Mips32ElIss >* proc[nprocs];
    char*                                      name[nprocs];
    for (int i = 0; i< nprocs; i++){
    name[i] = new char[16];
    sprintf(name[i], "proc_%d", i);
    proc[i] = new VciXcacheWrapper<vci_param,Mips32ElIss>(name[i], i,maptab,IntTab(i),
                                                    icache_ways, icache_sets, icache_words,
                                                    dcache_ways, dcache_sets, dcache_words);
    }
    VciSimpleRam<vci_param>* rom;
    rom = new VciSimpleRam<vci_param>("rom", IntTab(TGTID_ROM), maptab, loader);

    VciSimpleRam<vci_param>* ram;
    ram = new VciSimpleRam<vci_param>("ram", IntTab(TGTID_RAM), maptab, loader);
   
    std::vector<std::string> vect_names;
    for( int i = 0 ; i < nprocs ; i++ )
    {
        std::ostringstream tty_name;
          tty_name <<  "tty" << i;

         vect_names.push_back(tty_name.str().c_str());
      }

 
    VciMultiTty<vci_param>* tty;
    tty = new VciMultiTty<vci_param>("tty", IntTab(TGTID_TTY), maptab, vect_names);

    VciGcdCoprocessor<vci_param>* gcd;
    gcd = new VciGcdCoprocessor<vci_param>("gcd", IntTab(TGTID_GCD), maptab);

    VciTimer<vci_param>* timer;
    timer = new VciTimer<vci_param>("timer", IntTab(TGTID_TIM), maptab, nprocs);

    VciMultiIcu<vci_param>* icu;
    icu = new VciMultiIcu<vci_param>("icu", IntTab(TGTID_ICU), maptab, 32, nprocs);

    VciMultiDma<vci_param>* dma;
    dma = new VciMultiDma<vci_param>("dma", maptab, IntTab(nprocs+1), IntTab(TGTID_DMA), 64, nprocs);

    VciFrameBuffer<vci_param>* fbf;
    fbf = new VciFrameBuffer<vci_param>("fbf", IntTab(TGTID_FBF), maptab, fbf_size, fbf_size, 420);

    VciBlockDevice<vci_param>* ioc;
//    ioc = new VciBlockDevice<vci_param>("ioc", maptab, IntTab(2 +nprocs), IntTab(TGTID_IOC), ioc_filename ,512, 0); 
    ioc = new VciBlockDevice<vci_param>("ioc", maptab, IntTab(2 +nprocs), IntTab(TGTID_IOC), ioc_filename ); 

    VciVgsb<vci_param>* bus;
    bus = new VciVgsb<vci_param>("vgsb", maptab, 2+nprocs, 9);

    //////////////////////////////////////////////////////////////////////////
    // Net-List
    //////////////////////////////////////////////////////////////////////////
    for (int i=0; i< nprocs; i++){
    proc[i]->p_clk                     (signal_clk);
    proc[i]->p_resetn                  (signal_resetn);
    proc[i]->p_vci                     (signal_vci_init_proc[i]);
    proc[i]->p_irq[0]                  (signal_irq_procs[i]);
    proc[i]->p_irq[1]                  (signal_false);
    proc[i]->p_irq[2]                  (signal_false);
    proc[i]->p_irq[3]                  (signal_false);
    proc[i]->p_irq[4]                  (signal_false);
    proc[i]->p_irq[5]                  (signal_false);
}
    rom->p_clk                      (signal_clk);
    rom->p_resetn                   (signal_resetn);
    rom->p_vci                      (signal_vci_tgt_rom);

    ram->p_clk                      (signal_clk);
    ram->p_resetn                   (signal_resetn);
    ram->p_vci                      (signal_vci_tgt_ram);

    gcd->p_clk                      (signal_clk);
    gcd->p_resetn                   (signal_resetn);
    gcd->p_vci                      (signal_vci_tgt_gcd);

    tty->p_clk                      (signal_clk);
    tty->p_resetn                   (signal_resetn);
    tty->p_vci                      (signal_vci_tgt_tty);
    for (int i=0; i< nprocs; i++)
    tty->p_irq[i]                   (signal_irq_ttys[i]);

    timer->p_clk                    (signal_clk);
    timer->p_resetn                 (signal_resetn);
    timer->p_vci                    (signal_vci_tgt_tim);
    for (int i=0; i< nprocs; i++)
    timer->p_irq[i]                 (signal_irq_tims[i]);

    icu->p_clk                      (signal_clk);
    icu->p_resetn                   (signal_resetn);
    icu->p_vci                      (signal_vci_tgt_icu);
    for (int i = 0; i < nprocs; i++)
        icu->p_irq_out[i]          (signal_irq_procs[i]);
    for (int i = 16; i < 32; i++)
        icu->p_irq_in[i]            (signal_false);

    icu->p_irq_in[0]            (signal_irq_ioc);
    icu->p_irq_in[1]            (signal_false);
    icu->p_irq_in[2]            (signal_false);
    icu->p_irq_in[3]            (signal_false);

    for (int i = 0; i < nprocs; i++)
    {
        icu->p_irq_in[i + 4](signal_irq_dmas[i]);
        icu->p_irq_in[i + 8](signal_irq_tims[i]);
        icu->p_irq_in[i + 12](signal_irq_ttys[i]);
    }
    for (int i = nprocs; i < 4; i++) //4 is the Max processor we can use 
    {
        icu->p_irq_in[i + 4](signal_false);
        icu->p_irq_in[i + 8](signal_false);
        icu->p_irq_in[i + 12](signal_false);
    }

    fbf->p_clk                      (signal_clk);
    fbf->p_resetn                   (signal_resetn);
    fbf->p_vci                      (signal_vci_tgt_fbf);

    ioc->p_clk                      (signal_clk);
    ioc->p_resetn                   (signal_resetn);
    ioc->p_vci_initiator            (signal_vci_init_ioc);
    ioc->p_vci_target               (signal_vci_tgt_ioc);
    ioc->p_irq                      (signal_irq_ioc);

    dma->p_clk                      (signal_clk);
    dma->p_resetn                   (signal_resetn);
    dma->p_vci_initiator            (signal_vci_init_dma);
    dma->p_vci_target               (signal_vci_tgt_dma);
    for (int i=0; i< nprocs; i++)
    dma->p_irq[i]                   (signal_irq_dmas[i]);

    bus->p_clk                      (signal_clk);
    bus->p_resetn                   (signal_resetn);
    for (int i =0; i< nprocs; i++){
    bus->p_to_initiator[i]          (signal_vci_init_proc[i]);
    }
    bus->p_to_initiator[1 + nprocs -1]     (signal_vci_init_dma);
    bus->p_to_initiator[2 + nprocs -1]     (signal_vci_init_ioc);
    bus->p_to_target[TGTID_ROM]     (signal_vci_tgt_rom);
    bus->p_to_target[TGTID_RAM]     (signal_vci_tgt_ram);
    bus->p_to_target[TGTID_TTY]     (signal_vci_tgt_tty);
    bus->p_to_target[TGTID_GCD]     (signal_vci_tgt_gcd);
    bus->p_to_target[TGTID_TIM]     (signal_vci_tgt_tim);
    bus->p_to_target[TGTID_ICU]     (signal_vci_tgt_icu);
    bus->p_to_target[TGTID_DMA]     (signal_vci_tgt_dma);
    bus->p_to_target[TGTID_FBF]     (signal_vci_tgt_fbf);
    bus->p_to_target[TGTID_IOC]     (signal_vci_tgt_ioc);

    //////////////////////////////////////////////////////////////////////////
    // simulation
    //////////////////////////////////////////////////////////////////////////

    sc_start( sc_time( 1, SC_NS ) ) ;
    signal_false = false;
    signal_resetn = false;
    sc_start( sc_time( 1, SC_NS ) ) ;

    signal_resetn = true;
    for ( int n=1 ; n<ncycles ; n++ )
    {
        if( debug && (n > from_cycle) )
        {
            std::cout << "***************** cycle " << std::dec << n << std::endl;
            for(int i=0; i< nprocs; i++)
            proc[i]->print_trace(1);
            bus->print_trace();
            timer->print_trace();
            rom->print_trace();
            ram->print_trace();
   //         if( signal_irq_procs.read() ) std::cout << "IRQ_PROC" << std::endl;
   //         if( signal_irq_tims.read() )  std::cout << "IRQ_TIM"  << std::endl;
   //         if( signal_irq_ttys.read() )  std::cout << "IRQ_TTY"  << std::endl;
   //         if( signal_irq_ioc.read() )  std::cout << "IRQ_IOC"  << std::endl;
   //         if( signal_irq_dmas.read() )  std::cout << "IRQ_DMA"  << std::endl;
        }
        sc_start( sc_time( 1 , SC_NS ) ) ;
    }

    sc_stop();

    return(0);

} // end _main