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

📄 vfbr.v

📁 这是韩国EQUATOR公司提供的DEMO程序
💻 V
字号:
/**
*** Copyright (c) 2001 Equator Technologies, Inc.
**/

//
// vsema.v
//
// Abstract:
//
// 	Writes some status data to vlmem, then clears semaphore before
//        entering exit loop.
//
// Notes :
//    ~ To view the 'status' buffer, on egdb do :
//        (egdb) eti dump pio 0x3a1010 8
//

#include "vas.h"

register tmpData_r16 r16;
register tmpData_r17 r17;
register tmpAddr_r18 r18;

//
// main()
//
main: {
    nop; // Must have 4 nops at start of main()!!
    nop;
    nop;
    nop;

    setacc 0xa1;
    setacc D0_STATUS+0;
    st lastAcc, acc; 
    nop;
	
    // Set ramoffset just for the heck of it
    setacc 0xf; 
    ioif   acc, 3; // IOIF_RAMOFFSET
    nop;

//----------------------------------------------------------
//
// Test fastbranch
//   ~ First time, test with FBRCNT = infinite
//   ~ First time, test with FBRCNT = infinite
//   ~ Third time, test with FBRCNT = finite, read count
//
//----------------------------------------------------------
I_TEST_FASTBRANCH_FINITE:

#if 1 // This works

    setacc 63;   // finite number of iterations
    ioif acc, 1; // IOIF_FBRCNT

    setacc 0x100;
    setreg tmpData_r17;

#else // This fails

    setacc 0x100;
    setreg tmpData_r17;
    ioif acc, 1; // IOIF_FBRCNT
    setacc 63;   // finite number of iterations
    nop;

#endif

    setacc D0_DATA_FIN;
    setreg tmpAddr_r18;
    nop;

    fastloop MY_FIN {
       st        tmpData_r17, tmpAddr_r18;
       add.w     tmpAddr_r18, 1;
       sub.w     tmpData_r17, 1;
       nop;
       br.acceq0 I_FASTBRANCH_FINITE_END;
    }

I_FASTBRANCH_FINITE_END:
    nop;
    nop;
    nop;
    nop;

//----------------------------------------------------------
// Test fastbranch with count set to run indefinitely
//----------------------------------------------------------
I_TEST_FASTBRANCH_INFINITE:

    setacc 1; // infinite number of iterations
    ioif acc, 1; // IOIF_FBRCNT

    setacc 0x100;
    setreg tmpData_r17;

    setacc D0_DATA_INF;
    setreg tmpAddr_r18;
    nop;

    fastloop MY_FL_INF {
       st        tmpData_r17, tmpAddr_r18;
       add.w     tmpAddr_r18, 1;
       sub.w     tmpData_r17, 1;
       nop;
       br.acceq0 I_FASTBRANCH_INFINITE_END;
    }

I_FASTBRANCH_INFINITE_END:

//----------------------------------------------------------
// Test fastbranch with finite count, read count after exit
//----------------------------------------------------------
I_TEST_FASTBRANCH_READ_COUNT:

  
    setacc 0x2; // Position for hwtaberr
    ioif   acc, 6; // SET
    nop;

    setacc 30; // Actual number of iterations -- result 0x1e in fbrcnt read
               // 0x003a1800 --> 0xffff1e00 0xffff001f 0xffffffff 0xffffffff 
               // 0x003a1810 --> 0xffff3f80 0xffff003f 0xffffffff 0xffffffff 

    //setacc 31; // Actual number of iterations -- result 0x1f in fbrcnt read
               // 0x003a1800 --> 0xffff1f00 0xffff0020 0xffffffff 0xffffffff 
               // 0x003a1810 --> 0xffff3f80 0xffff003f 0xffffffff 0xffffffff 

    setreg tmpData_r16;
    nop;

    setacc 63; // Value to ioif fbrcnt
    setreg tmpData_r17;
    nop;

    setacc 63;   // finite number of iterations
    ioif   acc, 1; // IOIF_FBRCNT
    nop;

    ioif acc, 0; // 0 => READIOIF
    nop;
    st acc, D_DATA + 8 + 0;

    add tmpData_r17, 0; // init 63
    st  acc, D_DATA + 8 + 2;
    nop;

    fastloop MY_COUNT {
       add       tmpData_r16, 0;
       br.acceq0 I_FASTBRANCH_READ_COUNT_END;
       sub.w     tmpData_r16, 1;
       sub.w     tmpData_r17, 1;
       nop;
    }

    nop;
    nop;
    nop;
    nop;

I_FASTBRANCH_READ_COUNT_END:

/*
    READIOIF (0) : reads the values as acc in the following format:
    fbrcnt as bits 15:8
    fastbranch indicator as bit 7
    hwterr as bit 6
    ramoffset value as bits 5:1
*/
   setacc 0xdd; // garbage
   ioif acc, 0; // 0 => READIOIF
   nop;
   st acc, D_DATA + 0;

   add tmpData_r17, 0; // init 63
   st  acc, D_DATA + 2;
   nop;

I_SEMA:

    setacc 0;
    setacc D1_SEMA;
    st lastAcc, acc; // Clear semaphore so vliw will unhalt
    nop;

I_EXIT:

    // Write STATUS buffer
    setacc 0xaf;
    setacc D0_STATUS+2;
    st lastAcc, acc; 
    nop;

I_EXIT_2:

    // Always put a 'while(1)' loop at end of vlx program
    nop;
    br I_EXIT_2;
    nop;

} // end main()

//----------------------------------------------------------------//

//
// Lower Data Memory
//
_data0;

D0_DATA_INF :
data 0x0 (512);

D0_DATA_FIN :
data 0x0 (512);

//
// Upper Data Memory
//
_data1;
D_DATA:
data 0xFFFF (16);

D1_SEMA @16:
data 0x1234 (4);
data 0x0 (12);

D0_STATUS:
data 0x0 (8);

⌨️ 快捷键说明

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