Неожиданные предупреждения в Xilinx

В следующем коде я сохраняю историю нажатий кнопок игроком 1 и игроком 2. Код компилируется без ошибок, но есть предупреждения. Я не могу решить эти предупреждения. Выкладываю код сюда.

module game(clk50,red,green,blue,hsync,vsync, button,led);

input [8:0] button;
 input clk50;
 output  red;
 output  green;
 output  blue,led;
 output hsync;
 output vsync;
 // divide input clock by two, and use a global 
// clock buffer for the derived clock
reg clk25_int;
always @(posedge clk50) begin
clk25_int <= ~clk25_int;
end
wire clk25;
BUFG bufg_inst(clk25, clk25_int);
wire [9:0] xpos;
wire [9:0] ypos;

Grid_Display Grid_Displayinst(clk25,xpos, ypos, red, green, blue, button,led);

endmodule

module Grid_Display(clk25,xpos,ypos,red,green,blue, button,led);

 input clk25;
 input [9:0] xpos;//responsible for current pixel display location
 input [9:0] ypos;// responsible for current display row

 input [8:0] button;

 //spartan 3 kit has 3-bits per pixel, so 2^3 means 8 colours can be selected.

 output red; // colour 1
 output green; // colour 2
 output blue; // colur 3
 output led;

 //reg tempRed,tempGreen,tempBlue, GridRed,GridGreen,GridBlue;

 reg player1,player2;

 reg [8:0] player1History=0,player2History=0;


 wire grid = ((xpos >= 4 && xpos <= 799 &&  ypos >= 160 && ypos <= 165) || 
              (xpos >= 4 && xpos <= 790 &&  ypos >= 310 && ypos <= 315) ||
              (xpos >= 200 && xpos <= 205 &&  ypos >= 0 && ypos <= 520) || 
              (xpos >= 440 && xpos <= 445 &&  ypos >= 0 && ypos <= 520));



always @(posedge clk25)
begin

  player1History=  button ^ player2History;
  player2History=  button ^ player1History;

  player1 = ((player1History[0] && (xpos >=50 && xpos<=150 && ypos >= 20 && ypos <=120) ) || (player1History[1] && (xpos >=250 && xpos<=350 && ypos >= 20 && ypos <=120))
          || (player1History[2] && (xpos >=490 && xpos<=590 && ypos >= 20 && ypos <=120)) || (player1History[3] && (xpos >=50 && xpos<=150 && ypos >= 180 && ypos  <=280))
          || (player1History[4] && (xpos >=250 && xpos<=350 && ypos >= 180 && ypos <=280)) || (player1History[5] && (xpos >=490 && xpos<=590 && ypos >= 180 && ypos <=280))
          || (player1History[6] && (xpos >=50 && xpos<=150 && ypos >= 330 && ypos <=430)) || (player1History[7] && (xpos >=250 && xpos<=350 && ypos >= 330 && ypos <=430))
          || (player1History[8] && (xpos >=490 && xpos<=590 && ypos >= 330 && ypos <=430)));

  player2 = ((player2History[0] && (xpos >=50 && xpos<=150 && ypos >= 20 && ypos <=120) ) || (player2History[1] && (xpos >=250 && xpos<=350 && ypos >= 20 && ypos <=120))
          || (player2History[2] && (xpos >=490 && xpos<=590 && ypos >= 20 && ypos <=120)) || (player2History[3] && (xpos >=50 && xpos<=150 && ypos >= 180 && ypos <=280))
          || (player2History[4] && (xpos >=250 && xpos<=350 && ypos >= 180 && ypos <=280)) || (player2History[5] && (xpos >=490 && xpos<=590 && ypos >= 180 && ypos <=280))
          || (player2History[6] && (xpos >=50 && xpos<=150 && ypos >= 330 && ypos <=430)) || (player2History[7] && (xpos >=250 && xpos<=350 && ypos >= 330 && ypos <=430))
          || (player2History[8] && (xpos >=490 && xpos<=590 && ypos >= 330 && ypos <=430)));

end 

 assign red = (grid || player1 );
 assign green = (grid || player2);
 assign blue = (grid );

endmodule

Как я могу решить эти предупреждения?

WARNING:Xst:2211 - "grid.v" line 104: Instantiating black box module <dummyModule>.
WARNING:Xst:1710 - FF/Latch <player2> (without init value) has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_0> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_1> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_2> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_3> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_4> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_5> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_6> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_7> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <player2History_8> has a constant value of 0 in block <Grid_Display>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2036 - Inserting OBUF on port <led> driven by black box <dummyModule>. Possible simulation mismatch.

С Уважением


person Naruto    schedule 15.05.2013    source источник
comment
-1 за то, что вывалил на нас тонну кода и вывод компилятора, не продемонстрировав собственных честных усилий. Пожалуйста, сузьте свой вопрос до наименьшего примера, который воспроизводит вашу проблему. Будь ВЕТСМОД.   -  person Philippe    schedule 15.05.2013


Ответы (1)


Все ваши предупреждения об обрезке FF/Latch в основном сводятся к тому, что player2History всегда равен 0, и поэтому он оптимизируется.

Не похоже, что он всегда должен быть равен 0, но это оказывается правдой из-за интересного побочного эффекта того факта, что вы использовали неправильный тип блокирующих операторов.

Проблема в этих двух строках в вашем всегда блоке:

always @(posedge clk25) begin
 player1History=  button ^ player2History;
 player2History=  button ^ player1History;

Затем ваша логика оценивается следующим образом:

  1. В начале времени player2History (p2h) равен нулю.
  2. Предположим, что на некоторых часах кнопка не равна нулю. В этот момент p2h все еще равен нулю, поэтому p1h = button ^ 0 просто означает, что p1h присваивается значение кнопки.
  3. Теперь вычисляется следующий оператор, и вы вычисляете button ^ p1h, но поскольку мы только что присвоили p1h = button, вы действительно оцениваете button ^ button, который, как мы знаем, всегда равен 0.
  4. Поскольку в этом случае невозможно, чтобы p2h когда-либо был ненулевым, флопы были удалены из вашего проекта.

Вероятно, вы намеревались сделать p1h и p2h неблокирующими присваиваниями с помощью оператора <=. Когда вы используете неблокировку, это означает, что оба оператора оцениваются параллельно, поэтому и p1h, и p2h оцениваются по своим старым значениям вместо того, чтобы сначала вычислять первую строку, а затем использовать этот результат во второй строке.

Понимание разницы между блокирующими и неблокирующими операторами очень важно в Verilog, и если вы не понимаете концепцию или когда их использовать, вам следует искать дополнительные учебные материалы.

person Tim    schedule 15.05.2013