|
получил предупреждения |
|
|
|
Aug 29 2013, 13:48
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Здравстуйте,помогите разобраться. получил предупреждения WARNING:PhysDesignRules:372 - Gated clock. Clock net Ch_M_BC/GND_12_o_GND_12_o_AND_159_o is sourced by a combinatorial pin. This is not good design practice. Use the CE pin to control the loading of data into the flip-flop. как найти причину и насколько это важно? методом исключений из описания получил , что вроде бы это получается из следующего куска кода. таких есть несколько. получается , что нужно упрощать? Код //----------- 2 3 4 5-е слово ------------------------------------- if ( reg_nomer_slova == 8'h02 | reg_nomer_slova == 8'h03 | reg_nomer_slova == 8'h04 | reg_nomer_slova == 8'h05) begin casez (nomer_bit) 5'b00???: begin //0..7 reg_CM_BC <= (reg_nomer_slova == 8'h02) ? ( ( reg_kod_oper == paket_znak ) ? reg_kolich_znakov[nomer_bit] : ( ( reg_kod_oper == paket_linia ) ? reg_nach_koord_linii_Y[nomer_bit] : 1'bz ) ) : (reg_nomer_slova == 8'h03) ? ( ( reg_kod_oper == paket_znak ) ? reg_koord_perv_znaka_Y[nomer_bit] : ( ( reg_kod_oper == paket_linia ) ? reg_nach_koord_linii_X[nomer_bit] : 1'bz ) ) : (reg_nomer_slova == 8'h04) ? ( ( reg_kod_oper == paket_znak ) ? reg_koord_perv_znaka_X[nomer_bit] : ( ( reg_kod_oper == paket_linia ) ? reg_proekcii_linii_Y[nomer_bit] : 1'bz ) ) : ( ( reg_kod_oper == paket_znak ) ? reg_kod_znaka_bit_ml[nomer_bit] : ( ( reg_kod_oper == paket_linia ) ? reg_proekcii_linii_X[nomer_bit] : 1'bz ) ); nomer_bit <= nomer_bit + 1'b1; end 5'b0100?: begin //8,9 reg_podgotovki_smeni_slova <= 1'b0; reg_CM_BC <= (reg_nomer_slova == 8'h02) ? ( ( reg_kod_oper == paket_znak ) ? reg_kolich_znakov[nomer_bit] : ( ( reg_kod_oper == paket_linia ) ? reg_nach_koord_linii_Y[nomer_bit] : 1'bz ) ) : (reg_nomer_slova == 8'h03) ? ( ( reg_kod_oper == paket_znak ) ? reg_koord_perv_znaka_Y[nomer_bit] : ( ( reg_kod_oper == paket_linia ) ? reg_nach_koord_linii_X[nomer_bit] : 1'bz ) ) : (reg_nomer_slova == 8'h04) ? ( ( reg_kod_oper == paket_znak ) ? reg_koord_perv_znaka_X[nomer_bit] : ( ( reg_kod_oper == paket_linia ) ? reg_proekcii_linii_Y[nomer_bit] : 1'bz ) ): ( ( reg_kod_oper == paket_znak ) ? reg_kod_znaka_bit_st[nomer_bit-8] : ( ( reg_kod_oper == paket_linia ) ? reg_proekcii_linii_X[nomer_bit] : 1'bz ) ); nomer_bit <= nomer_bit + 1'b1; end 5'b0101?: begin //10,11 reg_CM_BC <= (reg_nomer_slova == 8'h02 | reg_nomer_slova == 8'h03 | reg_nomer_slova == 8'h04) ? ( ( reg_kod_oper == paket_znak ) ? 1'b0 : ( ( reg_kod_oper == paket_linia ) ? 1'b0 : 1'bz ) ) : ( ( reg_kod_oper == paket_znak ) ? reg_kod_znaka_bit_st[nomer_bit-8] : ( ( reg_kod_oper == paket_linia ) ? 1'b0 : 1'bz ) ); nomer_bit <= nomer_bit + 1'b1; end 5'b0110?: begin //12,13 reg_CM_BC <= ... nomer_bit <= nomer_bit + 1'b1; end 5'b01110: begin //14 reg_CM_BC <= ...
nomer_bit <= nomer_bit + 1'b1; end 5'b01111: begin //15 reg_CM_BC <= ... nomer_bit <= nomer_bit + 1'b1; end 5'b10000: begin reg_CM_BC <= 1'b0; nomer_bit <= nomer_bit + 1'b1; end 5'b10001: begin reg_CM_BC <= reg_kontr_razr; nomer_bit <= nomer_bit + 1'b1; ... end default : begin nomer_bit <= 5'b00000; end endcase end //reg_nomer_slova == 8'h02 и еще одно предупреждение. PhysDesignRules:372 - Gated clock. Clock net Ch_M_BC/reg_IZ_BC_CIB_BC is sourced by a combinatorial pin. This is not good design practice. Use the CE pin to control the loading of data into the flip-flop. история такая. есть два входных сигнала импульс IZ_BC и еще несколько импульсов CIB_BC. непересекающихся. под частоту в always получен общий reg_IZ_BC_CIB_BC. и далее на нем сделан свой always.
|
|
|
|
|
Aug 30 2013, 05:11
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(Maverick @ Aug 30 2013, 00:28)  Вы должны отталкиваться от тактовой частоты в ПЛИС. Следовательно, все входные сигналы Вы должны "привязать"(синхронизировать) с Вашей тактовой частотой в ПЛИС. Потом уже производить обработку этих сигналов на тактовой частоте в ПЛИС. Иначе у Вас будет асинхронная логика... структура такая Код always @(posedge clk_100_MHz ) begin if( IZ_BC ==1 ) reg_IZ_BC <= 1'b1; else reg_IZ_BC <= 1'b0; if( CIB_BC ==1 ) reg_CIB_BC <= 1'b1; else reg_CIB_BC <= 1'b0; if( IZ_BC ==1 | CIB_BC ==1) reg_IZ_BC_CIB_BC <= 1'b1; else reg_IZ_BC_CIB_BC <= 1'b0; end always @( posedge reg_CIB_BC or posedge reg_IZ_BC ) // reg_IZ_BC в роли сброса begin if ( reg_IZ_BC == 1 ) begin ... end else begin ... end end
always @( negedge reg_IZ_BC_CIB_BC ) begin ... здесь приведенный ранее код end
|
|
|
|
|
Sep 2 2013, 07:32
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(Maverick @ Aug 30 2013, 14:44)  почитайте про асинхронные частоты, пересечение клоковых доменов и синхронизацию[/url] Спасибо, почитал. добавил на входные сигналы следующий модуль синхронизации (на другие- аналогичные) , а также синхронизатор сброса Код module synchronizer_CIB_BC ( input clk, input reset, input din, output dout, output dout1 ); reg d,dout,dout1; always @(posedge clk, posedge reset) begin if (reset) begin d <= 0; dout <= 0; dout1 <= 0; end else begin d <= din; dout <= d; dout1 <= dout; end end endmodule
//=============== синхронизатор сброса ============== module async_reset ( input clk, input reset_in, output rst_out ); reg rst_out, rff1; always @(posedge clk or posedge reset_in) if (reset_in) begin rst_out <= 1'b1; rff1 <= 1'b1; end else begin rff1 <= 1'b0; rst_out <= rff1; end endmodule dout1 для определения фронта. но осталось такое предупреждение PhysDesignRules:372 - Gated clock. Clock net async_reset/rst_out is sourced by a combinatorial pin. This is not good design practice. Use the CE pin to control the loading of data into the flip-flop.
|
|
|
|
|
Sep 2 2013, 10:37
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(XVR @ Sep 2 2013, 12:55)  Смотрите где используется цепь rst_out выходящая из вашего async_reset. Синтезатор посчитал, что где то она используется в качестве клока (используется в списке чувствительности в always @(...) и не гейтуется конструкцией if (...) по какому то из путей внутри этого always) да, действительно, есть двух разных модулях в таймере под 1МГц. но такое предупреждение выдается только на один модуль. в нем переделал под 100МГц.- предупреждение ушло. а в другом такая же конструкция.там нет 100МГц. и такого же предупреждения нет.а выдается предупреждение Line 151: Assignment to reg_AX ignored, since the identifier is never used. получается , что его тоже нужно переделать? 2.еще есть такое. Код ... reg [7:0] reg_kod_znaka[61:0]; ... task paket_znak_3; begin ... reg_kod_znaka[0] = 8'hf0; reg_kod_znaka[1] = 8'hf1; ... reg_kod_znaka[9] = 8'hf9; ... end endtask always @(posedge clk_100_MHz ) begin ... paket_znak_3; ... end получаю множество таких. Xst:1895 - Due to other FF/Latch trimming, FF/Latch <reg_kod_znaka_0_229> (without init value) has a constant value of 0 in block <Ch_M_BC>. This FF/Latch will be trimmed during the optimization process. как тут быть?
Сообщение отредактировал serg_k1 - Sep 2 2013, 10:49
|
|
|
|
|
Sep 2 2013, 14:04
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(serg_k1 @ Sep 2 2013, 14:37)  а в другом такая же конструкция.там нет 100МГц. и такого же предупреждения нет.а выдается предупреждение Line 151: Assignment to reg_AX ignored, since the identifier is never used. Синтезатор выкинул ваш регистр reg_AX, т.к. к нему никто не подключен. Выкинул вместе с присваиванием, видимо поэтому на always и не ругалось Цитата получается , что его тоже нужно переделать? Это уж вам виднее - нужен reg_AX или нет Цитата получаю множество таких. Xst:1895 - Due to other FF/Latch trimming, FF/Latch <reg_kod_znaka_0_229> (without init value) has a constant value of 0 in block <Ch_M_BC>. This FF/Latch will be trimmed during the optimization process. Синтезатор обнаружил, что в reg_kod_znaka_0_229 пишется только 0 и ничего более, так что он его выкинул и заменил константой 0 Цитата как тут быть? А вам нужен не 0?
|
|
|
|
|
Sep 3 2013, 05:53
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(XVR @ Sep 2 2013, 18:04)  Синтезатор обнаружил, что в reg_kod_znaka_0_229 пишется только 0 и ничего более, так что он его выкинул и заменил константой 0 А вам нужен не 0? есть массив reg [7:0] reg_kod_znaka[61:0]; в разных task им всем (!) 62 присваиваются значения. другие мне не нужны и их нет в объявлении. конечно, какие-то могут иметь одни и те же значения. а я получаю более 400 предупреждений. последнее вот такое и почему там 1. "1" довольно много. Xst:1710 - FF/Latch <Ch_M_BC/reg_kod_znaka_0_495> (without init value) has a constant value of 1 in block <mod_kontr_monitor>. This FF/Latch will be trimmed during the optimization process. это напрягает. когда объявлена integer count и получаю предупреждения , что старшие разряды =0, тот тут все понятно. я знаю , что так и должно быть. а тут не понятно.
|
|
|
|
|
Sep 3 2013, 11:13
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(XVR @ Sep 3 2013, 13:36)  Проверьте, все ли task'и вызываются (и вообще, синтезатор task'и поддерживает?) Или какие то биты внутри вашего reg_kod_znaka всегда имеют одни и те же значения. Судя по названию регистра, синтезатор весь ваш reg_kod_znaka рассыпал на отдельные триггера сделал следующее. под сброс задал все reg_kod_znaka = 8'h00. результат синтеза - все предупреждения, где была "1" пропали. задал в task (проверил поочередно в первом, середине и в конце) все reg_kod_znaka = 8'hff. результат синтеза -все предупреждения пропали. значит синтезатор task'и поддерживает, но мне же нужно задавать реальные коды.такое количество предупреждений, причем они идут не подряд! замучаешься выискивать нужные. можно , конечно, проинвертировать самую длинную надпись и это задать в сброс.
|
|
|
|
|
Sep 3 2013, 11:51
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 21-03-07
Пользователь №: 26 368

|
Цитата(XVR @ Sep 3 2013, 15:39)  Так он и записывает реальные коды. Видимо в ваших реальных кодах какие то биты всегда стоят в одном и том же состоянии (во всех присваиваниях) так это понятно. не понятно как быть. добавляется 400 предупреждений.на них не нужно обращать внимание. но их нужно фильтровать при работе с остальными..
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|