Closed nvitya closed 3 years ago
With the IBusCachedPlugin and the DBusCachedPlugin the debugger goes crazy. After the first start I can not stop. If it is stopped after the first instruction stepping I loose the connection. Even the OpenOCD quits sometimes.
I've checked it again. The VexRiscvAvalon_hw.tcl was not up to date, probably it was the one that was generated for the xBusSimplePlugins. Now it works, but the SDRAM produces errors. Writing and reading forward (incrementing addresses) are fine with any size. Writing and reading backwards (decrementing addresses) works with 32 bit words, but does not with 16 bit data. The SDRAM conroller is from the QSYS. If I use the xBusSimplePlugins then the 16-bit write+read backwards works without errors.
I've tested also the Briey project again. I can not control it over the JTAG debugger (using only the 32k on chip ram). The Murax works.
Hi,
about the read/write issues with the cached CPU that you have with the SDRAM.
Did you tested it with some onchip ram to check if that works ?
If there is a bug on the VexRiscv side of things i would say it is likely to be in the VexRiscv to Avalon bridges. If you have a simulation wave where the issue occure, i can take a look into it without issue. a VCD or a FST file if possible
Hi,
The project also contains 32k dual port onchip RAM. From that everything runs fine. The SW project (in the attachment) mainly runs from onchip RAM and tests the SDRAM reverse.
I've uploaded the projects with I've tested. I'm not very experienced writing simulations. The board I was using is a QMTECH Cyclone IV Starter Kit, which is similar to DE0-Nano. http://www.chinaqmtech.com/download_fpga https://www.aliexpress.com/i/33007471265.html I've used Quartus 20.1.1, but I've checked with 18.1 too. You have to open the vexrv_sys.qsys with the platform manager and generate the HDL files first (they are big, I did not want to include). The SW project was developed with Eclipse CDT with Eclipse Embedded CDT Plugins (https://eclipse-embed-cdt.github.io). The build target / "board name" is C4_QSYS. I've used the OpenOCD for debugging as you described. The JTAG was a D.P. Bus Blaster v4.1.
That is realy weird that with the cached version 16 bits backward accesses do not works XD
Can you show me the data that it read and what was expected ? (sometime, symptomes can suggest the root of the issue)
Also, which version of VexRiscv are you using ? (git commit or date)
The system was synthetised with 50 MHz to surely eliminate timing issues. The memory is filled with increasing 16 bit numbers reverse, starting with 0x3344. I've checked again, no errors with the O.C. RAM. With the SDRAM always the same errors, 100% reproducible.
This is the head of the VexRiscvAvalon.v:
// Generator : SpinalHDL v1.6.0 git head : 73c8d8e2b86b45646e9d0b2e729291f2b65e6be3
// Component : VexRiscvAvalon
// Git hash : 5fc4125763a1b66758c387c0abea32e602b2e4e5
$ git show
commit 5fc4125763a1b66758c387c0abea32e602b2e4e5 (HEAD -> master, origin/master, origin/HEAD)
Merge: 5f2fcc7 3028c19
Author: Dolu1990 <charles.papon.90@gmail.com>
Date: Tue Jul 20 11:21:11 2021 +0200
Merge branch 'dev'
Test code:
void test_sdram_16_reverse(unsigned tstcnt)
{
TRACE("SDRAM-16-reverse test %u ...\r\n", tstcnt);
unsigned t0, t1;
uint32_t errcnt;
uint16_t * dp;
uint16_t * ep;
uint16_t v, rv;
#if 1
unsigned * start_addr = (unsigned *)SDRAM_BASE;
unsigned len = 1 * 1024 * 1024;
#else
unsigned * start_addr = (unsigned *)&testbuf;
unsigned len = sizeof(testbuf);
#endif
TRACE(" Filling... ");
t0 = CLOCKCNT;
dp = (uint16_t *)start_addr;
ep = dp + (len >> 1);
v = (sdram_fill_start_value & 0xFFFF);
while (dp < ep)
{
--ep;
*ep = v;
++v;
}
t1 = CLOCKCNT;
TRACE("clocks: %u\r\n", t1 - t0);
TRACE(" Comparing... \r\n");
errcnt = 0;
t0 = CLOCKCNT;
dp = (uint16_t *)start_addr;
ep = dp + (len >> 1);
v = (sdram_fill_start_value & 0xFFFF);
while (dp < ep)
{
--ep;
rv = *ep;
if (rv != v)
{
TRACE("ERR at 0x%08X = 0x%04X instead of 0x%04X !\r\n", unsigned(ep), rv, v);
++errcnt;
if (errcnt > 256)
{
break;
}
}
++v;
}
t1 = CLOCKCNT;
TRACE("clocks: %u\r\n", t1 - t0);
if (errcnt)
{
TRACE(" !!! ERRORS = %u\r\n", errcnt);
}
else
{
TRACE(" ok.\r\n");
}
}
Here are the first 256 errors:
ERR at 0x100FFFFE = 0x338B instead of 0x3344 !
ERR at 0x100FFFDE = 0x334B instead of 0x3354 ! <-- the previous 16 was ok !!!
ERR at 0x100FFFDC = 0x334B instead of 0x3355 !
ERR at 0x100FFFDA = 0x334B instead of 0x3356 !
ERR at 0x100FFFD8 = 0x334B instead of 0x3357 !
ERR at 0x100FFFD6 = 0x334B instead of 0x3358 !
ERR at 0x100FFFD4 = 0x334B instead of 0x3359 !
ERR at 0x100FFFD2 = 0x334B instead of 0x335A !
ERR at 0x100FFFD0 = 0x334B instead of 0x335B !
ERR at 0x100FFFCE = 0x334B instead of 0x335C !
ERR at 0x100FFFCC = 0x334B instead of 0x335D !
ERR at 0x100FFFCA = 0x334B instead of 0x335E !
ERR at 0x100FFFC8 = 0x334B instead of 0x335F !
ERR at 0x100FFFC6 = 0x334B instead of 0x3360 !
ERR at 0x100FFFC4 = 0x334B instead of 0x3361 !
ERR at 0x100FFFC2 = 0x334B instead of 0x3362 !
ERR at 0x100FFFC0 = 0x334B instead of 0x3363 !
ERR at 0x100FFFBE = 0x334B instead of 0x3364 !
ERR at 0x100FFF9E = 0x336B instead of 0x3374 !
ERR at 0x100FFF7E = 0x337B instead of 0x3384 !
ERR at 0x100FFF5E = 0x338B instead of 0x3394 !
ERR at 0x100FFF5C = 0x338B instead of 0x3395 !
ERR at 0x100FFF5A = 0x338B instead of 0x3396 !
ERR at 0x100FFF58 = 0x338B instead of 0x3397 !
ERR at 0x100FFF56 = 0x338B instead of 0x3398 !
ERR at 0x100FFF54 = 0x338B instead of 0x3399 !
ERR at 0x100FFF52 = 0x338B instead of 0x339A !
ERR at 0x100FFF50 = 0x338B instead of 0x339B !
ERR at 0x100FFF4E = 0x338B instead of 0x339C !
ERR at 0x100FFF4C = 0x338B instead of 0x339D !
ERR at 0x100FFF4A = 0x338B instead of 0x339E !
ERR at 0x100FFF48 = 0x338B instead of 0x339F !
ERR at 0x100FFF46 = 0x338B instead of 0x33A0 !
ERR at 0x100FFF44 = 0x338B instead of 0x33A1 !
ERR at 0x100FFF42 = 0x338B instead of 0x33A2 !
ERR at 0x100FFF40 = 0x338B instead of 0x33A3 !
ERR at 0x100FFF3E = 0x338B instead of 0x33A4 !
ERR at 0x100FFF3C = 0x338B instead of 0x33A5 !
ERR at 0x100FFF3A = 0x338B instead of 0x33A6 !
ERR at 0x100FFF38 = 0x338B instead of 0x33A7 !
ERR at 0x100FFF36 = 0x338B instead of 0x33A8 !
ERR at 0x100FFF34 = 0x338B instead of 0x33A9 !
ERR at 0x100FFF32 = 0x338B instead of 0x33AA !
ERR at 0x100FFF30 = 0x338B instead of 0x33AB !
ERR at 0x100FFF2E = 0x338B instead of 0x33AC !
ERR at 0x100FFF2C = 0x338B instead of 0x33AD !
ERR at 0x100FFF2A = 0x338B instead of 0x33AE !
ERR at 0x100FFF28 = 0x338B instead of 0x33AF !
ERR at 0x100FFF26 = 0x338B instead of 0x33B0 !
ERR at 0x100FFF24 = 0x338B instead of 0x33B1 !
ERR at 0x100FFF22 = 0x338B instead of 0x33B2 !
ERR at 0x100FFF20 = 0x338B instead of 0x33B3 !
ERR at 0x100FFF1E = 0x338B instead of 0x33B4 !
ERR at 0x100FFF1C = 0x338B instead of 0x33B5 !
ERR at 0x100FFF1A = 0x338B instead of 0x33B6 !
ERR at 0x100FFF18 = 0x338B instead of 0x33B7 !
ERR at 0x100FFF16 = 0x338B instead of 0x33B8 !
ERR at 0x100FFF14 = 0x338B instead of 0x33B9 !
ERR at 0x100FFF12 = 0x338B instead of 0x33BA !
ERR at 0x100FFF10 = 0x338B instead of 0x33BB !
ERR at 0x100FFF0E = 0x338B instead of 0x33BC !
ERR at 0x100FFF0C = 0x338B instead of 0x33BD !
ERR at 0x100FFF0A = 0x338B instead of 0x33BE !
ERR at 0x100FFF08 = 0x338B instead of 0x33BF !
ERR at 0x100FFF06 = 0x338B instead of 0x33C0 !
ERR at 0x100FFF04 = 0x338B instead of 0x33C1 !
ERR at 0x100FFF02 = 0x338B instead of 0x33C2 !
ERR at 0x100FFF00 = 0x338B instead of 0x33C3 !
ERR at 0x100FFEFE = 0x338B instead of 0x33C4 !
ERR at 0x100FFEFC = 0x338B instead of 0x33C5 !
ERR at 0x100FFEFA = 0x338B instead of 0x33C6 !
ERR at 0x100FFEF8 = 0x338B instead of 0x33C7 !
ERR at 0x100FFEF6 = 0x338B instead of 0x33C8 !
ERR at 0x100FFEF4 = 0x338B instead of 0x33C9 !
ERR at 0x100FFEF2 = 0x338B instead of 0x33CA !
ERR at 0x100FFEF0 = 0x338B instead of 0x33CB !
ERR at 0x100FFEEE = 0x338B instead of 0x33CC !
ERR at 0x100FFEEC = 0x338B instead of 0x33CD !
ERR at 0x100FFEEA = 0x338B instead of 0x33CE !
ERR at 0x100FFEE8 = 0x338B instead of 0x33CF !
ERR at 0x100FFEE6 = 0x338B instead of 0x33D0 !
ERR at 0x100FFEE4 = 0x338B instead of 0x33D1 !
ERR at 0x100FFEE2 = 0x338B instead of 0x33D2 !
ERR at 0x100FFEE0 = 0x338B instead of 0x33D3 !
ERR at 0x100FFEDE = 0x338B instead of 0x33D4 !
ERR at 0x100FFEDC = 0x338B instead of 0x33D5 !
ERR at 0x100FFEDA = 0x338B instead of 0x33D6 !
ERR at 0x100FFED8 = 0x338B instead of 0x33D7 !
ERR at 0x100FFED6 = 0x338B instead of 0x33D8 !
ERR at 0x100FFED4 = 0x338B instead of 0x33D9 !
ERR at 0x100FFED2 = 0x338B instead of 0x33DA !
ERR at 0x100FFED0 = 0x338B instead of 0x33DB !
ERR at 0x100FFECE = 0x338B instead of 0x33DC !
ERR at 0x100FFECC = 0x338B instead of 0x33DD !
ERR at 0x100FFECA = 0x338B instead of 0x33DE !
ERR at 0x100FFEC8 = 0x338B instead of 0x33DF !
ERR at 0x100FFEC6 = 0x338B instead of 0x33E0 !
ERR at 0x100FFEC4 = 0x338B instead of 0x33E1 !
ERR at 0x100FFEC2 = 0x338B instead of 0x33E2 !
ERR at 0x100FFEC0 = 0x338B instead of 0x33E3 !
ERR at 0x100FFEBE = 0x338B instead of 0x33E4 !
ERR at 0x100FFEBC = 0x338B instead of 0x33E5 !
ERR at 0x100FFEBA = 0x338B instead of 0x33E6 !
ERR at 0x100FFEB8 = 0x338B instead of 0x33E7 !
ERR at 0x100FFEB6 = 0x338B instead of 0x33E8 !
ERR at 0x100FFEB4 = 0x338B instead of 0x33E9 !
ERR at 0x100FFEB2 = 0x338B instead of 0x33EA !
ERR at 0x100FFEB0 = 0x338B instead of 0x33EB !
ERR at 0x100FFEAE = 0x338B instead of 0x33EC !
ERR at 0x100FFEAC = 0x338B instead of 0x33ED !
ERR at 0x100FFEAA = 0x338B instead of 0x33EE !
ERR at 0x100FFEA8 = 0x338B instead of 0x33EF !
ERR at 0x100FFEA6 = 0x338B instead of 0x33F0 !
ERR at 0x100FFEA4 = 0x338B instead of 0x33F1 !
ERR at 0x100FFEA2 = 0x338B instead of 0x33F2 !
ERR at 0x100FFEA0 = 0x338B instead of 0x33F3 !
ERR at 0x100FFE9E = 0x338B instead of 0x33F4 !
ERR at 0x100FFE7E = 0x33FB instead of 0x3404 !
ERR at 0x100FFE5E = 0x340B instead of 0x3414 !
ERR at 0x100FFE3E = 0x341B instead of 0x3424 !
ERR at 0x100FFE1E = 0x342B instead of 0x3434 !
ERR at 0x100FFDFE = 0x343B instead of 0x3444 !
ERR at 0x100FFDDE = 0x344B instead of 0x3454 !
ERR at 0x100FFDDC = 0x344B instead of 0x3455 !
ERR at 0x100FFDDA = 0x344B instead of 0x3456 !
ERR at 0x100FFDD8 = 0x344B instead of 0x3457 !
ERR at 0x100FFDD6 = 0x344B instead of 0x3458 !
ERR at 0x100FFDD4 = 0x344B instead of 0x3459 !
ERR at 0x100FFDD2 = 0x344B instead of 0x345A !
ERR at 0x100FFDD0 = 0x344B instead of 0x345B !
ERR at 0x100FFDCE = 0x344B instead of 0x345C !
ERR at 0x100FFDCC = 0x344B instead of 0x345D !
ERR at 0x100FFDCA = 0x344B instead of 0x345E !
ERR at 0x100FFDC8 = 0x344B instead of 0x345F !
ERR at 0x100FFDC6 = 0x344B instead of 0x3460 !
ERR at 0x100FFDC4 = 0x344B instead of 0x3461 !
ERR at 0x100FFDC2 = 0x344B instead of 0x3462 !
ERR at 0x100FFDC0 = 0x344B instead of 0x3463 !
ERR at 0x100FFDBE = 0x344B instead of 0x3464 !
ERR at 0x100FFDBC = 0x344B instead of 0x3465 !
ERR at 0x100FFDBA = 0x344B instead of 0x3466 !
ERR at 0x100FFDB8 = 0x344B instead of 0x3467 !
ERR at 0x100FFDB6 = 0x344B instead of 0x3468 !
ERR at 0x100FFDB4 = 0x344B instead of 0x3469 !
ERR at 0x100FFDB2 = 0x344B instead of 0x346A !
ERR at 0x100FFDB0 = 0x344B instead of 0x346B !
ERR at 0x100FFDAE = 0x344B instead of 0x346C !
ERR at 0x100FFDAC = 0x344B instead of 0x346D !
ERR at 0x100FFDAA = 0x344B instead of 0x346E !
ERR at 0x100FFDA8 = 0x344B instead of 0x346F !
ERR at 0x100FFDA6 = 0x344B instead of 0x3470 !
ERR at 0x100FFDA4 = 0x344B instead of 0x3471 !
ERR at 0x100FFDA2 = 0x344B instead of 0x3472 !
ERR at 0x100FFDA0 = 0x344B instead of 0x3473 !
ERR at 0x100FFD9E = 0x344B instead of 0x3474 !
ERR at 0x100FFD9C = 0x344B instead of 0x3475 !
ERR at 0x100FFD9A = 0x344B instead of 0x3476 !
ERR at 0x100FFD98 = 0x344B instead of 0x3477 !
ERR at 0x100FFD96 = 0x344B instead of 0x3478 !
ERR at 0x100FFD94 = 0x344B instead of 0x3479 !
ERR at 0x100FFD92 = 0x344B instead of 0x347A !
ERR at 0x100FFD90 = 0x344B instead of 0x347B !
ERR at 0x100FFD8E = 0x344B instead of 0x347C !
ERR at 0x100FFD8C = 0x344B instead of 0x347D !
ERR at 0x100FFD8A = 0x344B instead of 0x347E !
ERR at 0x100FFD88 = 0x344B instead of 0x347F !
ERR at 0x100FFD86 = 0x344B instead of 0x3480 !
ERR at 0x100FFD84 = 0x344B instead of 0x3481 !
ERR at 0x100FFD82 = 0x344B instead of 0x3482 !
ERR at 0x100FFD80 = 0x344B instead of 0x3483 !
ERR at 0x100FFD7E = 0x344B instead of 0x3484 !
ERR at 0x100FFD7C = 0x344B instead of 0x3485 !
ERR at 0x100FFD7A = 0x344B instead of 0x3486 !
ERR at 0x100FFD78 = 0x344B instead of 0x3487 !
ERR at 0x100FFD76 = 0x344B instead of 0x3488 !
ERR at 0x100FFD74 = 0x344B instead of 0x3489 !
ERR at 0x100FFD72 = 0x344B instead of 0x348A !
ERR at 0x100FFD70 = 0x344B instead of 0x348B !
ERR at 0x100FFD6E = 0x344B instead of 0x348C !
ERR at 0x100FFD6C = 0x344B instead of 0x348D !
ERR at 0x100FFD6A = 0x344B instead of 0x348E !
ERR at 0x100FFD68 = 0x344B instead of 0x348F !
ERR at 0x100FFD66 = 0x344B instead of 0x3490 !
ERR at 0x100FFD64 = 0x344B instead of 0x3491 !
ERR at 0x100FFD62 = 0x344B instead of 0x3492 !
ERR at 0x100FFD60 = 0x344B instead of 0x3493 !
ERR at 0x100FFD5E = 0x344B instead of 0x3494 !
ERR at 0x100FFD5C = 0x344B instead of 0x3495 !
ERR at 0x100FFD5A = 0x344B instead of 0x3496 !
ERR at 0x100FFD58 = 0x344B instead of 0x3497 !
ERR at 0x100FFD56 = 0x344B instead of 0x3498 !
ERR at 0x100FFD54 = 0x344B instead of 0x3499 !
ERR at 0x100FFD52 = 0x344B instead of 0x349A !
ERR at 0x100FFD50 = 0x344B instead of 0x349B !
ERR at 0x100FFD4E = 0x344B instead of 0x349C !
ERR at 0x100FFD4C = 0x344B instead of 0x349D !
ERR at 0x100FFD4A = 0x344B instead of 0x349E !
ERR at 0x100FFD48 = 0x344B instead of 0x349F !
ERR at 0x100FFD46 = 0x344B instead of 0x34A0 !
ERR at 0x100FFD44 = 0x344B instead of 0x34A1 !
ERR at 0x100FFD42 = 0x344B instead of 0x34A2 !
ERR at 0x100FFD40 = 0x344B instead of 0x34A3 !
ERR at 0x100FFD3E = 0x344B instead of 0x34A4 !
ERR at 0x100FFD3C = 0x344B instead of 0x34A5 !
ERR at 0x100FFD3A = 0x344B instead of 0x34A6 !
ERR at 0x100FFD38 = 0x344B instead of 0x34A7 !
ERR at 0x100FFD36 = 0x344B instead of 0x34A8 !
ERR at 0x100FFD34 = 0x344B instead of 0x34A9 !
ERR at 0x100FFD32 = 0x344B instead of 0x34AA !
ERR at 0x100FFD30 = 0x344B instead of 0x34AB !
ERR at 0x100FFD2E = 0x344B instead of 0x34AC !
ERR at 0x100FFD2C = 0x344B instead of 0x34AD !
ERR at 0x100FFD2A = 0x344B instead of 0x34AE !
ERR at 0x100FFD28 = 0x344B instead of 0x34AF !
ERR at 0x100FFD26 = 0x344B instead of 0x34B0 !
ERR at 0x100FFD24 = 0x344B instead of 0x34B1 !
ERR at 0x100FFD22 = 0x344B instead of 0x34B2 !
ERR at 0x100FFD20 = 0x344B instead of 0x34B3 !
ERR at 0x100FFD1E = 0x344B instead of 0x34B4 !
ERR at 0x100FFD1C = 0x344B instead of 0x34B5 !
ERR at 0x100FFD1A = 0x344B instead of 0x34B6 !
ERR at 0x100FFD18 = 0x344B instead of 0x34B7 !
ERR at 0x100FFD16 = 0x344B instead of 0x34B8 !
ERR at 0x100FFD14 = 0x344B instead of 0x34B9 !
ERR at 0x100FFD12 = 0x344B instead of 0x34BA !
ERR at 0x100FFD10 = 0x344B instead of 0x34BB !
ERR at 0x100FFD0E = 0x344B instead of 0x34BC !
ERR at 0x100FFD0C = 0x344B instead of 0x34BD !
ERR at 0x100FFD0A = 0x344B instead of 0x34BE !
ERR at 0x100FFD08 = 0x344B instead of 0x34BF !
ERR at 0x100FFD06 = 0x344B instead of 0x34C0 !
ERR at 0x100FFD04 = 0x344B instead of 0x34C1 !
ERR at 0x100FFD02 = 0x344B instead of 0x34C2 !
ERR at 0x100FFD00 = 0x344B instead of 0x34C3 !
ERR at 0x100FFCFE = 0x344B instead of 0x34C4 !
ERR at 0x100FFCFC = 0x344B instead of 0x34C5 !
ERR at 0x100FFCFA = 0x344B instead of 0x34C6 !
ERR at 0x100FFCF8 = 0x344B instead of 0x34C7 !
ERR at 0x100FFCF6 = 0x344B instead of 0x34C8 !
ERR at 0x100FFCF4 = 0x344B instead of 0x34C9 !
ERR at 0x100FFCF2 = 0x344B instead of 0x34CA !
ERR at 0x100FFCF0 = 0x344B instead of 0x34CB !
ERR at 0x100FFCEE = 0x344B instead of 0x34CC !
ERR at 0x100FFCEC = 0x344B instead of 0x34CD !
ERR at 0x100FFCEA = 0x344B instead of 0x34CE !
ERR at 0x100FFCE8 = 0x344B instead of 0x34CF !
ERR at 0x100FFCE6 = 0x344B instead of 0x34D0 !
ERR at 0x100FFCE4 = 0x344B instead of 0x34D1 !
ERR at 0x100FFCE2 = 0x344B instead of 0x34D2 !
ERR at 0x100FFCE0 = 0x344B instead of 0x34D3 !
ERR at 0x100FFCDE = 0x344B instead of 0x34D4 !
ERR at 0x100FFCDC = 0x344B instead of 0x34D5 !
ERR at 0x100FFCDA = 0x344B instead of 0x34D6 !
ERR at 0x100FFCD8 = 0x344B instead of 0x34D7 !
ERR at 0x100FFCD6 = 0x344B instead of 0x34D8 !
ERR at 0x100FFCD4 = 0x344B instead of 0x34D9 !
ERR at 0x100FFCD2 = 0x344B instead of 0x34DA !
So, i guess here we will need to either probe stuff with the altera signal tap 2, or to have a simulation running.
Would you be able to have one of those running ? With singal tap 2, we could mesure the the data bus of the CPU, this would allow use to findout if the issue is in the CPU ore in the memory system.
This seems to be a QSYS SDRAM controller problem now, I open another issue with a sufficient name.
Hi,
I like the VexRiscv CPU core, because it is easy to integrate and has a good performance. I would like to use it like an ARM Cortex-M processor, programming over the JTAG debugger interface (load the program into RAM).
I managed to integrate the "VexRiscvAvalonWithIntegratedJtag.scala" version into the Altera/Intel Quartus QSYS. If I modify the VexRiscvAvalonWithIntegratedJtag script to use the IBusSimplePlugin and the DBusSimplePlugin everything works fine. With the IBusCachedPlugin and the DBusCachedPlugin the debugger goes crazy. After the first start I can not stop. If it is stopped after the first instruction stepping I loose the connection. Even the OpenOCD quits sometimes. I also tried the Briey project directly (without QSYS, just a wrapper), the result is the same, program loading / debugging is impossible.
br, nvitya