⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 benif.py

📁 改进的基于6个mips核的NOC网络
💻 PY
字号:
#!/usr/bin/env pythonimport os, sys, string# generating wrapper around NoC for implementation in BenOne Nallatech boardif len(sys.argv) != 3 :    print 'Usage: python benif.py <xdim> <ydim>'    sys.exit(1)X,Y = map( int, sys.argv[1:3] )N = X*Ynet = 'NETWORK%dx%d'%(X,Y)lnet = string.lower(net)# generated CPP and H filescf = open( 'benif_%s.cpp'%lnet, 'w' )hf = open( 'benif_%s.h'%lnet, 'w' )################################################################################################################################################################# header file#################################################################################################################################################################includeshf.write('''#include <systemc.h>#include "netmips.h"#include "%s.h"'''%lnet)################################################################################# wrapper modulehf.write('\nSC_MODULE(BENIF_NET_WRAPPER)\n{\n')# wrapper ports to Nallatech communication corefor s in ('IFCLK','WRITE_STROBE','READ_STROBE','DMA_ENABLE','DMA_DIRECTION',          'DMA_RDY','DMA_DATA_AVAILABLE','RST','SYNC_RESET','DMA_RESET'):    hf.write('  sc_in< bool > %s;\n'%s)hf.write('''  sc_in< sc_uint<31> > ADDRESS;  sc_inout_rv< 32 > DATA;  sc_inout_rv< 32 > DMA_DATA;  sc_in< sc_uint<32> > COUNT;  sc_in< sc_uint<4> > DMA_SEL;  sc_out< bool > DMA_WEN;  sc_out< bool > DMA_REN;  sc_out< bool > INT;  sc_out< sc_bv<4> > LEDS;''')# wrapper ports to data processor's memorieshf.write('''  sc_out<sc_uint<32> > memADDR;  sc_out<sc_int<32> > memDI;  sc_out<bool> memEN;  sc_out<bool> memCLK;  sc_out<bool> memRST;''')hf.write('  sc_in<sc_int<32> > %s;\n'%string.join( map( lambda i : 'ramDO%d,romDO%d'%(i,i), range(N)),','))hf.write('  sc_out<bool> %s;\n'%string.join( map( lambda i : 'ramWE%d,romWE%d'%(i,i), range(N)),','))hf.write('  sc_in<sc_bv<32> > %s;\n'%string.join( map( lambda i : 'pc%d'%(i), range(N)),','))hf.write('  sc_out<bool> %s;\n'%string.join( map( lambda i : 'enable%d'%(i), range(N)),','))hf.write('  sc_out<bool> reset;\n')hf.write('''#ifdef USEXRAM  sc_out<sc_uint<32> > xADDR;  sc_out<bool> xCLK;''')hf.write('  sc_in<sc_int<32> > %s;\n'%string.join( map( lambda i : 'xDO%d'%(i), range(N)),','))hf.write('  sc_out<bool> %s;\n'%string.join( map( lambda i : 'xWE%d'%(i), range(N)),','))  hf.write('#endif\n')# internal signals and constructorhf.write('''  sc_signal< sc_uint<32> > addr;  sc_signal< sc_uint<32> > memsel;  sc_signal< sc_uint<25> > cnt;    sc_signal< sc_uint<32> > control;    void logic();  void count();  void register_write();  void register_read();  void memory_input();    SC_CTOR(BENIF_NET_WRAPPER)  {    SC_METHOD(logic);    sensitive << IFCLK << WRITE_STROBE << READ_STROBE << DMA_ENABLE               << DMA_DIRECTION << DMA_RDY << DMA_DATA_AVAILABLE              << RST << SYNC_RESET << DMA_RESET              << ADDRESS << DATA              << DMA_DATA << COUNT << DMA_SEL              << control << addr << memsel << cnt;    SC_METHOD(memory_input);    sensitive << IFCLK << DATA << addr << memsel << ADDRESS << WRITE_STROBE << control;    SC_METHOD(count);    sensitive_pos << IFCLK << RST;        SC_METHOD(register_write);    sensitive_pos << IFCLK << RST;        SC_METHOD(register_read);    sensitive << READ_STROBE << ADDRESS << addr << memsel;''')hf.write('  sensitive << %s;\n'%string.join( map( lambda i : 'pc%d'%(i), range(N)),' << '))hf.write('  sensitive << %s;\n'%string.join( map( lambda i : 'ramDO%d << romDO%d'%(i,i), range(N)),' << '))hf.write('#ifdef USEXRAM\n')hf.write('  sensitive << %s;\n'%string.join( map( lambda i : 'xDO%d'%(i), range(N)),' << '))hf.write('#endif\n  }\n};\n')################################################################################# top-level modulehf.write('''SC_MODULE(BENIF_NET){''')# instantiated modules: networkhf.write('  %s *%s;\n'%(net,lnet))# ... and data processorsfor y in range(Y):    for x in range(X):        hf.write('  NETmMIPS *dp_x%dy%d;\n'%(x,y))# ... and the wrapperhf.write('  BENIF_NET_WRAPPER *wrapper;\n')# declaration of portshf.write('''    sc_in<bool>   MIPSCLK;    sc_in< bool > IFCLK;  sc_in< bool > WRITE_STROBE;  sc_in< bool > READ_STROBE;  sc_in< bool > DMA_ENABLE;  sc_in< bool > DMA_DIRECTION;  sc_in< bool > DMA_RDY;  sc_in< bool > DMA_DATA_AVAILABLE;  sc_in< bool > RST;  sc_in< bool > SYNC_RESET;  sc_in< bool > DMA_RESET;  sc_in< sc_uint<31> > ADDRESS;  sc_inout_rv< 32 > DATA;  sc_inout_rv< 32 > DMA_DATA;  sc_in< sc_uint<32> > COUNT;  sc_in< sc_uint<4> > DMA_SEL;  sc_out< bool > DMA_WEN;  sc_out< bool > DMA_REN;  sc_out< bool > INT;  sc_out< sc_bv<4> > LEDS;  sc_signal<sc_uint<32> > memADDR;  sc_signal<sc_int<32> > memDI;  sc_signal<bool> memEN;  sc_signal<bool> memCLK;  sc_signal<bool> memRST;''')# signals between DP memories and wrapperhf.write('  sc_signal<sc_int<32> > %s;\n'%string.join( map( lambda i : 'ramDO%d,romDO%d'%(i,i), range(N)),','))hf.write('  sc_signal<bool> %s;\n'%string.join( map( lambda i : 'ramWE%d,romWE%d'%(i,i), range(N)),','))hf.write('  sc_signal<sc_bv<32> > %s;\n'%string.join( map( lambda i : 'pc%d'%(i), range(N)),','))hf.write('  sc_signal<bool> %s;\n'%string.join( map( lambda i : 'enable%d'%(i), range(N)),','))hf.write('  sc_signal<bool> reset;\n')hf.write('''#ifdef USEXRAM  sc_signal<sc_uint<32> > xADDR;  sc_signal<bool> xCLK;''')hf.write('  sc_signal<sc_int<32> > %s;\n'%string.join( map( lambda i : 'xDO%d'%(i), range(N)),','))hf.write('  sc_signal<bool> %s;\n'%string.join( map( lambda i : 'xWE%d'%(i), range(N)),','))  hf.write('#endif\n')# signals between DP and networkfor y in range(Y):    for x in range(X):        for s in ( 'din', 'dout') :            hf.write('  sc_signal< sc_bv<FLIT_LEN> > x%dy%d%s;\n'%(x,y,s))        for s in ( 'req_net', 'ack_net', 'ack_dp', 'req_dp' ) :            hf.write('  sc_signal<bool> x%dy%d%s;\n'%(x,y,s))# constructorhf.write('\n  SC_CTOR(BENIF_NET)\n  {\n' )# module creationhf.write('    %s = new %s("%s");\n'%(lnet,net,lnet))for y in range(Y):    for x in range(X):        hf.write('    dp_x%dy%d = new NETmMIPS("dp_x%dy%d");\n'%(x,y,x,y))hf.write('    wrapper = new BENIF_NET_WRAPPER("wrapper");\n\n')# connect wrapper to signalshf.write('    wrapper->reset(reset);\n')for n in range(N) : hf.write('    wrapper->enable%d(enable%d);\n'%(n,n))# redirect i/o ports to wrapperfor s in ('IFCLK','WRITE_STROBE','READ_STROBE','DMA_ENABLE','DMA_DIRECTION',          'DMA_RDY','DMA_DATA_AVAILABLE','RST','SYNC_RESET','DMA_RESET',          'ADDRESS','DATA','DMA_DATA','COUNT','DMA_SEL','DMA_WEN','DMA_REN','INT','LEDS'):    hf.write('    wrapper->%s(%s);\n'%(s,s))# connect wrapper to memory signalshf.write('\n')for s in ('ADDR','DI','EN','CLK','RST'):    hf.write('    wrapper->mem%s(mem%s);\n'%(s,s))for n in range(N):    for m in ('ram', 'rom'):        for s in ('DO','WE'):            hf.write('    wrapper->%s%s%d(%s%s%d);\n'%(m,s,n,m,s,n))hf.write('\n')# connect DP to memory signalsfor y in range(Y):    for x in range(X):        dp = 'dp_x%dy%d'%(x,y)        n = y*X + x                for s in ('ADDR','DI','EN','CLK','RST'):            hf.write('    %s->ram%s(mem%s); %s->rom%s(mem%s);\n'%(dp,s,s,dp,s,s))                for m in ('ram', 'rom'):            for s in ('DO','WE'):                hf.write('    %s->%s%s(%s%s%d);\n'%(dp,m,s,m,s,n))        hf.write('\n')# xram memory connectionshf.write('#ifdef USEXRAM\n')for s in ('ADDR','CLK'):    hf.write('    wrapper->x%s(x%s);\n'%(s,s))for n in range(N):    for s in ('DO','WE'):        hf.write('    wrapper->x%s%d(x%s%d);\n'%(s,n,s,n))        for y in range(Y):    for x in range(X):        dp = 'dp_x%dy%d'%(x,y)        n = y*X + x                for s in ('ADDR','CLK'):            hf.write('    %s->x%s(x%s);\n'%(dp,s,s))                for s in ('DO','WE'):            hf.write('    %s->x%s(x%s%d);\n'%(dp,s,s,n))        hf.write('\n')hf.write('#endif\n')# connect network with DPs# first - networkhf.write('    %s->clk(MIPSCLK); %s->rst(reset);\n'%(lnet,lnet))for y in range(Y):    for x in range(X):        c = 'x%dy%d'%(x,y)        for s in ( 'din', 'dout', 'req_net', 'ack_net', 'ack_dp', 'req_dp') :            hf.write('    %s->%s%s(%s%s);\n'%(lnet,c,s,c,s))hf.write('\n')# now - connect DPfor y in range(Y):    for x in range(X):        c = 'x%dy%d'%(x,y)        dp = 'dp_'+c        n = y*X + x        hf.write('    %s->clock(MIPSCLK); %s->reset(reset); %s->enable(enable%d);\n'%(dp,dp,dp,n))        for s,t in ( ('data_out','din'), ('data_in','dout'),                     ('req_out','req_net'), ('ack_in','ack_net'),                     ('ack_out','ack_dp'), ('req_in','req_dp') ):            hf.write('    %s->%s(%s%s);\n'%(dp,s,c,t))        hf.write('\n')for y in range(Y):    for x in range(X):        c = 'x%dy%d'%(x,y)        dp = 'dp_'+c        n = y*X + x        hf.write('    %s->bus_pc(pc%d); wrapper->pc%d(pc%d);\n'%(dp,n,n,n))hf.write('  }\n};\n' )################################################################################################################################################################# cpp file################################################################################################################################################################cf.write('#include "benif_%s.h"\n'%lnet)cf.write('''void BENIF_NET_WRAPPER::count(){  if( RST.read() ) cnt = 0;  else cnt = cnt.read()+1;}void BENIF_NET_WRAPPER::register_write(){  sc_uint<8> reg = ADDRESS.read().range(7,0);  if( RST.read() ) {    addr = 0; memsel = 0; control = 0;  }  else if( WRITE_STROBE.read() )    {      switch(reg)        {        case 2 : memsel = DATA.read(); break;        case 3 : addr = DATA.read(); break;        case 4 : control = DATA.read(); break;        }    }  if( (READ_STROBE.read()||WRITE_STROBE.read()) && reg==5 ) addr = addr.read()+4;}void BENIF_NET_WRAPPER::register_read(){  sc_uint<8> reg = ADDRESS.read().range(7,0);  sc_int<32> memout;  sc_lv<32> dout;  sc_lv<32> z32;  sc_uint<32> mem = memsel.read();  for(int i=0;i<32;i++) z32[i]=\'z\';   switch( mem ){''')for n in range(N):    cf.write('  case 0x%08x : memout = romDO%d.read(); break;\n'%(0x1<<(2*n),n))    cf.write('  case 0x%08x : memout = ramDO%d.read(); break;\n'%(0x1<<(2*n+1),n))cf.write('#ifdef USEXRAM\n')for n in range(N):    cf.write('  case 0x%08x : memout = xDO%d.read(); break;\n'%(0x1<<(2*N+n),n))cf.write('#endif\n')cf.write('''  default : memout = 0;  }    switch(reg)    {    case 2 : dout = memsel.read(); break;    case 3 : dout = addr.read(); break;    case 4 : dout = control.read(); break;    case 5 : dout = memout; break;''')for n in range(N):    cf.write('    case %d : dout = pc%d.read(); break;\n'%(6+n,n))         cf.write('''    default : dout = memout; break;    }      if( READ_STROBE.read() )    DATA.write( dout );  else {    DATA.write( z32 );  }    DMA_DATA.write( z32 );}void BENIF_NET_WRAPPER::logic(){  sc_bv<4> leds;    reset.write(RST.read());''')for n in range(N):    cf.write('  enable%d.write(control.read()[%d] != 0);\n'%(n,n))cf.write('''    leds[3] = !(control.read()[0] != 0);  leds[2] = !(cnt.read()[24] != 0);  leds[1] = 1;  leds[0] = 1;    LEDS.write(leds);    INT.write(false);  DMA_REN.write(false);  DMA_WEN.write(false);}void BENIF_NET_WRAPPER::memory_input(){  sc_uint<8> reg = ADDRESS.read().range(7,0);  bool en = (reg==5);  bool we = (en&&WRITE_STROBE.read());  #ifndef VERILOG  memDI.write( we ? DATA.read() : 0 );#else  memDI.write( DATA.read() );#endif''')for n in range(N):    cf.write('  romWE%d.write(we && memsel.read()[%d]); ramWE%d.write(we && memsel.read()[%d]);\n'%(n,2*n,n,2*n+1))cf.write('''  memADDR.write( addr.read() );  memCLK.write( IFCLK.read() );  memEN.write(en);  memRST.write(false);#ifdef USEXRAM  xADDR.write( addr.read() );  xCLK.write( IFCLK.read() );''')for n in range(N):  cf.write('  xWE%d.write( control.read()[31]!=0 );\n'%(n));  cf.write('#endif\n}\n')hf.close()cf.close()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -