Victor 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Меня очень смущают такие конструкции: (continuous assignment) always @(posedge SysWrite or negedge Reset) begin LoadSecond[31:0]=SysDin[31:0]; end Я бы рекомендовал писать (procedural assignment) always @(posedge SysWrite or negedge Reset) begin LoadSecond[31:0]<=SysDin[31:0]; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
axalay 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Меня очень смущают такие конструкции: always @(posedge SysWrite or negedge Reset) begin LoadSecond[31:0]=SysDin[31:0]; end Это не совсем "синхронный" дизайн.... Я бы настоятельно рекомендовал писать always @(posedge SysWrite) begin LoadSecond[31:0]<=SysDin[31:0]; end ну уж использовать асинхронный сброс по глобальному ресету это не означает несинхронная схема. И проблема совсем не в этом. Не в ту сторону копаем Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Victor 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Да, я поправил, не в этом суть моего поста. А откуда берется 1 Mhz pulse? (Clock1 то есть) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Привожу пример откуда он такие клоки откапывает пожалуйста пользуйтесь тегами для оформления кода. У вас видна асинхронная шина, в принципе можно сделать и так (если понимать к чему может это привести) это один клок, где другие 9 ? там не Latch, а мультиплексоры. В предоставленном файле таймера тоде он мультиплексор латчем обзывает. Я знаю как должен выглядеть латч. и я очень очень редко его использую тут как раз именно латч и по описанию и по мнению XSТ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
axalay 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Да, я поправил, не в этом суть моего поста. А откуда берется 1 Mhz pulse? (Clock то есть) это строб, длиной в период клока появляется 1 раз за микросекунду. Тактируется тем же клоком. Создается в другом месте, так как используется в нескольких местах. Я привел этот модуль не потому что он не работает (он продолжает работать). А в качестве примера откуда берутся клоки того расстрельного списка 10 необьявленных клоков. Синтезатор здесь видит какой то клок : (*) These 10 clock signal(s) are generated by combinatorial logic, пожалуйста пользуйтесь тегами для оформления кода. У вас видна асинхронная шина, в принципе можно сделать и так (если понимать к чему может это привести) это один клок, где другие 9 ? тут как раз именно латч и по описанию и по мнению XSТ Latch With Positive Gate Verilog Coding Example // // Latch with Positive Gate // module v_latches_1 (G, D, Q); input G, D; output Q; reg Q; always @(G or D) begin if (G) Q = D; end endmodule Я очень уважительно отношусь к синтезатору альтеры то есть к квартусу. Если откомпилить данный файл в нем, то увидим, что там именно мультиплексор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Я очень уважительно отношусь к синтезатору альтеры то есть к квартусу. Если откомпилить данный файл в нем, то увидим, что там именно мультиплексор а я стараюсь внимательно читать приводимый код и пользоваться тегами для его оформления assign SysDout[31:0]=MuxInt(SysAddr, Second, Microsecond); function [31:0] MuxInt; input [7:0] Addr; input [31:0] Second; input [31:0] Microsecond; case (Addr) ADDR_SECOND : MuxInt[31:0]=Second[31:0]; ADDR_MICROSECOND : MuxInt[31:0]=Microsecond[31:0]; ADDR_FPGA_SERIES : MuxInt[31:0]=FPGA_SERIES; ADDR_FPGA_LCELS : MuxInt[31:0]=FPGA_LCELS; ADDR_FPGA_SPEED : MuxInt[31:0]=FPGA_SPEED; ADDR_PRODUCER : MuxInt[31:0]=PRODUCER; ADDR_FIRMVARE_NAME : MuxInt[31:0]=FIRMVARE_NAME; ADDR_FIRMVARE_VER : MuxInt[31:0]=FIRMVARE_VER; ADDR_DEVELOPER : MuxInt[31:0]=DEVELOPER; endcase //Addr endfunction //MuxIicDataIn чему будет равно SysDout[31:0] когда SysAddr не равен ни одному из сигналов ? ЗЫ. Не надо считать XST тупым, если он пишет что он нашел latch, то это значит что именно его он и нашел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
axalay 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба мультиплексоры можно написать по разному. И ксалинкс их очень плохо переваривает. Я уже по этому поводу раньше открывал тему. Ша приведу пример Multiplexers Case Statement Examples Following are three examples of Case statements: • “Full and Parallel Case Statement Example” • “Not Full But Parallel Case Statement Example” • “Neither Full Nor Parallel Case Statement Example” Full and Parallel Case Statement Example module full (sel, i1, i2, i3, i4, o1); input [1:0] sel; input [1:0] i1, i2, i3, i4; output [1:0] o1; reg [1:0] o1; always @(sel or i1 or i2 or i3 or i4) begin case (sel) 2'b00: o1 = i1; 2'b01: o1 = i2; 2'b10: o1 = i3; 2'b11: o1 = i4; endcase end endmodule посмотрите что нарисует ртл схематик. ЗЫ. Не надо считать XST тупым, если он пишет что он нашел latch, то это значит что именно его он и нашел. пропустил строчку default : MuxInt[31:0]=32'd0; Спасибо добавлю и отчитаюсь-перестал он его как латч видеть. Но факт остается фактом-квартум это сьедает на ура как мукс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Victor 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба это строб, длиной в период клока появляется 1 раз за микросекунду. Тактируется тем же клоком. Создается в другом месте, так как используется в нескольких местах. Я привел этот модуль не потому что он не работает (он продолжает работать). А в качестве примера откуда берутся клоки того расстрельного списка 10 необьявленных клоков. Синтезатор здесь видит какой то клок : (*) These 10 clock signal(s) are generated by combinatorial logic, Синтезатор правильно видит здесь какой-то клок. Это как раз та конструкция которую я вам приводил в первом посте. Вы под одним клоком формируете сигнал (имеется ввиду строб Clock1), который подается на вход тактовой другого регистра (имеются ввиду Second,Microsecond ). Вот собственно и источник надписи в отчете синтезатора. :) Предполагая, что строб Clock1 сформирован под тактовой SysWrite я бы предложил сделать так: always @(posedge SysWrite ...) ... if ((Load == 1'b1) && (Clock1 == 1'b1) && ... ) Second[31:0]<=LoadSecond[31:0]; ... Тогда многоуважаемый синтезатор будет "понимать", что от изменения Clock1 до его "использования" один такт SysWrite. А сейчас этого "не видно". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба посмотрите что нарисует ртл схематик. вам шашечки или ехать? я предлагаю вам последовательно устранять косяки в вашем коде и выяснить что не работает. Если не хотите это ваше дело. Ройте дальше. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
axalay 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Но проблема не в этом модуле. А в других, где идут потоки данных. Там таких муксов нет вам шашечки или ехать? я предлагаю вам последовательно устранять косяки в вашем коде и выяснить что не работает. Если не хотите это ваше дело. Ройте дальше. :) см выше-я вам ответил вполне адекватно. Но почему то сообшение не туда вставилось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Но проблема не в этом модуле. А в других, где идут потоки данных. Там таких муксов нет помимо этого еще есть какой то 8ми битный латч в вашем коде, помимо этого устраните/опишите те 10 клоков. Сбоить может все что угодно. Надо последовательно приводить схему в синхронное состояние, что бы STA выдавал правду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Victor 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Я бы посоветовал устранить подобные тактовые сигналы, где это возможно. Есть ли такие в проблемных модулях? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
axalay 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Синтезатор правильно видит здесь какой-то клок. Это как раз та конструкция которую я вам приводил в первом посте. Вы под одним клоком формируете сигнал (имеется ввиду строб Clock1), который подается на вход тактовой другого регистра (имеются ввиду Second,Microsecond ). Вот собственно и источник надписи в отчете синтезатора. :) Предполагая, что строб Clock1 сформирован под тактовой SysWrite я бы предложил сделать так: always @(posedge SysWrite ...) ... if ((Load == 1'b1) && (Clock1 == 1'b1) && ... ) Second[31:0]<=LoadSecond[31:0]; ... Тогда многоуважаемый синтезатор будет "понимать", что от изменения Clock1 до его "использования" один такт SysWrite. А сейчас этого "не видно". он там совсем другой сигнал в список клоков засунул а не клок1 Я бы посоветовал устранить подобные тактовые сигналы, где это возможно. Есть ли такие в проблемных модулях? устраняю. Но в этом списке 10 клоков нет клоков-откуда он их откопал, ша разбираюсь. Вставляю в муксы default. Посмотрим уменьшится ли количество этих так называемых клоков. Хотя большинство не имеют отношения к данным-тока в управление Все- осталось 4 грешных клока: TIMING REPORT NOTE: THESE TIMING NUMBERS ARE ONLY A SYNTHESIS ESTIMATE. FOR ACCURATE TIMING INFORMATION PLEASE REFER TO THE TRACE REPORT GENERATED AFTER PLACE-and-ROUTE. Clock Information: ------------------ -------------------------------------------------------------+-------------------------------------------------------+-------+ Clock Signal | Clock buffer(FF name) | Load | -------------------------------------------------------------+-------------------------------------------------------+-------+ BusSpiSck | IBUF | 58 | BusRxClock_p | IBUFDS+BUFG | 7186 | spi_to_epc/Write | NONE(timer/LoadMicrosecond_31) | 2548 | BusRxClock_p | clock_gen/dcm/DCM_INST:CLK0 | 272 | SramCq | sram/read_clock/dcm/DCM_INST:CLK0 | 108 | Phy0RxClk | IBUFG+BUFG | 356 | mac_0/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_0/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 | Phy0TxClk | IBUF | 1 | mac_0/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_0/mac/regs_int/RmonDout_0) | 32 | mac_0/mac/regs_int/RmonReadx(mac_0/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_0/mac/regs_int/short_impulse/a) | 1 | Phy1RxClk | IBUFG+BUFG | 356 | mac_1/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_1/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 | Phy1TxClk | IBUF | 1 | mac_1/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_1/mac/regs_int/RmonDout_0) | 32 | mac_1/mac/regs_int/RmonReadx(mac_1/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_1/mac/regs_int/short_impulse/a) | 1 | Phy2RxClk | IBUFG+BUFG | 356 | mac_2/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_2/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 | Phy2TxClk | IBUF | 1 | mac_2/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_2/mac/regs_int/RmonDout_0) | 32 | mac_2/mac/regs_int/RmonReadx(mac_2/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_2/mac/regs_int/short_impulse/a) | 1 | Phy3RxClk | IBUFG+BUFG | 356 | mac_3/mac/mac_rx/mac_rx_ff/write/Packet_number_add | NONE(mac_3/mac/mac_rx/mac_rx_ff/Packet_number_add_reg)| 1 | Phy3TxClk | IBUF | 1 | mac_3/mac/rmon/ctrl/CPU_rd_apply_reg | NONE(mac_3/mac/regs_int/RmonDout_0) | 32 | mac_3/mac/regs_int/RmonReadx(mac_3/mac/regs_int/RmonReadx1:O)| NONE(*)(mac_3/mac/regs_int/short_impulse/a) | 1 | -------------------------------------------------------------+-------------------------------------------------------+-------+ (*) These 4 clock signal(s) are generated by combinatorial logic, and XST is not able to identify which are the primary clock signals. Please use the CLOCK_SIGNAL constraint to specify the clock signal(s) generated by combinatorial logic. INFO:Xst:2169 - HDL ADVISOR - Some clock signals were not automatically buffered by XST with BUFG/BUFR resources. Please use the buffer_type constraint in order to insert these buffers to the clock signals to help prevent skew problems. Так как они относятся к сбору статистики то на них можно пока забить. Они не относятся с проблемной части Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Victor 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Так это все таки был Clock1 или что-то другое? А проблемы остались? Еще можно пристально посмотреть на (spi_to_epc/Write)... он там ничем "нужным" не управляет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
axalay 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба А тот 8-битный латч из той же серии - забыл define в мультиплексоре. Латчей больше синтезатор не видит. Привожу новый репорт. Те 4 клока-на них можно не обращать внимания-потом исправлю Так это все таки был Clock1 или что-то другое? А проблемы остались? Еще можно пристально посмотреть на (spi_to_epc/Write)... он там ничем "нужным" не управляет? Вот вы привязались к этому клоку :) Он не присутствует в этом расстрельном списке клоков Привожу файл `timescale 1ns / 1ps // module clock_gen ( BusReset, Reset, Clock125, Clock125_90, Clock1, Clock125Ena, Mac0ClockEna, Mac1ClockEna, Mac2ClockEna, Mac3ClockEna, SramAccess, SramAccessSel, BusRxClock_p, BusRxClock_n, BusTxClock_p, BusTxClock_n); // Global input BusReset; //active high output Reset; wire Reset; //active low output Clock125; wire Clock125; output Clock125_90; wire Clock125_90; output Clock1; wire Clock1; // Pulses (8*4 ns width, 1 MHz freq) // Clock Enables output Clock125Ena; wire Clock125Ena; output Mac0ClockEna; wire Mac0ClockEna; output Mac1ClockEna; wire Mac1ClockEna; output Mac2ClockEna; wire Mac2ClockEna; output Mac3ClockEna; wire Mac3ClockEna; // SRAM arbiter output SramAccess; reg SramAccess; output [1:0] SramAccessSel; wire [1:0] SramAccessSel; // Bus Clocks // Bus Rx clocks input BusRxClock_p, BusRxClock_n; // Bus Tx clocks output BusTxClock_p, BusTxClock_n; wire BusTxClock_p, BusTxClock_n; localparam GND = 1'b0; localparam VCC = 1'b1; // Rx Clock 125 MHz wire BusClock125; IBUFDS rx_clockx1 ( .O(BusClock125), .I(BusRxClock_p), .IB(BusRxClock_n) ); BUFG bufgx1 ( .O(Clock125), .I(BusClock125) ); // Reset DCM reg DcmReset; //active high reg [3:0] CountDcmReset; always @(posedge Clock125 or posedge BusReset) if (BusReset) begin DcmReset=VCC; CountDcmReset=0; end //if else if (CountDcmReset<4'b1111) CountDcmReset=CountDcmReset+1; else DcmReset=GND; // main DCM input_dcm dcm ( .CLKIN_IN (Clock125), .RST_IN (DcmReset), .CLK0_OUT (Clock125_90), .LOCKED_OUT (Reset) ); // BUS Tx Clock sram_write_clock write_clock ( .RESET (~Reset), .CLK (Clock125_90), .O_DDR_CLK (BusTxClock_p), .O_DDR_CLK_BAR (BusTxClock_n) ); //Generate Clock Enable strobes and SRAM access (mac or bus write) // Clock125 _|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_|-|_| // ClockEnaCount | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | 0 | // Clock125Ena _|---|___________|---|___________|---|___________|---| // Mac0ClockEna _|---|___________|---|___________|---|___________|---| // Mac1ClockEna _____|---|___________|---|___________|---|___________| // Mac2ClockEna _________|---|___________|---|___________|---|_______ // Mac3ClockEna _____________|---|___________|---|___________|---|___ // SramAccess _|---------------|_______________|---------------|___ reg [1:0] ClockEnaCount; always @(posedge Clock125) if (ClockEnaCount<2'b11) ClockEnaCount=ClockEnaCount+1; else begin SramAccess=~SramAccess; ClockEnaCount=0; end //else assign Clock125Ena=(ClockEnaCount==2'd0); assign Mac0ClockEna=(ClockEnaCount==2'd0); assign Mac1ClockEna=(ClockEnaCount==2'd1); assign Mac2ClockEna=(ClockEnaCount==2'd2); assign Mac3ClockEna=(ClockEnaCount==2'd3); assign SramAccessSel=ClockEnaCount; // Generate 1 Mhz strobe localparam PERIOD_OF_MHZ=7'd124; reg Clock500k; reg [6:0] TimerCount; always @(posedge Clock125 or posedge BusReset) if (BusReset) begin Clock500k=0; TimerCount=0; end //if else if (TimerCount<PERIOD_OF_MHZ) TimerCount=TimerCount+1; else begin Clock500k=~Clock500k; TimerCount=0; end //else // Generate Clock enable pulse every 1000 ns reg Clock500kReg, Clock500kRegReg; always @(posedge Clock125) if (Clock125Ena) begin Clock500kReg <=Clock500k; Clock500kRegReg <=Clock500kReg; end //if assign Clock1=(Clock500kReg!=Clock500kRegReg); endmodule //clock_gen тут Clock125 это тот же Clock top.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться