_sda 0 14 мая, 2010 Опубликовано 14 мая, 2010 · Жалоба Подключил файлы .vho и .sdo - скомпилировал,а симулятор рисует диаграммы без задержек.Что-то ещё нужно сделать? Кстати в файле det2time_sim_gate_vhdl.do,созданном квартусом, всего одна строка : transcript to asim_log Так и должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба Так и должно быть? Как то я запускал временное моделирование в альдеке, но через задний проход. Если мне память не изменяет через гуй у меня плохо получалось, я делал напрямую скриптами через asim Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Как то я запускал временное моделирование в альдеке, но через задний проход. Если мне память не изменяет через гуй у меня плохо получалось, я делал напрямую скриптами через asim Спасибо! Похоже временнОе моделирование не пользуется популярностью.Ну и ладно,мне вообще-то достаточно STA,просто из любопытства хотелось посмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Спасибо! Похоже временнОе моделирование не пользуется популярностью.Ну и ладно,мне вообще-то достаточно STA,просто из любопытства хотелось посмотреть. Как-то помнится ради интереса пользовал временное моделирование в ActiveHDL. Было это давно, но помню что особых проблем там не возникало. В результате разводки (Active цепляет для этой цели ISE) получается *.sdf файл, который потом аттачится к post routing simulation model (*.v либо *.vhdl) и всё прекрасно моделируется. Был там какой-то трюк в том, что надо цеплять некий несинтезируемый примитив под названием "grst" или что-то вроде этого, иначе сброс не обрабатывается правильно. А в остальном всё работает. Пользуются этим достаточно редко, потому как 90% ошибок всё-таки вычисляются на этапе функционального моделирования, ну а те, что что связаны с реальными ограничениями кристалла проще поглядеть средствами In-system debugging типа Chipscope чем корректно отмоделировать в ActiveHDL c учётом всех возможных комбинаций входных параметров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Спасибо! У меня уже пропало желание продолжать эксперименты,да и с временем напряг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба Если ещё кому интересно, то, по совету -=Vitaly=- скачал документик: 000498_TimingSimulationinActive_HDL.pdf Информации, содержащейся в нём, хватило полностью, чтобы всё понять и сделать точно так же, всё заработало. Был там какой-то трюк в том, что надо цеплять некий несинтезируемый примитив под названием "grst" или что-то вроде этого, иначе сброс не обрабатывается правильно. А в остальном всё работает.Я столкнулся с тем, что, когда в проекте используются напрямую примитивы (типа рам-блоков и т.п.), то начинает ругаться на глобальные сигналы кристалла, что они нигде не описаны. Уважаемый Putnik подсказал мне, что нужно в любом месте модуля добавить строчкуglbl glbl(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба спасибо,при случае попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 29 декабря, 2010 Опубликовано 29 декабря, 2010 · Жалоба Здравствуйте. Помогите, пожалуйста. Уже 2 дня бьюсь - не запускается временная симуляция. Имеется проект: Топ-модуль wrapper `timescale 1 ns / 1 ps module wrapper ( input L_clk_in_ds_p, input L_clk_in_ds_n, input L_data_in_ds_p, input L_data_in_ds_n, output L_clk_out_ds_p, output L_clk_out_ds_n, output L_data_out_ds_p, output L_data_out_ds_n, ); wire [9:0] par_data; wire par_sync, ddr_clk_in; SerDes_LR #( .DDR_CLK_DES_GBUF(1), .PAR_CLK_DES_GBUF(1) ) serdes_uut( .par_data_ser(par_data), .ddr_clk_ser(ddr_clk_in), .par_sync_ser(par_sync), .clk_in_ds_p(L_clk_in_ds_p), .clk_in_ds_n(L_clk_in_ds_n), .data_in_ds_p(L_data_in_ds_p), .data_in_ds_n(L_data_in_ds_n), .clk_out_ds_p(L_clk_out_ds_p), .clk_out_ds_n(L_clk_out_ds_n), .data_out_ds_p(L_data_out_ds_p), .data_out_ds_n(L_data_out_ds_n), .sync_en(1'b1), .par_data_des(par_data), .par_clk_en(), .par_clk_des(par_sync), .ddr_clk_des(ddr_clk_in), .carrier_lost() ); /* synthesis translate_off */ glbl glbl (); /* synthesis translate_on */ endmodule - это обёртка другого модуля serdes_lr, который я хочу проверить: `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 14:53:38 07/05/2010 // Design Name: // Module Name: SerDes_LR // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// `ifndef SERDES_V `define SERDES_V `include "Serialiser.v" `include "Deserialiser.v" module SerDes_LR // !!! Внимание!!! в данном коде везде имеет место путаница: сигналы с суффиксом _o (odd, т.е. нечётный) // по порядку на самом деле чётные. Но отсчёт начинается с нуля. Аналогично сигналы с суффиксом _e // (even, т.е. чётный) по порядку на самом деле нечётные, но если считать с нуля, то это 0, 2, 4, ... // Кроме того, в одном блоке защёлкивание происходит по одному фронту, а в смежном блоке (смежные блоки - // это сериализатор и десериализатор) - по другому фронту (по положительному и отрицательному) #( parameter sync_frm_p = 10'b0011111010, parameter sync_frm_n = 10'b1100000101, parameter resync_period = 40, parameter PAR_CLK_DES_GBUF = 0, // разрешено ли подключить сигнал к глобальным линиям: parameter DDR_CLK_DES_GBUF = 0, // 0 - запрещено, 1 - подключить принудительно parameter DDR_IN_DATA_DELAY = "AUTO", // задержка последовательного сигнала данных на IOB parameter DDR_IN_CLK_DELAY = "0" // задержка тактового сигнала на IOB ) // !!! последние 2 параметра - строковые !!!! ( input wire [9:0] par_data_ser, input wire ddr_clk_ser, input wire par_sync_ser, input clk_in_ds_p, input clk_in_ds_n, input data_in_ds_p, input data_in_ds_n, output clk_out_ds_p, output clk_out_ds_n, output data_out_ds_p, output data_out_ds_n, input wire sync_en, output wire [9:0] par_data_des, output wire par_clk_en, output par_clk_des, output reg carrier_lost = 1, output ddr_clk_des ); // !!! Внимание!!! в данном коде везде имеет место путаница: сигналы с суффиксом _o (odd, т.е. нечётный) // по порядку на самом деле чётные. Но отсчёт начинается с нуля. Аналогично сигналы с суффиксом _e // (even, т.е. чётный) по порядку на самом деле нечётные, но если считать с нуля, то это 0, 2, 4, ... // Кроме того, в одном блоке защёлкивание происходит по одному фронту, а в смежном блоке (смежные блоки - // это сериализатор и десериализатор) - по другому фронту (по положительному и отрицательному) wire ddr_data_out_e; wire ddr_data_out_o; wire ddr_data_in_e; wire ddr_data_in_o; // ниже группа назначений для пробы прямого подключения к глобальным буферам без параметров // (в нормальном режиме должно быть закомментировано) // wire ddr_clk_des_inbuf; // wire par_clk_des_nobuf; // assign ddr_clk_des = ddr_clk_des_inbuf; // assign par_clk_des = par_clk_des_nobuf; // Ниже делаем параметризируемое подключение тактовых сигналов к глобальным линиям wire ddr_clk_des_inbuf/* synthesis syn_noclockbuf = 1 */; wire par_clk_des_nobuf/* synthesis syn_noclockbuf = 1 */; generate if (DDR_CLK_DES_GBUF != 0) begin wire ddr_clk_des_bufg; BUFG BUFG_ddr_clk_des_bufg ( .O(ddr_clk_des_bufg), // Clock buffer output .I(ddr_clk_des_inbuf) // Clock buffer input ); assign ddr_clk_des = ddr_clk_des_bufg; end else assign ddr_clk_des = ddr_clk_des_inbuf; endgenerate generate if (PAR_CLK_DES_GBUF != 0) begin wire par_clk_des_bufg; BUFG BUFG_par_clk_des_bufg ( .O(par_clk_des_bufg), // Clock buffer output .I(par_clk_des_nobuf) // Clock buffer input ); assign par_clk_des = par_clk_des_bufg; end else assign par_clk_des = par_clk_des_nobuf; endgenerate // Выше делаем параметризируемое подключение тактовых сигналов к глобальным линиям wire ddr_data_des, // последовательные данные между входным усилителем и DDR-триггером ddr_data_ser, // последовательные данные между DDR-триггером и выходным усилителем ddr_clk_ser_outbuf; // тактовый сигнал между DDR-триггером и выходным усилителем IBUFDS #( .DIFF_TERM("FALSE"), // Differential Termination (Virtex-4/5, Spartan-3E/3A) .IBUF_DELAY_VALUE(DDR_IN_CLK_DELAY), // Specify the amount of added input delay for // the buffer, "0"-"16" (Spartan-3E/3A only) .IOSTANDARD("LVDS_33") // Specify the input I/O standard ) IBUFDS_DDR_clk_des_inbuf ( .O(ddr_clk_des_inbuf), // Buffer output .I(clk_in_ds_p), // Diff_p buffer input (connect directly to top-level port) .IB(clk_in_ds_n) // Diff_n buffer input (connect directly to top-level port) ); // D input IBUFDS #( .CAPACITANCE("DONT_CARE"), // "LOW", "NORMAL", "DONT_CARE" (Virtex-4 only) .DIFF_TERM("FALSE"), // Differential Termination (Virtex-4/5, Spartan-3E/3A) .IBUF_DELAY_VALUE("0"), // Specify the amount of added input delay for // the buffer, "0"-"16" (Spartan-3E only) .IFD_DELAY_VALUE(DDR_IN_DATA_DELAY), // Specify the amount of added delay for input // register, "AUTO", "0"-"8" (Spartan-3E/3A only) .IOSTANDARD("LVDS_33") // Specify the input I/O standard ) IBUFDS_sdr_data_in ( .O(ddr_data_des), // Buffer output .I(data_in_ds_p), // Diff_p buffer input (connect directly to top-level port) .IB(data_in_ds_n) // Diff_n buffer input (connect directly to top-level port) ); // !!! Внимание!!! в данном коде везде имеет место путаница: сигналы с суффиксом _o (odd, т.е. нечётный) // по порядку на самом деле чётные. Но отсчёт начинается с нуля. Аналогично сигналы с суффиксом _e // (even, т.е. чётный) по порядку на самом деле нечётные, но если считать с нуля, то это 0, 2, 4, ... // Кроме того, в одном блоке защёлкивание происходит по одному фронту, а в смежном блоке (смежные блоки - // это сериализатор и десериализатор) - по другому фронту (по положительному и отрицательному) IDDR2 #( .DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1" .INIT_Q0(1'b0), // Sets initial state of the Q0 output to 1'b0 or 1'b1 .INIT_Q1(1'b0), // Sets initial state of the Q1 output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) IDDR2_DDR_IN ( .Q0(ddr_data_in_e), // 1-bit output captured with C0 clock .Q1(ddr_data_in_o), // 1-bit output captured with C1 clock .C0(ddr_clk_des), // 1-bit clock input .C1(~ddr_clk_des), // 1-bit clock input .CE(1), // 1-bit clock enable input .D(ddr_data_des), // 1-bit DDR data input .R(0), // 1-bit reset input .S(0) // 1-bit set input )/* synthesis syn_useioff=1 */; OBUFDS #( .IOSTANDARD("LVDS_33") // Specify the output I/O standard ) OBUFDS_clk_out ( .O(clk_out_ds_p), // Diff_p output (connect directly to top-level port) .OB(clk_out_ds_n), // Diff_n output (connect directly to top-level port) .I(ddr_clk_ser_outbuf) // Buffer input ); OBUFDS #( .IOSTANDARD("LVDS_33") // Specify the output I/O standard ) OBUFDS_data_out ( .O(data_out_ds_p), // Diff_p output (connect directly to top-level port) .OB(data_out_ds_n), // Diff_n output (connect directly to top-level port) .I(ddr_data_ser) // Buffer input ); // !!! Внимание!!! в данном коде везде имеет место путаница: сигналы с суффиксом _o (odd, т.е. нечётный) // по порядку на самом деле чётные. Но отсчёт начинается с нуля. Аналогично сигналы с суффиксом _e // (even, т.е. чётный) по порядку на самом деле нечётные, но если считать с нуля, то это 0, 2, 4, ... // Кроме того, в одном блоке защёлкивание происходит по одному фронту, а в смежном блоке (смежные блоки - // это сериализатор и десериализатор) - по другому фронту (по положительному и отрицательному) ODDR2 #( .DDR_ALIGNMENT("C0"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_L_DDR_OUT ( .Q(ddr_data_ser), // 1-bit DDR output data .C0(ddr_clk_ser), // 1-bit clock input .C1(~ddr_clk_ser), // 1-bit clock input .CE(1'b1), // 1-bit clock enable input .D0(ddr_data_out_e), // 1-bit data input (associated with C0) .D1(ddr_data_out_o), // 1-bit data input (associated with C1) .R(1'b0), // 1-bit reset input .S(1'b0) // 1-bit set input )/* synthesis syn_useioff=1 */; ODDR2 #( .DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_L_DDR_OUT_clk ( .Q(ddr_clk_ser_outbuf), // 1-bit DDR output data .C0(ddr_clk_ser), // 1-bit clock input .C1(~ddr_clk_ser), // 1-bit clock input .CE(1'b1), // 1-bit clock enable input .D0(1), // 1-bit data input (associated with C0) .D1(0), // 1-bit data input (associated with C1) .R(1'b0), // 1-bit reset input .S(1'b0) // 1-bit set input )/* synthesis syn_useioff=1 */; // !!! Внимание!!! в данном коде везде имеет место путаница: сигналы с суффиксом _o (odd, т.е. нечётный) // по порядку на самом деле чётные. Но отсчёт начинается с нуля. Аналогично сигналы с суффиксом _e // (even, т.е. чётный) по порядку на самом деле нечётные, но если считать с нуля, то это 0, 2, 4, ... // Кроме того, в одном блоке защёлкивание происходит по одному фронту, а в смежном блоке (смежные блоки - // это сериализатор и десериализатор) - по другому фронту (по положительному и отрицательному) Serialiser Ser ( .par_data_in(par_data_ser), .ddr_clk(ddr_clk_ser), .par_sync(par_sync_ser), .ddr_data_out_e(ddr_data_out_e), .ddr_data_out_o(ddr_data_out_o) ); // !!! Внимание!!! в данном коде везде имеет место путаница: сигналы с суффиксом _o (odd, т.е. нечётный) // по порядку на самом деле чётные. Но отсчёт начинается с нуля. Аналогично сигналы с суффиксом _e // (even, т.е. чётный) по порядку на самом деле нечётные, но если считать с нуля, то это 0, 2, 4, ... // Кроме того, в одном блоке защёлкивание происходит по одному фронту, а в смежном блоке (смежные блоки - // это сериализатор и десериализатор) - по другому фронту (по положительному и отрицательному) Deserialiser #( .sync_frm_p(sync_frm_p), .sync_frm_n(sync_frm_n), .resync_period(resync_period) ) Des ( .ddr_data_in_e(ddr_data_in_e), .ddr_data_in_o(ddr_data_in_o), .ddr_clk_in(ddr_clk_des), .sync_en(sync_en), .par_data_out(par_data_des), .par_clk_en(par_clk_en), .par_clk(par_clk_des_nobuf), .counter_out_e(), .counter_out_o() ); //=============================== //Carrier detect // //=============================== //Dividing input frequency reg [4:0] f_in_div = 0; always @(posedge ddr_clk_des) begin f_in_div <= f_in_div + 1; end //Crossing clock domain reg [2:0] f_in_div_local; always @(posedge par_sync_ser) begin f_in_div_local[0] <= f_in_div[4]; f_in_div_local[1] <= f_in_div_local[0]; f_in_div_local[2] <= f_in_div_local[1]; end //detecting of carrier loss reg [3:0] carrier_cnt = 0; always @(posedge par_sync_ser) begin if(f_in_div_local[2] != f_in_div_local[1]) begin carrier_cnt <= 0; carrier_lost <= 0; end else begin if(carrier_cnt == 4'hF) carrier_lost <= 1; else carrier_cnt <= carrier_cnt + 1; end end endmodule `endif В модуле serdes_lr используются другие модули, которые инклюдятся (приводить их не буду из соображений хоть некоторой коммерческой тайны - чтобы руководство не обвинило в раскрытии исходников - думаю приведённых исходников достаточно для понимания проблемы). Как видно даже из приведённых исходников в коде применяются xilinx-specific примитивы. Они описаны в библиотеке OVI_Unisim. Функциональная симуляция запускается, ошибок не даёт (пробовал командой Simulation - Initialize Simulation, дальше не пробовал, т.к. для данного кода мне необходима временная симуляция. А временная уже на этапе данной команды выдаёт ошибку. Об это будет ниже). Замечательно. Делаю синтез через Synplify. Синтез проходит нормально. Делаю Implementation как вызов из Active-HDL ксайлинксовского имплементатора, входящего в комплект Xilinx ISE Studio. Результаты имплемента смотрю в FPGA Editor'е - все примитивы расставлены, как мне надо. Т.е. проект не липовый. Перехожу непосредственно к временной симуляции согласно этому сообщению. Настраиваю параметры симуляции в окошке Timing Simulation Options. Оно у меня выглядит так: Нажимаю в Design Flow кнопочку Timing Simulation. Вылазит следующая ошибка (привожу полный лог сообщений Active-HDL после нажатия этой кнопочки): # ELBREAD: Elaboration process. # ELBREAD: Elaboration time 0.0 [s]. # Checking if synthesis needs to be updated... # Checking if implementation needs to be updated... vlcomp -l ovi_simprim -l SPARTAN3A -l ovi_unisim -work serdes_lr_timing "$dsn\IMPLEMENT\TIME_SIM.V" # Compile... # Pass 1. Scanning modules hierarchy. # Module \$root found in current working library. # Module X_IPAD found in library ovi_simprim. # Module X_BUFGMUX found in library ovi_simprim. # Module X_ZERO found in library ovi_simprim. # Module X_AND2 found in library ovi_simprim. # Module X_SFF found in library ovi_simprim. # Module X_XOR2 found in library ovi_simprim. # Module X_INV found in library ovi_simprim. # Module X_IBUFDS found in library ovi_simprim. # Module X_OBUFDS found in library ovi_simprim. # Module X_ONE found in library ovi_simprim. # Module X_FF found in library ovi_simprim. # Module X_MUX2 found in library ovi_simprim. # Module X_FDDRRSE found in library ovi_simprim. # Module X_OPAD found in library ovi_simprim. # Module X_BUF found in library ovi_simprim. # Module X_LUT4 found in library ovi_simprim. # Pass 2. Processing instantiations. # Pass 3. Processing behavioral statements. # ELB/DAG code generating. # Module \$root found in current working library. # Unit top modules: wrapper glbl. # $root top modules: wrapper glbl. # Compile success 0 Errors 0 Warnings Analysis time: 0[s]. # done asim +access +r -advdataflow -L ovi_simprim -PL ovi_simprim -sdftyp -AUTO="$dsn\implement\time_sim.sdf" wrapper # ELBREAD: Elaboration process. # ELBREAD: Elaboration time 0.0 [s]. # asim: Stack memory: 32MB # asim: Retval memory: 32MB # KERNEL: Main thread initiated. # KERNEL: Kernel process initialization phase. # KERNEL: Time resolution set to 1ps. # ELAB2: Elaboration final pass... # ELAB2: Create instances ... # ELAB2: Fatal Error: ELAB2_0036 Unresolved hierarchical reference to "glbl.GTS" from module "wrapper.\serdes_uut/OBUFDS_clk_out/OBUFDS \" (module not found). # ELAB2: Last instance before error: .\serdes_uut/OBUFDS_clk_out/OBUFDS \ # KERNEL: Error: E8005 : Kernel process initialization failed. # Error: Fatal error occurred during simulation initialization. wave wave /wrapper/* .wrapper.* Смысл ошибки какой? Что она не видит сигнал GTS, объявленный в модуле glbl. А на этот сигнал ссылается примитив wrapper.\serdes_uut/OBUFDS_clk_out/OBUFDS. Открываю исходник, на основе которого было выдано такое сообщение (это сам v-файл для временной симуляции - time_sim.v - см. в прилагаемом архиве весь файл: sources.rar) Делаю поиск по этому файлику строки serdes_uut/OBUFDS_clk_out/OBUFDS. Нахожу вот что: X_OBUFDS #( .LOC ( "PAD60" )) \serdes_uut/OBUFDS_clk_out/OBUFDS ( .I(\serdes_uut/ddr_clk_ser_outbuf ), .O(L_clk_out_ds_p), .OB(L_clk_out_ds_n) ); Т.е. создаётся экземпляр примитива типа X_OBUFDS, который находится в библиотеке OVI_Simprim: `timescale 1 ps/1 ps module X_OBUFDS (O, OB, I); parameter LOC = " UNPLACED"; parameter CAPACITANCE = "DONT_CARE"; parameter IOSTANDARD = "DEFAULT"; output O, OB; input I; [b] tri0 GTS = [u]glbl.GTS[/u]; [/b] bufif0 (O, I, GTS); notif0 (OB, I, GTS); specify (I => O) = (0:0:0, 0:0:0); (I => OB) = (0:0:0, 0:0:0); specparam PATHPULSE$ = 0; endspecify endmodule Здесь-то мы и обнаруживаем ту самую ссылку, которую не находит программа при попытке запуска симуляции и о которой она выдаёт ошибку # ELAB2: Fatal Error: ELAB2_0036 Unresolved hierarchical reference to "glbl.GTS" from module "wrapper.\serdes_uut/OBUFDS_clk_out/OBUFDS \" (module not found) (я выше её уже приводил). Я начинаю искать, где же этот модуль glbl может быть указан... и обнаруживаю, что этот модуль указан в том же самом файле time_sim.v, в котором и содержится вся симуляционная модель моего устройства (т.е. модуль wrapper) (исходник выше я приводил, см. самую нижнюю часть). Я ничего не понимаю: получается, что модуль wrapper в файле time_sim.v видится, потому что ошибка ссылается на \serdes_uut/OBUFDS_clk_out/OBUFDS. А этот экземпляр описывается именно в time_sim.v. Т.е. модуль wrapper в файле time_sim.v программа видит, а модуль glbl она не видит. Хотя этот модуль находится в том же файле, только ниже... Ну как такое может быть???... Ничего не понимаю... Пробовал описание модуля glbl переставить в начало, чтобы его первым проходило при анализе - ничего не поменялось... Дополнительно привожу настройки в меню Design - Settings: Помогите, пожалуйста... работа стоит... Больше всего я не понимаю, почему не видится glbl, если он в том же файле, другой модуль из которого видится? Может ссылка glbl.GTS не годится, а надо записать эту ссылку в другой форме, чтобы увиделось? Или где-то какую-то галочку поставить? Или куда-то какую-то библиотеку дописать?... Прилагаю архив с исходниками: sources.rar. 4 Vetal: сори, не догадывался, что есть различия в code и codebox, думал code, как раз, и сделает с прокруткой. А codebox'а вообще нет в панельке инструментов: А сам я в html-е не силён :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться